diff options
| -rw-r--r-- | challenge-171/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-171/arne-sommer/raku/abundant-number | 27 | ||||
| -rwxr-xr-x | challenge-171/arne-sommer/raku/ch-1.raku | 27 | ||||
| -rwxr-xr-x | challenge-171/arne-sommer/raku/ch-2.raku | 31 | ||||
| -rwxr-xr-x | challenge-171/arne-sommer/raku/first-class-function | 31 |
5 files changed, 117 insertions, 0 deletions
diff --git a/challenge-171/arne-sommer/blog.txt b/challenge-171/arne-sommer/blog.txt new file mode 100644 index 0000000000..ad24babe59 --- /dev/null +++ b/challenge-171/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/abundantly-first-class.html diff --git a/challenge-171/arne-sommer/raku/abundant-number b/challenge-171/arne-sommer/raku/abundant-number new file mode 100755 index 0000000000..b7e8b2c4e7 --- /dev/null +++ b/challenge-171/arne-sommer/raku/abundant-number @@ -0,0 +1,27 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int :c(:$count) where $count > 0 = 20, :v(:$verbose)); + +my $abundant := (1 .. Inf).grep( *.&is-abundant ); + +say $abundant[^$count].join(", "); + +sub divisors ($number, :$not-self, :$not-one) +{ + my @divisors; + + for ($not-one ?? 2 !! 1) .. $number/2 -> $candidate + { + @divisors.push: $candidate if $number %% $candidate; + } + + @divisors.push: $number unless $not-self; + say ": $number -> @divisors[] = { @divisors.sum }" if $verbose; + return @divisors; +} + +sub is-abundant ($number) +{ + return $number % 2 && divisors($number, :not-self).sum > $number; + # return $number % 2 && divisors($number).sum > $number * 2; +} diff --git a/challenge-171/arne-sommer/raku/ch-1.raku b/challenge-171/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..b7e8b2c4e7 --- /dev/null +++ b/challenge-171/arne-sommer/raku/ch-1.raku @@ -0,0 +1,27 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int :c(:$count) where $count > 0 = 20, :v(:$verbose)); + +my $abundant := (1 .. Inf).grep( *.&is-abundant ); + +say $abundant[^$count].join(", "); + +sub divisors ($number, :$not-self, :$not-one) +{ + my @divisors; + + for ($not-one ?? 2 !! 1) .. $number/2 -> $candidate + { + @divisors.push: $candidate if $number %% $candidate; + } + + @divisors.push: $number unless $not-self; + say ": $number -> @divisors[] = { @divisors.sum }" if $verbose; + return @divisors; +} + +sub is-abundant ($number) +{ + return $number % 2 && divisors($number, :not-self).sum > $number; + # return $number % 2 && divisors($number).sum > $number * 2; +} diff --git a/challenge-171/arne-sommer/raku/ch-2.raku b/challenge-171/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..1b20bfbba7 --- /dev/null +++ b/challenge-171/arne-sommer/raku/ch-2.raku @@ -0,0 +1,31 @@ +#! /usr/bin/env raku + +my $f = sub f ($val) +{ + return $val * 10; +} + +my $g = sub g ($val) +{ + return $val + 1; +} + +sub compose(&f, &g) +{ + return sub ($arg) + { + &f(&g($arg)); + }; +} + +my $h = compose($f, $g); + +say $h(12); +say $h(13); + +my $m = compose($g, $f); + +say $m(12); +say $m(13); + + diff --git a/challenge-171/arne-sommer/raku/first-class-function b/challenge-171/arne-sommer/raku/first-class-function new file mode 100755 index 0000000000..1b20bfbba7 --- /dev/null +++ b/challenge-171/arne-sommer/raku/first-class-function @@ -0,0 +1,31 @@ +#! /usr/bin/env raku + +my $f = sub f ($val) +{ + return $val * 10; +} + +my $g = sub g ($val) +{ + return $val + 1; +} + +sub compose(&f, &g) +{ + return sub ($arg) + { + &f(&g($arg)); + }; +} + +my $h = compose($f, $g); + +say $h(12); +say $h(13); + +my $m = compose($g, $f); + +say $m(12); +say $m(13); + + |
