From 21027e84d5954026f4463a401d247c142c932466 Mon Sep 17 00:00:00 2001 From: arnesom Date: Sun, 5 Dec 2021 17:14:16 +0100 Subject: Arne Sommer --- challenge-141/arne-sommer/blog.txt | 1 + challenge-141/arne-sommer/raku/ch-1.raku | 23 ++++++++++++++++ challenge-141/arne-sommer/raku/ch-2.raku | 30 +++++++++++++++++++++ challenge-141/arne-sommer/raku/like-numbers | 31 ++++++++++++++++++++++ challenge-141/arne-sommer/raku/like-numbers-bitmap | 30 +++++++++++++++++++++ .../arne-sommer/raku/like-numbers-bitmap2 | 30 +++++++++++++++++++++ challenge-141/arne-sommer/raku/number-divisors | 23 ++++++++++++++++ 7 files changed, 168 insertions(+) create mode 100644 challenge-141/arne-sommer/blog.txt create mode 100755 challenge-141/arne-sommer/raku/ch-1.raku create mode 100755 challenge-141/arne-sommer/raku/ch-2.raku create mode 100755 challenge-141/arne-sommer/raku/like-numbers create mode 100755 challenge-141/arne-sommer/raku/like-numbers-bitmap create mode 100755 challenge-141/arne-sommer/raku/like-numbers-bitmap2 create mode 100755 challenge-141/arne-sommer/raku/number-divisors diff --git a/challenge-141/arne-sommer/blog.txt b/challenge-141/arne-sommer/blog.txt new file mode 100644 index 0000000000..0d23292007 --- /dev/null +++ b/challenge-141/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/numbly-numbers.html diff --git a/challenge-141/arne-sommer/raku/ch-1.raku b/challenge-141/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..1a6119c13c --- /dev/null +++ b/challenge-141/arne-sommer/raku/ch-1.raku @@ -0,0 +1,23 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $limit = 8, :v(:$verbose)); + +my $eight-divisors := (1..Inf).grep({ divisors($_).elems == 8 }); + +say $eight-divisors[^$limit].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 has { @divisors.elems } divisors: { @divisors.join(", ") }" if $verbose; + + return @divisors; +} diff --git a/challenge-141/arne-sommer/raku/ch-2.raku b/challenge-141/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..3093339152 --- /dev/null +++ b/challenge-141/arne-sommer/raku/ch-2.raku @@ -0,0 +1,30 @@ +#! /usr/bin/env raku + +subset PosInt of Int where * >= 1; + +unit sub MAIN (PosInt $m, PosInt $n, :v(:$verbose)); + +my $size = $m.chars; +my $upto = 2 ** $size - 1; + +say ": Bitmap: { $upto.fmt('%b') }" if $verbose; + +my @candidates; + +for 1 .. $upto -> $mask +{ + my $bitmap = $mask.fmt('%0' ~ $size ~ 'b'); + + my $value = $m.comb.grep({ state $index = 0; $bitmap.substr($index++,1) > 0 }).join; + + say ": Candidate: $m AND $bitmap -> $value" if $verbose; + + @candidates.push: $value unless $value.chars == $size; +} + +my @divisible = @candidates.grep( * %% $n ); + +say ": Candidates: { @candidates.join(", ") }" if $verbose; +say ": Divisibles: { @divisible.join(", ") }" if $verbose; + +say @divisible.elems; diff --git a/challenge-141/arne-sommer/raku/like-numbers b/challenge-141/arne-sommer/raku/like-numbers new file mode 100755 index 0000000000..d9174bb046 --- /dev/null +++ b/challenge-141/arne-sommer/raku/like-numbers @@ -0,0 +1,31 @@ +#! /usr/bin/env raku + +subset PosInt of Int where * >= 1; + +unit sub MAIN (PosInt $m, PosInt $n, :v(:$verbose)); + +my $seq := gather { recurse("", $m.comb); } + +my %seen; + +sub recurse($done, @todo is copy) +{ + unless %seen{$done} + { + take $done if 1 <= $done.chars < $m.chars; + %seen{$done} = True; + } + + return unless @todo; + my $next = @todo.shift; + recurse($done ~ $next, @todo); + recurse($done, @todo); +} + +my @candidates = $seq; +my @divisible = @candidates.grep( * %% $n ); + +say ": Candidates: { @candidates.join(", ") }" if $verbose; +say ": Divisibles: { @divisible.join(", ") }" if $verbose; + +say @divisible.elems; diff --git a/challenge-141/arne-sommer/raku/like-numbers-bitmap b/challenge-141/arne-sommer/raku/like-numbers-bitmap new file mode 100755 index 0000000000..d5578099c8 --- /dev/null +++ b/challenge-141/arne-sommer/raku/like-numbers-bitmap @@ -0,0 +1,30 @@ +#! /usr/bin/env raku + +subset PosInt of Int where * >= 1; + +unit sub MAIN (PosInt $m, PosInt $n, :v(:$verbose)); + +my $size = $m.chars; +my $upto = 2 ** $size - 1; + +say ": Bitmap: { $upto.fmt('%b') }" if $verbose; + +my @candidates; + +for 1 .. $upto -> $mask +{ + my $bitmap = $mask.fmt('%0' ~ $size ~ 'b'); + + my $value = ($bitmap.comb Z $m.comb).grep({ $^a[0] > 0})>>.reduce({ $^a * $^b }).join; + + say ": Candidate: $m AND $bitmap -> $value" if $verbose; + + @candidates.push: $value unless $value.chars == $size; +} + +my @divisible = @candidates.grep( * %% $n ); + +say ": Candidates: { @candidates.join(", ") }" if $verbose; +say ": Divisibles: { @divisible.join(", ") }" if $verbose; + +say @divisible.elems; diff --git a/challenge-141/arne-sommer/raku/like-numbers-bitmap2 b/challenge-141/arne-sommer/raku/like-numbers-bitmap2 new file mode 100755 index 0000000000..3093339152 --- /dev/null +++ b/challenge-141/arne-sommer/raku/like-numbers-bitmap2 @@ -0,0 +1,30 @@ +#! /usr/bin/env raku + +subset PosInt of Int where * >= 1; + +unit sub MAIN (PosInt $m, PosInt $n, :v(:$verbose)); + +my $size = $m.chars; +my $upto = 2 ** $size - 1; + +say ": Bitmap: { $upto.fmt('%b') }" if $verbose; + +my @candidates; + +for 1 .. $upto -> $mask +{ + my $bitmap = $mask.fmt('%0' ~ $size ~ 'b'); + + my $value = $m.comb.grep({ state $index = 0; $bitmap.substr($index++,1) > 0 }).join; + + say ": Candidate: $m AND $bitmap -> $value" if $verbose; + + @candidates.push: $value unless $value.chars == $size; +} + +my @divisible = @candidates.grep( * %% $n ); + +say ": Candidates: { @candidates.join(", ") }" if $verbose; +say ": Divisibles: { @divisible.join(", ") }" if $verbose; + +say @divisible.elems; diff --git a/challenge-141/arne-sommer/raku/number-divisors b/challenge-141/arne-sommer/raku/number-divisors new file mode 100755 index 0000000000..1a6119c13c --- /dev/null +++ b/challenge-141/arne-sommer/raku/number-divisors @@ -0,0 +1,23 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $limit = 8, :v(:$verbose)); + +my $eight-divisors := (1..Inf).grep({ divisors($_).elems == 8 }); + +say $eight-divisors[^$limit].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 has { @divisors.elems } divisors: { @divisors.join(", ") }" if $verbose; + + return @divisors; +} -- cgit