From 746e3bbb14728b954c2ad4985883bae360de7245 Mon Sep 17 00:00:00 2001 From: Simon Proctor Date: Wed, 7 Aug 2019 18:56:36 +0100 Subject: Challenge 20 all done. --- challenge-020/simon-proctor/perl6/ch-1.p6 | 14 ++++++++++++ challenge-020/simon-proctor/perl6/ch-2.p6 | 37 +++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 challenge-020/simon-proctor/perl6/ch-1.p6 create mode 100644 challenge-020/simon-proctor/perl6/ch-2.p6 diff --git a/challenge-020/simon-proctor/perl6/ch-1.p6 b/challenge-020/simon-proctor/perl6/ch-1.p6 new file mode 100644 index 0000000000..b3cc956bd6 --- /dev/null +++ b/challenge-020/simon-proctor/perl6/ch-1.p6 @@ -0,0 +1,14 @@ +#!/usr/bin/env perl6 + +use v6; + +multi sub MAIN ( Bool :h(:$help) where so * ) { + say $*USAGE; +} + +#| Takes a string and outputs it broken into sets of the same character +multi sub MAIN ( Str $input is copy ) { + while my $m = $input ~~ s!^$=((.)$0*)!! { + $m.Str.say; + } +} \ No newline at end of file diff --git a/challenge-020/simon-proctor/perl6/ch-2.p6 b/challenge-020/simon-proctor/perl6/ch-2.p6 new file mode 100644 index 0000000000..614abab055 --- /dev/null +++ b/challenge-020/simon-proctor/perl6/ch-2.p6 @@ -0,0 +1,37 @@ +#!/usr/bin/env perl6 + +use v6; + + +multi sub MAIN ( Bool :h(:$help) where so * ) { + say $*USAGE; +} + +#|Given a starting number (default 0) find the first two Amicable numbers following it. +multi sub MAIN ( Int $start = 0 ) { + my $current = $start; + my $pair; + loop { + $current++; + $pair = first-pair( $current ); + last if $pair; + } + say "$pair, $current"; + +} + +sub first-pair( Int $number ) { + my $num-total = [+] divisors( $number ); + (1..^$number).first( + { + my $sum = [+] divisors( $_ ); + ($sum == $number && $num-total == $_) + } + ); +} + +sub divisors( Int $number ) is pure { + state @divs; + my $mid = $number div 2; + @divs[$number] //= (1..$mid).grep( $number %% * ).list; +} \ No newline at end of file -- cgit