diff options
| -rw-r--r-- | challenge-288/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-288/arne-sommer/raku/ch-1.raku | 32 | ||||
| -rwxr-xr-x | challenge-288/arne-sommer/raku/ch-2.raku | 76 | ||||
| -rwxr-xr-x | challenge-288/arne-sommer/raku/closest-palindrome | 32 | ||||
| -rwxr-xr-x | challenge-288/arne-sommer/raku/contiguous-block | 76 |
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(" "); + } +} |
