Perl Weekly Challenge 65: Digit Sum
These are some answers to the Week 65 of the Perl Weekly Challenge organized by Mohammad S. Anwar.
You are given two positive numbers $N
and $S
.
Write a script to list all positive numbers having exactly $N
digits where sum of all digits equals to $S
.
Example:
Input:
$N = 2
$S = 4
Output:
13, 22, 31, 40
Digit Sum in Raku
My first attempt to solve the problem would be a pure brute force approach as follows:
use v6;
sub MAIN (Int $nb_digits, Int $sum) {
for 10 ** ($nb_digits - 1) .. 10 ** $nb_digits - 1 -> $num {
say $num if $num.comb.sum == $sum;
}
}
We’re just checking every number in the range.
A slight performance improvement is possible:
use v6;
sub MAIN (Int $nb_digits, Int $sum) {
my $max = -1 + $sum <= 9
?? $sum * 10 ** ($nb_digits -1)
!! 10 ** $nb_digits;
for 10 ** ($nb_digits - 1) .. $max -> $num {
say $num if $num.comb.sum == $sum;
}
}
This is an example output:
$ ./perl6 digit-sum.p6 3 6
105
114
123
132
141
150
204
213
222
231
240
303
312
321
330
402
411
420
501
510
600
Digit Sum in Perl
This is a port to Perl of the above Raku program:
use strict;
use warnings;
use feature qw /say/;
sub sum {
my $sum_digits = 0;
$sum_digits += $_ for split //, shift;
return $sum_digits;
}
my ($nb_digits, $sum) = @ARGV;
for my $num (10 ** ($nb_digits - 1) .. 10 ** $nb_digits - 1 ) {
say $num if $sum == sum $num;
}
Wrapping up
Note: there was another task in this challenge, but I was extremely busy the whole weekend and did not have time to work on it. This is also the reason why I am publishing this blog post so late. However, task 2 seems interesting, I might come back to it this week if I have more time.
The next week Perl Weekly Challenge has already started. 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 Sunday, June 28, 2020. And, please, also spread the word about the Perl Weekly Challenge if you can.
Leave a comment