aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2024-02-25 22:39:11 +0000
committerGitHub <noreply@github.com>2024-02-25 22:39:11 +0000
commit0168c15c2a1aa0dbd37bd06f0e58086b6b5bbe96 (patch)
tree3ec989b91d02d6c91510e603123a10b4d69c3919
parentb435583acbc43e436964592b303abaac0e11d620 (diff)
parent45554d7a00b41fefb9910984935a2d3f733bf0ba (diff)
downloadperlweeklychallenge-club-0168c15c2a1aa0dbd37bd06f0e58086b6b5bbe96.tar.gz
perlweeklychallenge-club-0168c15c2a1aa0dbd37bd06f0e58086b6b5bbe96.tar.bz2
perlweeklychallenge-club-0168c15c2a1aa0dbd37bd06f0e58086b6b5bbe96.zip
Merge pull request #9642 from arnesom/branch-for-challenge-257
Arne Sommer
-rw-r--r--challenge-257/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-257/arne-sommer/raku/ch-1.raku5
-rwxr-xr-xchallenge-257/arne-sommer/raku/ch-2.raku104
-rwxr-xr-xchallenge-257/arne-sommer/raku/reduced-row-dummy30
-rwxr-xr-xchallenge-257/arne-sommer/raku/reduced-row-echelon104
-rwxr-xr-xchallenge-257/arne-sommer/raku/smaller-than-bag17
-rwxr-xr-xchallenge-257/arne-sommer/raku/smaller-than-current5
-rwxr-xr-xchallenge-257/arne-sommer/raku/smaller-than-grep18
8 files changed, 284 insertions, 0 deletions
diff --git a/challenge-257/arne-sommer/blog.txt b/challenge-257/arne-sommer/blog.txt
new file mode 100644
index 0000000000..e2a08b4335
--- /dev/null
+++ b/challenge-257/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/currently-reduced.html
diff --git a/challenge-257/arne-sommer/raku/ch-1.raku b/challenge-257/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..2465f4fc9a
--- /dev/null
+++ b/challenge-257/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,5 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@ints where @ints.elems > 1 && all(@ints) ~~ Int);
+
+say "({ @ints.map({ @ints.grep( * < $_ ).elems }).join(", ") })";
diff --git a/challenge-257/arne-sommer/raku/ch-2.raku b/challenge-257/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..0c92a81410
--- /dev/null
+++ b/challenge-257/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,104 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($string = "1 0 0 1 | 0 1 0 2 | 0 0 1 3", :v(:$verbose));
+
+my $matrix = $string.split("|")>>.words>>.Int>>.Array;
+
+die "The rows must have the same size" unless [==] $matrix>>.elems;
+
+say + (rule1($matrix) && rule2($matrix) && rule3($matrix) && rule4($matrix));
+
+sub rule1 ($matrix)
+{
+ for ^$matrix.elems -> $row-index
+ {
+ for $matrix[$row-index] -> $value
+ {
+ next if $value == 0;
+ last if $value == 1;
+
+ say ": Falsified by rule 1 (on row $row-index)" if $verbose;
+
+ return False;
+ }
+ }
+
+ say ": Verified by rule 1" if $verbose;
+
+ return True;
+}
+
+sub rule2 ($matrix)
+{
+ my $ok = [>=] $matrix.map( { $_.all == 0 ?? 0 !! 1 });
+
+ say ": Falsified by rule 2" if $verbose && ! $ok;
+ say ": Verified by rule 2" if $verbose && $ok;
+
+ return $ok;
+}
+
+sub rule3 ($matrix)
+{
+ for ^($matrix.elems -1) -> $row-index
+ {
+ next if all($matrix[$row-index]) == 0;
+ next if all($matrix[$row-index + 1]) == 0;
+
+ my $pos1 = get-one($matrix[$row-index]);
+ my $pos2 = get-one($matrix[$row-index +1]);
+
+ if $pos1 >= $pos2
+ {
+ say ": Falsified by rule 3 (Row $row-index Col $pos1 vs Row { $row-index + 1 } Col: $pos2" if $verbose;
+ return False;
+ }
+ }
+
+ say ": Verified by rule 3" if $verbose;
+ return True;
+}
+
+sub rule4 ($matrix)
+{
+ for ^$matrix.elems -> $row-index
+ {
+ next if all($matrix[$row-index]) == 0;
+
+ for ^$matrix[$row-index].elems -> $col-index
+ {
+ next if $matrix[$row-index][$col-index] == 0;
+ unless $matrix[$row-index][$col-index] == 1
+ {
+ say ": Falsified by rule 4 (First non-zero is not one; row $row-index Col: $col-index" if $verbose;
+ return False;
+ }
+
+ my @col = $matrix[*;$col-index];
+ my $col = @col.Bag;
+
+ unless $col.keys.elems == 2 && $col{1} == 1 && $col{0} > 0
+ {
+ say ": Falsified by rule 4 (row $row-index column $col-index)" if $verbose;
+ return False;
+ }
+
+ last;
+ }
+ }
+
+ say ": Verified by rule 4" if $verbose;
+ return True;
+}
+
+sub get-one (@row)
+{
+ for ^@row.elems -> $index
+ {
+ return $index if @row[$index] == 1;
+ die "Not a leading 0" unless @row[$index] == 0;
+ }
+ die "No 1 in row";
+}
+
+
diff --git a/challenge-257/arne-sommer/raku/reduced-row-dummy b/challenge-257/arne-sommer/raku/reduced-row-dummy
new file mode 100755
index 0000000000..dec9aa2658
--- /dev/null
+++ b/challenge-257/arne-sommer/raku/reduced-row-dummy
@@ -0,0 +1,30 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($string = "1 0 0 1 | 0 1 0 2 | 0 0 1 3", :v(:$verbose));
+
+my $matrix = $string.split("|")>>.words>>.Int>>.Array;
+
+die "The rows must have the same size" unless [==] $matrix>>.elems;
+
+say + (rule1($matrix) && rule2($matrix) && rule3($matrix) && rule4($matrix));
+
+sub rule1 ($matrix)
+{
+ return True;
+}
+
+sub rule2 ($matrix)
+{
+ return True;
+}
+
+sub rule3 ($matrix)
+{
+ return True;
+}
+
+sub rule4 ($matrix)
+{
+ return True;
+}
+
diff --git a/challenge-257/arne-sommer/raku/reduced-row-echelon b/challenge-257/arne-sommer/raku/reduced-row-echelon
new file mode 100755
index 0000000000..0c92a81410
--- /dev/null
+++ b/challenge-257/arne-sommer/raku/reduced-row-echelon
@@ -0,0 +1,104 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($string = "1 0 0 1 | 0 1 0 2 | 0 0 1 3", :v(:$verbose));
+
+my $matrix = $string.split("|")>>.words>>.Int>>.Array;
+
+die "The rows must have the same size" unless [==] $matrix>>.elems;
+
+say + (rule1($matrix) && rule2($matrix) && rule3($matrix) && rule4($matrix));
+
+sub rule1 ($matrix)
+{
+ for ^$matrix.elems -> $row-index
+ {
+ for $matrix[$row-index] -> $value
+ {
+ next if $value == 0;
+ last if $value == 1;
+
+ say ": Falsified by rule 1 (on row $row-index)" if $verbose;
+
+ return False;
+ }
+ }
+
+ say ": Verified by rule 1" if $verbose;
+
+ return True;
+}
+
+sub rule2 ($matrix)
+{
+ my $ok = [>=] $matrix.map( { $_.all == 0 ?? 0 !! 1 });
+
+ say ": Falsified by rule 2" if $verbose && ! $ok;
+ say ": Verified by rule 2" if $verbose && $ok;
+
+ return $ok;
+}
+
+sub rule3 ($matrix)
+{
+ for ^($matrix.elems -1) -> $row-index
+ {
+ next if all($matrix[$row-index]) == 0;
+ next if all($matrix[$row-index + 1]) == 0;
+
+ my $pos1 = get-one($matrix[$row-index]);
+ my $pos2 = get-one($matrix[$row-index +1]);
+
+ if $pos1 >= $pos2
+ {
+ say ": Falsified by rule 3 (Row $row-index Col $pos1 vs Row { $row-index + 1 } Col: $pos2" if $verbose;
+ return False;
+ }
+ }
+
+ say ": Verified by rule 3" if $verbose;
+ return True;
+}
+
+sub rule4 ($matrix)
+{
+ for ^$matrix.elems -> $row-index
+ {
+ next if all($matrix[$row-index]) == 0;
+
+ for ^$matrix[$row-index].elems -> $col-index
+ {
+ next if $matrix[$row-index][$col-index] == 0;
+ unless $matrix[$row-index][$col-index] == 1
+ {
+ say ": Falsified by rule 4 (First non-zero is not one; row $row-index Col: $col-index" if $verbose;
+ return False;
+ }
+
+ my @col = $matrix[*;$col-index];
+ my $col = @col.Bag;
+
+ unless $col.keys.elems == 2 && $col{1} == 1 && $col{0} > 0
+ {
+ say ": Falsified by rule 4 (row $row-index column $col-index)" if $verbose;
+ return False;
+ }
+
+ last;
+ }
+ }
+
+ say ": Verified by rule 4" if $verbose;
+ return True;
+}
+
+sub get-one (@row)
+{
+ for ^@row.elems -> $index
+ {
+ return $index if @row[$index] == 1;
+ die "Not a leading 0" unless @row[$index] == 0;
+ }
+ die "No 1 in row";
+}
+
+
diff --git a/challenge-257/arne-sommer/raku/smaller-than-bag b/challenge-257/arne-sommer/raku/smaller-than-bag
new file mode 100755
index 0000000000..ae42e6dc69
--- /dev/null
+++ b/challenge-257/arne-sommer/raku/smaller-than-bag
@@ -0,0 +1,17 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@ints where @ints.elems > 1 && all(@ints) ~~ Int,
+ :v(:$verbose));
+
+my $bag = @ints>>.Int.Bag;
+my $smaller = 0;
+my %smaller;
+
+for $bag.keys.sort -> $key
+{
+ say ": $key: smaller: $smaller" if $verbose;
+ %smaller{$key} = $smaller;
+ $smaller += $bag{$key};
+}
+
+say "({ @ints.map({ %smaller{$_} }).join(", ") })";
diff --git a/challenge-257/arne-sommer/raku/smaller-than-current b/challenge-257/arne-sommer/raku/smaller-than-current
new file mode 100755
index 0000000000..2465f4fc9a
--- /dev/null
+++ b/challenge-257/arne-sommer/raku/smaller-than-current
@@ -0,0 +1,5 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@ints where @ints.elems > 1 && all(@ints) ~~ Int);
+
+say "({ @ints.map({ @ints.grep( * < $_ ).elems }).join(", ") })";
diff --git a/challenge-257/arne-sommer/raku/smaller-than-grep b/challenge-257/arne-sommer/raku/smaller-than-grep
new file mode 100755
index 0000000000..ac9c7ebfc1
--- /dev/null
+++ b/challenge-257/arne-sommer/raku/smaller-than-grep
@@ -0,0 +1,18 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@ints where @ints.elems > 1 && all(@ints) ~~ Int,
+ :v(:$verbose));
+
+my @count;
+
+for @ints -> $int
+{
+ my @smaller = @ints.grep: * < $int;
+ my $count = @smaller.elems;
+
+ say ": $int - with $count smaller ({ @smaller.join(",") })" if $verbose;
+
+ @count.push: $count;
+}
+
+say "({ @count.join(", ") })";