I’ve been doing the Weekly
Challenges. The
latest
involved digit sums and progressive multiplication. (Note that this
ends today.)
Task 1: Element Digit Sum
You are given an array of integers, @ints.
Write a script to evaluate the absolute difference between element
and digit sum of the given array.
For example, 1, 2, 3, 45
differs in that the digit sum of 45 is 9,
so the result is 36.
So the obvious approach would be to work out the element sum of the
list, and the digit sum of the list. But it occurred to me that there
was an easier, or at least a more enjoyable, way to do it.
Considering each element:
-
If there's only one digit, we can ignore it.
-
If there are two digits, say yx
, then we can ignore the x
, and
the contribution to the total difference will be y × 9
.
-
If there's a third digit, so it's zyx
, the difference contributed
by the first place will be z × 99
.
(And the original value will never be less than the digit sum.)
Therefore in Python:
def elementdigitsum(a):
delta = 0
for n0 in a:
We'll never care about the final digit.
n = n0 // 10
Set a multiplier term.
m = 10
While we have some non-zero digits:
while n > 0:
Add the contribution of the last one.
delta += (n % 10) * (m - 1)
Divide, increase the multiplier, and continue.
n //= 10
m *= 10
return delta
The other languages work basically identically.
Task 2: Multiply by Two
You are given an array of integers, @ints
and an integer $start
.
Write a script to do the followings: a) Look for $start
in the
array @ints
, if found multiply the number by 2 b) If not found
stop the process otherwise repeat
In the end return the final value.
Which seems to me quite readily expressed as: "while the value is in
the list, double it and start again". In Raku:
sub multiplybytwo(@a, $start) {
Build a set of the values in @ints
.
my %p = Set(@a);
Set the result to the initial value.
my $v = $start;
Loop while that value is in the list.
while (%p{$v}:exists) {
And double it.
$v *= 2;
}
return $v;
}
In PostScript we can do it with just one variable, without straining
understanding terribly hard.
/multiplybytwo {
0 dict begin
exch
/p exch toset def
{
dup p exch known {
2 mul
} {
exit
} ifelse
} loop
end
} bind def
Full code on
github.
Comments on this post are now closed. If you have particular grounds for adding a late comment, comment on a more recent post quoting the URL of this one.