From 235303d97888fe34103a281eebfe9ff2076b56b8 Mon Sep 17 00:00:00 2001 From: arnesom Date: Sun, 17 Oct 2021 20:31:37 +0200 Subject: Arne Sommer --- challenge-134/arne-sommer/blog.txt | 1 + challenge-134/arne-sommer/perl/ch-1.pl | 32 +++++++++++++ challenge-134/arne-sommer/perl/ch-2.pl | 55 ++++++++++++++++++++++ .../arne-sommer/perl/distinct-terms-count-perl | 55 ++++++++++++++++++++++ .../arne-sommer/perl/pandigital-number-perl | 32 +++++++++++++ challenge-134/arne-sommer/raku/ch-1.raku | 20 ++++++++ challenge-134/arne-sommer/raku/ch-2.raku | 35 ++++++++++++++ .../arne-sommer/raku/distinct-terms-count | 35 ++++++++++++++ .../arne-sommer/raku/distinct-terms-count-twice | 34 +++++++++++++ challenge-134/arne-sommer/raku/pandigital-number | 20 ++++++++ .../arne-sommer/raku/pandigital-number-loop | 20 ++++++++ .../raku/pandigital-number-permutations | 16 +++++++ 12 files changed, 355 insertions(+) create mode 100644 challenge-134/arne-sommer/blog.txt create mode 100755 challenge-134/arne-sommer/perl/ch-1.pl create mode 100755 challenge-134/arne-sommer/perl/ch-2.pl create mode 100755 challenge-134/arne-sommer/perl/distinct-terms-count-perl create mode 100755 challenge-134/arne-sommer/perl/pandigital-number-perl create mode 100755 challenge-134/arne-sommer/raku/ch-1.raku create mode 100755 challenge-134/arne-sommer/raku/ch-2.raku create mode 100755 challenge-134/arne-sommer/raku/distinct-terms-count create mode 100755 challenge-134/arne-sommer/raku/distinct-terms-count-twice create mode 100755 challenge-134/arne-sommer/raku/pandigital-number create mode 100755 challenge-134/arne-sommer/raku/pandigital-number-loop create mode 100755 challenge-134/arne-sommer/raku/pandigital-number-permutations diff --git a/challenge-134/arne-sommer/blog.txt b/challenge-134/arne-sommer/blog.txt new file mode 100644 index 0000000000..0226a83c51 --- /dev/null +++ b/challenge-134/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/distinctly-pandigital.html diff --git a/challenge-134/arne-sommer/perl/ch-1.pl b/challenge-134/arne-sommer/perl/ch-1.pl new file mode 100755 index 0000000000..bbba169884 --- /dev/null +++ b/challenge-134/arne-sommer/perl/ch-1.pl @@ -0,0 +1,32 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; + +use Algorithm::Combinatorics 'permutations'; +use Array::Utils 'array_minus'; ## Debian/Ubuntu: libarray-utils-perl + +my $n = $ARGV[0] // 5; + +die "Postive integer only" unless $n =~ /^[1-9]\d*$/; + +my @result; + +my @base = (0 .. 9); + +LOOP: +for my $first (1 .. 9) +{ + my @first = ($first); + my @rest = array_minus(@base, @first); + + for my $permutation (permutations(\@rest)) + { + push(@result, ($first . join("", @$permutation))); + last LOOP if @result == $n; + } +} + +say join(", ", @result); + diff --git a/challenge-134/arne-sommer/perl/ch-2.pl b/challenge-134/arne-sommer/perl/ch-2.pl new file mode 100755 index 0000000000..8b3716356e --- /dev/null +++ b/challenge-134/arne-sommer/perl/ch-2.pl @@ -0,0 +1,55 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use Getopt::Long; +use List::Util 'uniq' ; +my $verbose = 0; + +GetOptions("verbose" => \$verbose); + +my $m = $ARGV[0] // 0; +my $n = $ARGV[1] // 0; + +die "Postive integer only" unless $m =~ /^[1-9]\d*$/; +die "Postive integer only" unless $n =~ /^[1-9]\d*$/; + +my @values; + +for my $row (1 .. $m) +{ + my @row = map { $_ * $row } 1.. $n; + push(@values, \@row); +} + +my $width = length($m * $n); +my $r_width = length($m); + +say ":Max width number: $width" if $verbose; +say ":Max width row ID: $r_width" if $verbose; + +say sprintf('%' . ( $width - 1 ) . "s", "x"), + " |", + join(" ", map { sprintf('%' . $width . "d", $_) } (1..$n)); + +say "-" x $r_width, "-+", "-" x ($n * ($width +1) ); + +my $i = 0; + +my @all; + +for my $row (@values) +{ + my @row = @$row; + push(@all, @row); + say sprintf('%' . $r_width . "d", ++$i) , + " |", + join(" ", map { sprintf('%' . $width . "d", $_) } @row); +} + +my @distinct = sort { $a <=> $b } uniq(@all); + +say ""; +say "Distinct Terms: ", join(", ", @distinct); +say "Count: " . @distinct; diff --git a/challenge-134/arne-sommer/perl/distinct-terms-count-perl b/challenge-134/arne-sommer/perl/distinct-terms-count-perl new file mode 100755 index 0000000000..8b3716356e --- /dev/null +++ b/challenge-134/arne-sommer/perl/distinct-terms-count-perl @@ -0,0 +1,55 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use Getopt::Long; +use List::Util 'uniq' ; +my $verbose = 0; + +GetOptions("verbose" => \$verbose); + +my $m = $ARGV[0] // 0; +my $n = $ARGV[1] // 0; + +die "Postive integer only" unless $m =~ /^[1-9]\d*$/; +die "Postive integer only" unless $n =~ /^[1-9]\d*$/; + +my @values; + +for my $row (1 .. $m) +{ + my @row = map { $_ * $row } 1.. $n; + push(@values, \@row); +} + +my $width = length($m * $n); +my $r_width = length($m); + +say ":Max width number: $width" if $verbose; +say ":Max width row ID: $r_width" if $verbose; + +say sprintf('%' . ( $width - 1 ) . "s", "x"), + " |", + join(" ", map { sprintf('%' . $width . "d", $_) } (1..$n)); + +say "-" x $r_width, "-+", "-" x ($n * ($width +1) ); + +my $i = 0; + +my @all; + +for my $row (@values) +{ + my @row = @$row; + push(@all, @row); + say sprintf('%' . $r_width . "d", ++$i) , + " |", + join(" ", map { sprintf('%' . $width . "d", $_) } @row); +} + +my @distinct = sort { $a <=> $b } uniq(@all); + +say ""; +say "Distinct Terms: ", join(", ", @distinct); +say "Count: " . @distinct; diff --git a/challenge-134/arne-sommer/perl/pandigital-number-perl b/challenge-134/arne-sommer/perl/pandigital-number-perl new file mode 100755 index 0000000000..bbba169884 --- /dev/null +++ b/challenge-134/arne-sommer/perl/pandigital-number-perl @@ -0,0 +1,32 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; + +use Algorithm::Combinatorics 'permutations'; +use Array::Utils 'array_minus'; ## Debian/Ubuntu: libarray-utils-perl + +my $n = $ARGV[0] // 5; + +die "Postive integer only" unless $n =~ /^[1-9]\d*$/; + +my @result; + +my @base = (0 .. 9); + +LOOP: +for my $first (1 .. 9) +{ + my @first = ($first); + my @rest = array_minus(@base, @first); + + for my $permutation (permutations(\@rest)) + { + push(@result, ($first . join("", @$permutation))); + last LOOP if @result == $n; + } +} + +say join(", ", @result); + diff --git a/challenge-134/arne-sommer/raku/ch-1.raku b/challenge-134/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..464ba5b3f6 --- /dev/null +++ b/challenge-134/arne-sommer/raku/ch-1.raku @@ -0,0 +1,20 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $n where $n > 0 = 5); + +my $pandigital-seq := gather +{ + my @base = 0 .. 9; + + for 1 .. 9 -> $first + { + my @rest = (@base (-) $first).keys.sort; + + for @rest.permutations -> @permutation + { + take ($first ~ @permutation.join); + } + } +} + +say $pandigital-seq[^$n].join(", "); diff --git a/challenge-134/arne-sommer/raku/ch-2.raku b/challenge-134/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..bcb307ae33 --- /dev/null +++ b/challenge-134/arne-sommer/raku/ch-2.raku @@ -0,0 +1,35 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $m where $m > 0, Int $n where $n > 0, :v($verbose)); + +my @values; + +for 1 .. $m -> $row +{ + @values.push: (1 .. $n).map({ $_ * $row }); +} + +# say ":", @values.raku; + +my $width = ($m * $n).chars; +my $r-width = ($m).chars; + +say ":Max width number: $width" if $verbose; +say ":Max width row ID: $r-width" if $verbose; + +say "x".fmt("%{$width-1}s"), " |", (1..$n).map({ $_.fmt("%{$width}d") }).join(" "); + +say "-" x $r-width, "-+", "-" x ($n * ($width +1) -1); + +for @values -> @row +{ + state $i = 0; + + say "{ (++$i).fmt("%{$r-width}d") } |", @row.map({ ($_).fmt("%{$width}d") }).join(" "); +} + +my @distinct = @values>>.List.flat.sort.squish; + +say ""; +say "Distinct Terms: { @distinct.join(", ") }"; +say "Count: { @distinct.elems }"; diff --git a/challenge-134/arne-sommer/raku/distinct-terms-count b/challenge-134/arne-sommer/raku/distinct-terms-count new file mode 100755 index 0000000000..bcb307ae33 --- /dev/null +++ b/challenge-134/arne-sommer/raku/distinct-terms-count @@ -0,0 +1,35 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $m where $m > 0, Int $n where $n > 0, :v($verbose)); + +my @values; + +for 1 .. $m -> $row +{ + @values.push: (1 .. $n).map({ $_ * $row }); +} + +# say ":", @values.raku; + +my $width = ($m * $n).chars; +my $r-width = ($m).chars; + +say ":Max width number: $width" if $verbose; +say ":Max width row ID: $r-width" if $verbose; + +say "x".fmt("%{$width-1}s"), " |", (1..$n).map({ $_.fmt("%{$width}d") }).join(" "); + +say "-" x $r-width, "-+", "-" x ($n * ($width +1) -1); + +for @values -> @row +{ + state $i = 0; + + say "{ (++$i).fmt("%{$r-width}d") } |", @row.map({ ($_).fmt("%{$width}d") }).join(" "); +} + +my @distinct = @values>>.List.flat.sort.squish; + +say ""; +say "Distinct Terms: { @distinct.join(", ") }"; +say "Count: { @distinct.elems }"; diff --git a/challenge-134/arne-sommer/raku/distinct-terms-count-twice b/challenge-134/arne-sommer/raku/distinct-terms-count-twice new file mode 100755 index 0000000000..306ef96859 --- /dev/null +++ b/challenge-134/arne-sommer/raku/distinct-terms-count-twice @@ -0,0 +1,34 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $m where $m > 0, Int $n where $n > 0, :v($verbose)); + +my $width = ($m * $n).chars; +my $r-width = ($m).chars; + +say ":Max width number: $width" if $verbose; +say ":Max width row ID: $r-width" if $verbose; + +say "x".fmt("%{$width-1}s"), " |", (1..$n).map({ $_.fmt("%{$width}d") }).join(" "); + +say "-" x $r-width, "-+", "-" x ($n * ($width +1) -1); + +for 1 .. $m -> $row +{ + say "{ $row.fmt("%{$r-width}d") } |", (1..$n).map({ ($row * $_).fmt("%{$width}d") }).join(" "); +} + +my @values; + +for 1 .. $m -> $row +{ + for 1 .. $n -> $col + { + @values.push: $row * $col; + } +} + +my @distinct = @values.sort.squish; + +say ""; +say "Distinct Terms: { @distinct.join(", ") }"; +say "Count: { @distinct.elems }"; diff --git a/challenge-134/arne-sommer/raku/pandigital-number b/challenge-134/arne-sommer/raku/pandigital-number new file mode 100755 index 0000000000..464ba5b3f6 --- /dev/null +++ b/challenge-134/arne-sommer/raku/pandigital-number @@ -0,0 +1,20 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $n where $n > 0 = 5); + +my $pandigital-seq := gather +{ + my @base = 0 .. 9; + + for 1 .. 9 -> $first + { + my @rest = (@base (-) $first).keys.sort; + + for @rest.permutations -> @permutation + { + take ($first ~ @permutation.join); + } + } +} + +say $pandigital-seq[^$n].join(", "); diff --git a/challenge-134/arne-sommer/raku/pandigital-number-loop b/challenge-134/arne-sommer/raku/pandigital-number-loop new file mode 100755 index 0000000000..a452d7c7dc --- /dev/null +++ b/challenge-134/arne-sommer/raku/pandigital-number-loop @@ -0,0 +1,20 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $n where $n > 0 = 5, :v($verbose)); + +my $pandigital-seq := gather +{ + my $base = 10; + my @base = 0 .. 9; + my $start = (1 ~ '0' x $base -1).Int; + + say ":Start: $start" if $verbose; + + for $start .. Inf -> $candidate + { + say ":Checking $candidate" if $verbose; + take $candidate if $candidate.comb.unique.elems == $base; + } +} + +say $pandigital-seq[^$n].join(", "); diff --git a/challenge-134/arne-sommer/raku/pandigital-number-permutations b/challenge-134/arne-sommer/raku/pandigital-number-permutations new file mode 100755 index 0000000000..cc82f0370f --- /dev/null +++ b/challenge-134/arne-sommer/raku/pandigital-number-permutations @@ -0,0 +1,16 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $n where $n > 0 = 5, :v($verbose)); + +my $pandigital-seq := gather +{ + my @base = 0 .. 9; + + for @base.permutations -> @permutation + { + say ":Candidate ", @permutation.join("") if $verbose; + take @permutation.join unless @permutation[0] == 0; + } +} + +say $pandigital-seq[^$n].join(", "); -- cgit