From a342a2a8c68002436c2de98b8436cd8e85558079 Mon Sep 17 00:00:00 2001 From: arnesom Date: Thu, 6 Apr 2023 19:05:27 +0200 Subject: Arne Sommer --- challenge-211/arne-sommer/blog.txt | 1 + challenge-211/arne-sommer/raku/ch-1.raku | 43 +++++++++++++++++++++++ challenge-211/arne-sommer/raku/ch-2.raku | 28 +++++++++++++++ challenge-211/arne-sommer/raku/split-same-average | 28 +++++++++++++++ challenge-211/arne-sommer/raku/toeplitz-matrix | 43 +++++++++++++++++++++++ 5 files changed, 143 insertions(+) create mode 100644 challenge-211/arne-sommer/blog.txt create mode 100755 challenge-211/arne-sommer/raku/ch-1.raku create mode 100755 challenge-211/arne-sommer/raku/ch-2.raku create mode 100755 challenge-211/arne-sommer/raku/split-same-average create mode 100755 challenge-211/arne-sommer/raku/toeplitz-matrix diff --git a/challenge-211/arne-sommer/blog.txt b/challenge-211/arne-sommer/blog.txt new file mode 100644 index 0000000000..3fb70a3139 --- /dev/null +++ b/challenge-211/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/same-toeplitz.html diff --git a/challenge-211/arne-sommer/raku/ch-1.raku b/challenge-211/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..53e3a53d69 --- /dev/null +++ b/challenge-211/arne-sommer/raku/ch-1.raku @@ -0,0 +1,43 @@ +#! /usr/bin/env raku + +unit sub MAIN (Str $matrix = "4 3 2 1 | 5 4 3 2 | 6 5 4 3", :v(:$verbose)); + +my @matrix = $matrix.split("|")>>.words>>.Array; +my @size = @matrix>>.elems; + +die "Must have at least 2 rows" unless @size.elems >= 2; +die "The rows must have the same size" unless [==] @size; + +while @matrix.elems +{ + @matrix.shift if @matrix[0].elems == 0; + + last unless @matrix.elems; + + my $row = 0; + my $col = @matrix[$row].end; + + my $value = @matrix[$row].pop; + + say ": Row:0 { @matrix.raku } -> $value (last value removed from row)" if $verbose; + + loop + { + $row++; + $col++; + last unless defined @matrix[$row]; + last unless defined @matrix[$row][$col]; + + my $new = @matrix[$row].pop; + + say ": Row:$row { @matrix.raku } -> $new (last value removed from row)" if $verbose; + + unless $value eq $new + { + say 'false'; + exit; + } + } +} + +say 'true'; diff --git a/challenge-211/arne-sommer/raku/ch-2.raku b/challenge-211/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..f404108103 --- /dev/null +++ b/challenge-211/arne-sommer/raku/ch-2.raku @@ -0,0 +1,28 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@int where @int.elems > 0 && @int.all ~~ UInt && @int.all > 0, :v(:$verbose)); + +for @int.permutations.unique -> @candidate +{ + say ": Candidate: @candidate[]" if $verbose; + + my @right = @candidate.clone; + my @left; + + while @right.elems > 1 + { + @left.push: @right.shift; + my $left-avg = @left.sum / @left.elems; + my $right-avg = @right.sum / @right.elems; + + say ": - Comparing @left[] (avg: $left-avg) <=> @right[] (avg: $right-avg)" if $verbose; + + if $left-avg == $right-avg + { + say 'true'; + exit; + } + } +} + +say 'false'; diff --git a/challenge-211/arne-sommer/raku/split-same-average b/challenge-211/arne-sommer/raku/split-same-average new file mode 100755 index 0000000000..f404108103 --- /dev/null +++ b/challenge-211/arne-sommer/raku/split-same-average @@ -0,0 +1,28 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@int where @int.elems > 0 && @int.all ~~ UInt && @int.all > 0, :v(:$verbose)); + +for @int.permutations.unique -> @candidate +{ + say ": Candidate: @candidate[]" if $verbose; + + my @right = @candidate.clone; + my @left; + + while @right.elems > 1 + { + @left.push: @right.shift; + my $left-avg = @left.sum / @left.elems; + my $right-avg = @right.sum / @right.elems; + + say ": - Comparing @left[] (avg: $left-avg) <=> @right[] (avg: $right-avg)" if $verbose; + + if $left-avg == $right-avg + { + say 'true'; + exit; + } + } +} + +say 'false'; diff --git a/challenge-211/arne-sommer/raku/toeplitz-matrix b/challenge-211/arne-sommer/raku/toeplitz-matrix new file mode 100755 index 0000000000..53e3a53d69 --- /dev/null +++ b/challenge-211/arne-sommer/raku/toeplitz-matrix @@ -0,0 +1,43 @@ +#! /usr/bin/env raku + +unit sub MAIN (Str $matrix = "4 3 2 1 | 5 4 3 2 | 6 5 4 3", :v(:$verbose)); + +my @matrix = $matrix.split("|")>>.words>>.Array; +my @size = @matrix>>.elems; + +die "Must have at least 2 rows" unless @size.elems >= 2; +die "The rows must have the same size" unless [==] @size; + +while @matrix.elems +{ + @matrix.shift if @matrix[0].elems == 0; + + last unless @matrix.elems; + + my $row = 0; + my $col = @matrix[$row].end; + + my $value = @matrix[$row].pop; + + say ": Row:0 { @matrix.raku } -> $value (last value removed from row)" if $verbose; + + loop + { + $row++; + $col++; + last unless defined @matrix[$row]; + last unless defined @matrix[$row][$col]; + + my $new = @matrix[$row].pop; + + say ": Row:$row { @matrix.raku } -> $new (last value removed from row)" if $verbose; + + unless $value eq $new + { + say 'false'; + exit; + } + } +} + +say 'true'; -- cgit