Perl Weekly Challenge 261: Element Digit Sum
These are some answers to the Week 261, Task 1, of the Perl Weekly Challenge organized by Mohammad S. Anwar.
Spoiler Alert: This weekly challenge deadline is due in a couple of days from now (on March 24, 2024 at 23:59). This blog post provides some solutions to this challenge. Please don’t read on if you intend to complete the challenge on your own.
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.
Example 1
Input: @ints = (1,2,3,45)
Output: 36
Element Sum: 1 + 2 + 3 + 45 = 51
Digit Sum: 1 + 2 + 3 + 4 + 5 = 15
Absolute Difference: | 51 - 15 | = 36
Example 2
Input: @ints = (1,12,3)
Output: 9
Element Sum: 1 + 12 + 3 = 16
Digit Sum: 1 + 1 + 2 + 3 = 7
Absolute Difference: | 16 - 7 | = 9
Example 3
Input: @ints = (1,2,3,4)
Output: 0
Element Sum: 1 + 2 + 3 + 4 = 10
Digit Sum: 1 + 2 + 3 + 4 = 10
Absolute Difference: | 10 - 10 | = 0
Example 4
Input: @ints = (236, 416, 336, 350)
Output: 1296
I'm not sure we need to use the absolute value of the difference, as I think the element sum will never be less than the digit sum, but it doesn't hurt using it.
Element Digit Sum in Raku
Using the Raku built-in sum
, comb
, and flat
, methods leads to a simple one-liner solution.
sub element-digit-sum (@in) {
return (@in.sum - @in.map({.comb}).flat.sum).abs;
}
my @tests = <1 2 3 45>, <1 12 3>, <1 2 3 4>, <236 416 336 350>;
for @tests -> @test {
printf "%-20s => ", "@test[]";
say element-digit-sum @test;
}
This program displays the following output:
$ raku ./element-digit-sum.raku
1 2 3 45 => 36
1 12 3 => 9
1 2 3 4 => 0
236 416 336 350 => 1296
Element Digit Sum in Perl
This is a port to Perl of the above Raku program. The only significant change is that we had to implement our own sum
subroutine.
use strict;
use warnings;
use feature 'say';
sub sum {
my $sum = 0;
$sum += $_ for @_;
return $sum;
}
sub element_digit_sum {
my @in = @_;
return abs(sum (@in) - sum (map {split //, $_} @in));
}
my @tests = ( [<1 2 3 45>], [<1 12 3>], [<1 2 3 4>],
[<236 416 336 350>] );
for my $test (@tests) {
printf "%-20s => ", "@$test";
say element_digit_sum @$test;
}
This program displays the following output:
$ perl ./element-digit-sum.pl
1 2 3 45 => 36
1 12 3 => 9
1 2 3 4 => 0
236 416 336 350 => 1296
Wrapping up
The next week Perl Weekly Challenge will start soon. If you want to participate in this challenge, please check https://perlweeklychallenge.org/ and make sure you answer the challenge before 23:59 BST (British summer time) on March 31, 2024. And, please, also spread the word about the Perl Weekly Challenge if you can.
Leave a comment