diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-12-05 17:14:40 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-05 17:14:40 +0000 |
| commit | 45482cf9bd6d50531ee447b2ea87052471178e0f (patch) | |
| tree | d7f2542494b1b55fe914797cc561b700e3ac2560 | |
| parent | 9936ebffa929fe5dcf0e816a8f1a347037eaa2de (diff) | |
| parent | 21027e84d5954026f4463a401d247c142c932466 (diff) | |
| download | perlweeklychallenge-club-45482cf9bd6d50531ee447b2ea87052471178e0f.tar.gz perlweeklychallenge-club-45482cf9bd6d50531ee447b2ea87052471178e0f.tar.bz2 perlweeklychallenge-club-45482cf9bd6d50531ee447b2ea87052471178e0f.zip | |
Merge pull request #5330 from arnesom/branch-for-challenge-141
Arne Sommer
| -rw-r--r-- | challenge-141/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-141/arne-sommer/raku/ch-1.raku | 23 | ||||
| -rwxr-xr-x | challenge-141/arne-sommer/raku/ch-2.raku | 30 | ||||
| -rwxr-xr-x | challenge-141/arne-sommer/raku/like-numbers | 31 | ||||
| -rwxr-xr-x | challenge-141/arne-sommer/raku/like-numbers-bitmap | 30 | ||||
| -rwxr-xr-x | challenge-141/arne-sommer/raku/like-numbers-bitmap2 | 30 | ||||
| -rwxr-xr-x | challenge-141/arne-sommer/raku/number-divisors | 23 |
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; +} |
