# Perl Weekly Challenge 261.

My solutions (task 1 and task 2 ) to the The Weekly Challenge - 261.

# Task 1: Element Digit Sum

``````Submitted by: Mohammad Sajid Anwar
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 just follow the instructions, using `split` to get the individual digits and `sum0` from `List::Util` to sum all the numbers. This yields a half liner:

``````perl -MList::Util=sum0 -E 'say "@ARGV -> ", sum0 map {\$_-sum0 split""} @ARGV;' 1 2 3 45
``````

Results:

``````1 2 3 45 -> 36

perl -MList::Util=sum0 -E 'say "@ARGV -> ", sum0 map {\$_-sum0 split""} @ARGV;' 1 12 3
``````

Results:

``````1 12 3 -> 9

perl -MList::Util=sum0 -E 'say "@ARGV -> ", sum0 map {\$_-sum0 split""} @ARGV;' 1 2 3 4
``````

Results:

``````1 2 3 4 -> 0

perl -MList::Util=sum0 -E 'say "@ARGV -> ", sum0 map {\$_-sum0 split""} @ARGV;' 236 416 336 350
``````

Results:

``````236 416 336 350 -> 1296
``````

The corresponding full code follows:

`````` 1  # Perl weekly challenge 261
2  # Task 1:  Element Digit Sum
3  #
5  use v5.36;
6  use List::Util qw(sum0);
7  die <<~"FIN" unless @ARGV;
8      usage: \$0 N1 [N2...]
9      to find the diference between the sum of the numbers N1+N2+...
10      and the sum of their digits
11      FIN
12  say "@ARGV -> ", sum0 map {\$_-sum0 split""} @ARGV;
``````

Example:

``````./ch-1.pl 1 2 3 45
./ch-1.pl 1 12 3
./ch-1.pl 1 2 3 4
./ch-1.pl 236 416 336 350
``````

Results:

``````1 2 3 45 -> 36
1 12 3 -> 9
1 2 3 4 -> 0
236 416 336 350 -> 1296
``````

# Task 2: Multiply by Two

``````Submitted by: Mohammad Sajid Anwar
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
In the end return the final value.

Example 1
Input: @ints = (5,3,6,1,12) and \$start = 3
Output: 24

Step 1: 3 is in the array so 3 x 2 = 6
Step 2: 6 is in the array so 6 x 2 = 12
Step 3: 12 is in the array so 12 x 2 = 24

Example 2
Input: @ints = (1,2,4,3) and \$start = 1
Output: 8

Step 1: 1 is in the array so 1 x 2 = 2
Step 2: 2 is in the array so 2 x 2 = 4
Step 3: 4 is in the array so 4 x 2 = 8

Example 3
Input: @ints = (5,6,7) and \$start = 2
Output: 2

``````

I use `first` from `List::Util` to find if the desired number is in the list. This yields a one-liner.

``````perl -MList::Util=first -E '
(\$s, @i)=@ARGV; print "Start=\$s, ints=@i -> "; \$s*=2 while defined first {\$_==\$s} @i; say \$s' 3 5 3 6 1 12
``````

Results:

``````Start=3, ints=5 3 6 1 12 -> 24

perl -MList::Util=first -E '
(\$s, @i)=@ARGV; print "Start=\$s, ints=@i -> "; \$s*=2 while defined first {\$_==\$s} @i; say \$s' 1 1 2 4 3
``````

Results:

``````Start=1, ints=1 2 4 3 -> 8

perl -MList::Util=first -E '
(\$s, @i)=@ARGV; print "Start=\$s, ints=@i -> "; \$s*=2 while defined first {\$_==\$s} @i; say \$s' 2 5 6 7
``````

Results:

``````Start=2, ints=5 6 7 -> 2
``````

The full code is:

`````` 1  # Perl weekly challenge 261
2  # Task 2:  Multiply by Two
3  #
5  use v5.36;
6  use List::Util qw(first);
7  die <<~"FIN" unless @ARGV >= 2;
8      Usage: \$0 S N1 [N2...]
9      to find the smallest number S*2^n that is not in the list N1 N2...
10      FIN
11  my (\$start, @ints)=@ARGV;
12  print "Start=\$start, ints=@ints -> ";
13  \$start *= 2 while defined first {\$_==\$start} @ints;
14  say \$start;
``````

Example:

``````./ch-2.pl 3 5 3 6 1 12
./ch-2.pl 1 1 2 4 3
./ch-2.pl 2 5 6 7
``````

Results:

``````Start=3, ints=5 3 6 1 12 -> 24
Start=1, ints=1 2 4 3 -> 8
Start=2, ints=5 6 7 -> 2
``````

/;

Written on March 18, 2024