# RogerBW's Blog

The Weekly Challenge 261: Two Elements Who Adore You 24 March 2024

I’ve been doing the Weekly Challenges. The latest involved digit sums and progressive multiplication. (Note that this ends today.)

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.

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.