Each week Mohammad S. Anwar sends out The Weekly Challenge, a chance for all of us to come up with solutions to two weekly tasks. My solutions are written in Python first, and then converted to Perl. It's a great way for us all to practice some coding.
Task 1: Unique Number
Task
You are given an array of integers, @ints
, where every elements appears more than once except one element.
Write a script to find the one element that appears exactly one time.
My solution
Both of this weeks challenges involves the frequency of integers. Python has the Counter function (from the collections module) that automatically converts a list of things into dict of frequencies. For the Perl solution, I do this by hand.
Once I have the freq
dict populated, I then find all integers that only appear once using list comprehension. This is stored in the variable once_only
. If there is one value in the list, I return it. Otherwise I will raise an appropriate error message.
def unique_number(ints: list) -> int:
freq = Counter(ints)
only_once = [i for i in freq if freq[i] == 1]
if len(only_once) == 1:
return only_once[0]
if len(only_once) == 0:
raise ValueError('No values only appear once')
raise ValueError('More than one value appears once')
Examples
$ ./ch-1.py 3 3 1
1
$ ./ch-1.py 3 2 4 2 4
3
$ ./ch-1.py 1
1
$ ./ch-1.py 4 3 1 1 1 4
3
Task 2: Digit Count Value
Task
You are given an array of positive integers, @ints
.
Write a script to return true if for every index i
in the range 0 <= i < size of array
, the digit i occurs exactly the $ints[$i]
times in the given array otherwise return false.
My solution
Like with the last task, I create dict (hash in Perl) called freq
to store the frequency of each integer. I then word through the list to check that the condition is meet with each value.
def digit_count_value(ints: list) -> bool:
freq = Counter(ints)
for idx, value in enumerate(ints):
if freq[idx] != value:
return False
return True
Examples
$ ./ch-2.py 1 2 1 0
true
$ ./ch-2.py 0 3 0
false
Top comments (0)