aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarnesom <arne@bbop.org>2021-12-05 17:14:16 +0100
committerarnesom <arne@bbop.org>2021-12-05 17:14:16 +0100
commit21027e84d5954026f4463a401d247c142c932466 (patch)
tree71163d5c71fc34cea93d34016429ea0bdf3825d0
parente4b1faea54e0c95cf12f5803192b9c030e5b007e (diff)
downloadperlweeklychallenge-club-21027e84d5954026f4463a401d247c142c932466.tar.gz
perlweeklychallenge-club-21027e84d5954026f4463a401d247c142c932466.tar.bz2
perlweeklychallenge-club-21027e84d5954026f4463a401d247c142c932466.zip
Arne Sommer
-rw-r--r--challenge-141/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-141/arne-sommer/raku/ch-1.raku23
-rwxr-xr-xchallenge-141/arne-sommer/raku/ch-2.raku30
-rwxr-xr-xchallenge-141/arne-sommer/raku/like-numbers31
-rwxr-xr-xchallenge-141/arne-sommer/raku/like-numbers-bitmap30
-rwxr-xr-xchallenge-141/arne-sommer/raku/like-numbers-bitmap230
-rwxr-xr-xchallenge-141/arne-sommer/raku/number-divisors23
7 files changed, 168 insertions, 0 deletions
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;
+}