From ad1757a7ef987f1a3fb80d992893a9ac6f19293f Mon Sep 17 00:00:00 2001 From: arnesom Date: Mon, 4 Jul 2022 00:06:42 +0200 Subject: Arne Sommer --- challenge-171/arne-sommer/blog.txt | 1 + challenge-171/arne-sommer/raku/abundant-number | 27 +++++++++++++++++++ challenge-171/arne-sommer/raku/ch-1.raku | 27 +++++++++++++++++++ challenge-171/arne-sommer/raku/ch-2.raku | 31 ++++++++++++++++++++++ .../arne-sommer/raku/first-class-function | 31 ++++++++++++++++++++++ 5 files changed, 117 insertions(+) create mode 100644 challenge-171/arne-sommer/blog.txt create mode 100755 challenge-171/arne-sommer/raku/abundant-number create mode 100755 challenge-171/arne-sommer/raku/ch-1.raku create mode 100755 challenge-171/arne-sommer/raku/ch-2.raku create mode 100755 challenge-171/arne-sommer/raku/first-class-function 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); + + -- cgit