aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-288/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-288/arne-sommer/raku/ch-1.raku32
-rwxr-xr-xchallenge-288/arne-sommer/raku/ch-2.raku76
-rwxr-xr-xchallenge-288/arne-sommer/raku/closest-palindrome32
-rwxr-xr-xchallenge-288/arne-sommer/raku/contiguous-block76
5 files changed, 217 insertions, 0 deletions
diff --git a/challenge-288/arne-sommer/blog.txt b/challenge-288/arne-sommer/blog.txt
new file mode 100644
index 0000000000..0eb1289e10
--- /dev/null
+++ b/challenge-288/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/contiguously-closest.html
diff --git a/challenge-288/arne-sommer/raku/ch-1.raku b/challenge-288/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..7588c739de
--- /dev/null
+++ b/challenge-288/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,32 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($str where $str ~~ UInt, :v(:$verbose));
+
+my $lower = $str;
+my $higher = $str;
+
+loop
+{
+ $lower -= 1;
+
+ if $lower >= 0
+ {
+ say ": Down: $lower (distance { $str - $lower })" if $verbose;
+
+ if $lower.flip eq $lower
+ {
+ say $lower;
+ last;
+ }
+ }
+
+ $higher += 1;
+
+ say ": Up: $higher (distance { $higher - $str })" if $verbose;
+
+ if $higher.flip eq $higher
+ {
+ say $higher;
+ last;
+ }
+}
diff --git a/challenge-288/arne-sommer/raku/ch-2.raku b/challenge-288/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..e77aa693d2
--- /dev/null
+++ b/challenge-288/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,76 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@matrix where @matrix.elems > 0 && ( [==] @matrix>>.elems ) && all(@matrix) ~~ /^<[ox]>+$/, :v(:$verbose));
+
+my @m = @matrix>>.comb>>.Array;
+
+print-matrix(@m) if $verbose;
+
+my $current = 1;
+
+my %replace;
+
+for ^@m.elems -> $row
+{
+ for ^@m[0].elems -> $col
+ {
+ my $curr = @m[$row][$col];
+ my $todo = $curr eq any('o', 'x');
+
+ say ": Loop iteration at r:$row c:$col val:$curr - { $todo ?? "Enter, todo" !! "Skip, already done" }" if $verbose;
+
+ next unless $todo;
+
+ %replace{$current} = $curr;
+
+ $current++ if set-value(@m, $row, $col, $curr, $current);
+ }
+}
+
+sub set-value(@m, $row, $col, $swap, $replace)
+{
+ return unless 0 <= $row < @m.elems;
+ return unless 0 <= $col < @m[0].elems;
+ return unless @m[$row][$col] eq $swap;
+
+ say ": - r:$row c:$col | Replace @m[$row][$col] with $replace" if $verbose;
+
+ @m[$row][$col] = $replace;
+
+ set-value(@m, $row -1, $col, $swap, $replace);
+ set-value(@m, $row, $col -1, $swap, $replace);
+ set-value(@m, $row, $col +1, $swap, $replace);
+ set-value(@m, $row +1, $col, $swap, $replace);
+
+ return True;
+}
+
+print-matrix(@m) if $verbose;
+
+my $bag = @m[*;*].Bag;
+my @sorted = $bag.sort({ $^b.value <=> $^a.value });
+
+say ": Bag { $bag.raku }" if $verbose;
+say ": Bag Sort: { $bag.sort({ $^b.value <=> $^a.value }).raku }" if $verbose;
+
+print-matrix(@m, @sorted.first.key) if $verbose;
+
+say @sorted.first.value;
+
+multi sub print-matrix (@m)
+{
+ @m.map({ say ": " ~ $_.join(" ") });
+}
+
+multi sub print-matrix (@m, $match)
+{
+ my $col-blue = "\e[44m";
+ my $col-green = "\e[42m";
+ my $col-red = "\e[101m";
+ my $col-stop = "\e[0m";
+
+ for @m -> @row
+ {
+ say ": " ~ @row.map({ $_ == $match ?? "$col-green%replace{$_}$col-stop" !! %replace{$_} }).join(" ");
+ }
+}
diff --git a/challenge-288/arne-sommer/raku/closest-palindrome b/challenge-288/arne-sommer/raku/closest-palindrome
new file mode 100755
index 0000000000..7588c739de
--- /dev/null
+++ b/challenge-288/arne-sommer/raku/closest-palindrome
@@ -0,0 +1,32 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($str where $str ~~ UInt, :v(:$verbose));
+
+my $lower = $str;
+my $higher = $str;
+
+loop
+{
+ $lower -= 1;
+
+ if $lower >= 0
+ {
+ say ": Down: $lower (distance { $str - $lower })" if $verbose;
+
+ if $lower.flip eq $lower
+ {
+ say $lower;
+ last;
+ }
+ }
+
+ $higher += 1;
+
+ say ": Up: $higher (distance { $higher - $str })" if $verbose;
+
+ if $higher.flip eq $higher
+ {
+ say $higher;
+ last;
+ }
+}
diff --git a/challenge-288/arne-sommer/raku/contiguous-block b/challenge-288/arne-sommer/raku/contiguous-block
new file mode 100755
index 0000000000..e77aa693d2
--- /dev/null
+++ b/challenge-288/arne-sommer/raku/contiguous-block
@@ -0,0 +1,76 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@matrix where @matrix.elems > 0 && ( [==] @matrix>>.elems ) && all(@matrix) ~~ /^<[ox]>+$/, :v(:$verbose));
+
+my @m = @matrix>>.comb>>.Array;
+
+print-matrix(@m) if $verbose;
+
+my $current = 1;
+
+my %replace;
+
+for ^@m.elems -> $row
+{
+ for ^@m[0].elems -> $col
+ {
+ my $curr = @m[$row][$col];
+ my $todo = $curr eq any('o', 'x');
+
+ say ": Loop iteration at r:$row c:$col val:$curr - { $todo ?? "Enter, todo" !! "Skip, already done" }" if $verbose;
+
+ next unless $todo;
+
+ %replace{$current} = $curr;
+
+ $current++ if set-value(@m, $row, $col, $curr, $current);
+ }
+}
+
+sub set-value(@m, $row, $col, $swap, $replace)
+{
+ return unless 0 <= $row < @m.elems;
+ return unless 0 <= $col < @m[0].elems;
+ return unless @m[$row][$col] eq $swap;
+
+ say ": - r:$row c:$col | Replace @m[$row][$col] with $replace" if $verbose;
+
+ @m[$row][$col] = $replace;
+
+ set-value(@m, $row -1, $col, $swap, $replace);
+ set-value(@m, $row, $col -1, $swap, $replace);
+ set-value(@m, $row, $col +1, $swap, $replace);
+ set-value(@m, $row +1, $col, $swap, $replace);
+
+ return True;
+}
+
+print-matrix(@m) if $verbose;
+
+my $bag = @m[*;*].Bag;
+my @sorted = $bag.sort({ $^b.value <=> $^a.value });
+
+say ": Bag { $bag.raku }" if $verbose;
+say ": Bag Sort: { $bag.sort({ $^b.value <=> $^a.value }).raku }" if $verbose;
+
+print-matrix(@m, @sorted.first.key) if $verbose;
+
+say @sorted.first.value;
+
+multi sub print-matrix (@m)
+{
+ @m.map({ say ": " ~ $_.join(" ") });
+}
+
+multi sub print-matrix (@m, $match)
+{
+ my $col-blue = "\e[44m";
+ my $col-green = "\e[42m";
+ my $col-red = "\e[101m";
+ my $col-stop = "\e[0m";
+
+ for @m -> @row
+ {
+ say ": " ~ @row.map({ $_ == $match ?? "$col-green%replace{$_}$col-stop" !! %replace{$_} }).join(" ");
+ }
+}