diff options
| -rw-r--r-- | challenge-020/adam-russell/perl6/ch-1.rk | 16 | ||||
| -rw-r--r-- | challenge-020/adam-russell/perl6/ch-2.rk | 43 |
2 files changed, 59 insertions, 0 deletions
diff --git a/challenge-020/adam-russell/perl6/ch-1.rk b/challenge-020/adam-russell/perl6/ch-1.rk new file mode 100644 index 0000000000..f0d6dc2faa --- /dev/null +++ b/challenge-020/adam-russell/perl6/ch-1.rk @@ -0,0 +1,16 @@ +## +# Write a script to accept a string from command line and split it on change of character. +## +my $string = @*ARGS[0]; +my @letters = split(/""/, $string); +my $letter; +@letters.shift(); +my $letter_previous = @letters.shift(); +repeat { + $letter = @letters.shift(); + print $letter_previous if ($letter eq $letter_previous); + print "$letter_previous\n" if ($letter ne $letter_previous); + $letter_previous = $letter; +}while (@letters); +print $letter_previous if ($letter eq $letter_previous); +print "$letter_previous\n" if ($letter ne $letter_previous); diff --git a/challenge-020/adam-russell/perl6/ch-2.rk b/challenge-020/adam-russell/perl6/ch-2.rk new file mode 100644 index 0000000000..46e4329e8f --- /dev/null +++ b/challenge-020/adam-russell/perl6/ch-2.rk @@ -0,0 +1,43 @@ +constant RANGE_SIZE = 50; +sub factor-sum(@numbers){ + my %number_sof; + for @numbers -> $n { + my @factors = (1); + for (2 .. sqrt($n)) -> $j { + @factors.push($j) if $n %% $j; + @factors.push($n / $j) if $n %% $j && $j ** 2 != $n; + } + my $sum = [+] @factors; + %number_sof{$n} = $sum; + } + return %number_sof; +} +my $range_start = 1; +my $range_end = RANGE_SIZE; +my $found = Bool::False; +my %number_sof; +my @promises; +while (!$found) { + @promises = (); + for (0 .. 3) { + @promises.push(Promise.start( { + factor-sum($range_start .. $range_end); + })); + $range_start = $range_end + 1; + $range_end = $range_start + RANGE_SIZE; + } + await(|@promises); + for @promises -> $p { + %number_sof{ keys $p.result} = values $p.result; + for (values $p.result) -> $k { + if (%number_sof{$k}) { + if (%number_sof{%number_sof{$k}} && + %number_sof{%number_sof{$k}} == $k && + %number_sof{$k} != $k && !$found) { + say "First amicable pair of numbers: $k " ~ %number_sof{$k}; + $found = Bool::True; + } + } + } + } +} |
