diff options
Diffstat (limited to 'challenge-191/e-choroba/perl/ch-2.pl')
| -rwxr-xr-x | challenge-191/e-choroba/perl/ch-2.pl | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/challenge-191/e-choroba/perl/ch-2.pl b/challenge-191/e-choroba/perl/ch-2.pl new file mode 100755 index 0000000000..fba3364be5 --- /dev/null +++ b/challenge-191/e-choroba/perl/ch-2.pl @@ -0,0 +1,42 @@ +#! /usr/bin/perl +use warnings; +use strict; +use experimental qw( signatures ); + +use Memoize; + +memoize('_cute_list', NORMALIZER => sub { "$_[0] @{ $_[1] }" }); +sub cute_list ($n) { + _cute_list(1, [1 .. $n]); +} + +sub are_divisible ($m, $n) { 0 == $m % $n || 0 == $n % $m } + +sub _cute_list ($pos, $list) { + return are_divisible($pos, $list->[0]) ? 1 : 0 if 1 == @$list; + + my $sum = 0; + for my $i (0 .. $#$list) { + $sum += _cute_list($pos + 1, [@$list[grep $_ != $i, 0 .. $#$list]]) + if are_divisible($pos, $list->[$i]); + } + return $sum +} + +use Test::More tests => 1 + 14; +is cute_list(2), 2, 'Example 1'; + +is cute_list(1), 1, 'Size 1'; +is cute_list(3), 3, 'Size 3'; +is cute_list(4), 8, 'Size 4'; +is cute_list(5), 10, 'Size 5'; +is cute_list(6), 36, 'Size 6'; +is cute_list(7), 41, 'Size 7'; +is cute_list(8), 132, 'Size 8'; +is cute_list(9), 250, 'Size 9'; +is cute_list(10), 700, 'Size 10'; +is cute_list(11), 750, 'Size 11'; +is cute_list(12), 4010, 'Size 12'; +is cute_list(13), 4237, 'Size 13'; +is cute_list(14), 10680, 'Size 14'; +is cute_list(15), 24679, 'Max'; |
