Advent Calendar 2022
| Day 6 | Day 7 | Day 8 |
The gift is presented by Simon Green
. Today he is talking about his solution to “The Weekly Challenge - 157”. This is re-produced for Advent Calendar 2022 from the original post by him.
Weekly Challenge 157
I’m back after the three week hiatus!
[Challenge]
[My solution]
TASK #1 › Pythagorean Means
You are given a set of integers.
Write a script to compute all three Pythagorean Means i.e Arithmetic Mean
, Geometric Mean
and Harmonic Mean
of the given set of integers.
My solution
This is a relatively straight forward task. The Wikipedia
page provides the necessary formulas and we can use the sum
, reduce
and lambda
functions to calculate the required figures. Finally we use the round
function to print the results to one decimal place.
The Perl
code is similar to the Python
version, except we use the product()
method in List::Utils
. Python
's math.product
is only available for Python 3.8+
One thing to note is if the sum of integers is 0
, a division by zero error
might occur when calculating the harmonic mean. I’m not catching this and let the error pass to the user.
Examples
$ ./ch-1.py 1 3 5 6 9
AM = 4.8, GM = 3.8, HM = 2.8
$ ./ch-1.py 2 4 6 8 10
AM = 6.0, GM = 5.2, HM = 4.4
$ ./ch-1.py 1 2 3 4 5
AM = 3.0, GM = 2.6, HM = 2.2
TASK #2 › Brazilian Number
You are given a number $n > 3
.
Write a script to find out if the given number is a Brazilian Number
. A positive integer number N
has at least one natural number B
where 1 < B < N-1
where the representation of N
in base B
has [the] same digits.
My solution
This was an interesting task. We can’t convert numbers into a different base simply by using letters and numbers. For example 1282
is 22
in base 640
, but how would you express 639
in the same base?
For this task I considered a value having the same digits even if the number itself has different digits. For example, 925
is express as (25)(25)
in base 36
.
The guts of this task is to convert the number n in base 10
to a specified base
, which I have called b
. The function is called same_digits
. I take the modulus (remainder) of n
and b
and make this value d
. I then do an integer division and repeat this process comparing that n % b
is d
. I return False
if any digit isn’t the same, or True
if they all are.
Then it’s just a matter of having a loop from 2
to n - 2
, and calling the same_digits
function for each base. If there is a match, I print 1
(and the base), or 0
otherwise.
The Perl
code is a transliteration of the Python
code.
Examples
$ ./ch-2.py 6
0
$ ./ch-2.py 7
1 (base 2)
$ ./ch-2.py 8
1 (base 3)
If you have any suggestion then please do share with us perlweeklychallenge@yahoo.com.