From 4eb8f4e10771b784bb18be1cde0bce8cc534132e Mon Sep 17 00:00:00 2001 From: arnesom Date: Sun, 11 Aug 2024 19:38:37 +0200 Subject: Arne Sommer --- challenge-281/arne-sommer/blog.txt | 1 + challenge-281/arne-sommer/raku/ch-1.raku | 13 +++++++ challenge-281/arne-sommer/raku/ch-2.raku | 44 +++++++++++++++++++++++ challenge-281/arne-sommer/raku/check-color | 13 +++++++ challenge-281/arne-sommer/raku/check-color-boring | 19 ++++++++++ challenge-281/arne-sommer/raku/knightmover | 44 +++++++++++++++++++++++ 6 files changed, 134 insertions(+) create mode 100644 challenge-281/arne-sommer/blog.txt create mode 100755 challenge-281/arne-sommer/raku/ch-1.raku create mode 100755 challenge-281/arne-sommer/raku/ch-2.raku create mode 100755 challenge-281/arne-sommer/raku/check-color create mode 100755 challenge-281/arne-sommer/raku/check-color-boring create mode 100755 challenge-281/arne-sommer/raku/knightmover diff --git a/challenge-281/arne-sommer/blog.txt b/challenge-281/arne-sommer/blog.txt new file mode 100644 index 0000000000..aa16585683 --- /dev/null +++ b/challenge-281/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/color-knight.html diff --git a/challenge-281/arne-sommer/raku/ch-1.raku b/challenge-281/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..e1da604601 --- /dev/null +++ b/challenge-281/arne-sommer/raku/ch-1.raku @@ -0,0 +1,13 @@ +#! /usr/bin/env raku + +subset BOARDPOS where * ~~ /^<[a..h]><[1..8]>$/; + +unit sub MAIN (BOARDPOS $coordinate, :v(:$verbose)); + +my ($col, $row) = $coordinate.comb; + +say ": Row $row, Col $col" if $verbose; + +say $col eq any() + ?? $row %% 2 + !! $row !%% 2; diff --git a/challenge-281/arne-sommer/raku/ch-2.raku b/challenge-281/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..377739fecb --- /dev/null +++ b/challenge-281/arne-sommer/raku/ch-2.raku @@ -0,0 +1,44 @@ +#! /usr/bin/env raku + +subset BOARDPOS where * ~~ /^<[a..h]><[1..8]>$/; +subset MOVE of Int where -7 <= * <= 7; + +unit sub MAIN (BOARDPOS $start, BOARDPOS $end, :v(:$verbose)); + +my %seen = ( $start => True ); + +my @queue = \{ steps => 0, pos => $start, path => ($start,) }; + +while @queue +{ + my %curr = @queue.shift; + + say ": Steps %curr: at pos %curr (path: %curr)" if $verbose; + + if (%curr eq $end) + { + say ": Arrived at target after %curr steps (path: %curr)" if $verbose; + say %curr; + last; + } + + for ( (-2,-1), (-2,1), (2,-1), (2,1), (-1,-2), (-1,2), (1,-2), (1,2)) -> ($row-offset, $col-offset) + { + my $new-pos = new-pos-knight(%curr, c => $col-offset, r => $row-offset) // next; + next if %seen{$new-pos}++; + @queue.push: { pos => $new-pos, steps => %curr +1, path => ( %curr, $new-pos).flat }; + } +} + +sub new-pos-knight (BOARDPOS $pos, MOVE :r(:$row-offset), MOVE :c(:$col-offset)) +{ + my ($col, $row) = $pos.comb; + + my $new-row = $row + $row-offset; + return unless 1 <= $new-row <= 8; + + my $new-col = (ord($col) + $col-offset).chr; + return unless $new-col eq any(); + + return $new-col ~ $new-row; +} \ No newline at end of file diff --git a/challenge-281/arne-sommer/raku/check-color b/challenge-281/arne-sommer/raku/check-color new file mode 100755 index 0000000000..e1da604601 --- /dev/null +++ b/challenge-281/arne-sommer/raku/check-color @@ -0,0 +1,13 @@ +#! /usr/bin/env raku + +subset BOARDPOS where * ~~ /^<[a..h]><[1..8]>$/; + +unit sub MAIN (BOARDPOS $coordinate, :v(:$verbose)); + +my ($col, $row) = $coordinate.comb; + +say ": Row $row, Col $col" if $verbose; + +say $col eq any() + ?? $row %% 2 + !! $row !%% 2; diff --git a/challenge-281/arne-sommer/raku/check-color-boring b/challenge-281/arne-sommer/raku/check-color-boring new file mode 100755 index 0000000000..297604368b --- /dev/null +++ b/challenge-281/arne-sommer/raku/check-color-boring @@ -0,0 +1,19 @@ +#! /usr/bin/env raku + +subset BOARDPOS where * ~~ /^<[a..h]><[1..8]>$/; + +unit sub MAIN (BOARDPOS $coordinate); + +my %l; + +%l = %l = %l = %l = True; +%l = %l = %l = %l = True; +%l = %l = %l = %l = True; +%l = %l = %l = %l = True; + +%l = %l = %l = %l = True; +%l = %l = %l = %l = True; +%l = %l = %l = %l = True; +%l

= %l

= %l

= %l = True; + +say so %l{$coordinate}; diff --git a/challenge-281/arne-sommer/raku/knightmover b/challenge-281/arne-sommer/raku/knightmover new file mode 100755 index 0000000000..377739fecb --- /dev/null +++ b/challenge-281/arne-sommer/raku/knightmover @@ -0,0 +1,44 @@ +#! /usr/bin/env raku + +subset BOARDPOS where * ~~ /^<[a..h]><[1..8]>$/; +subset MOVE of Int where -7 <= * <= 7; + +unit sub MAIN (BOARDPOS $start, BOARDPOS $end, :v(:$verbose)); + +my %seen = ( $start => True ); + +my @queue = \{ steps => 0, pos => $start, path => ($start,) }; + +while @queue +{ + my %curr = @queue.shift; + + say ": Steps %curr: at pos %curr (path: %curr)" if $verbose; + + if (%curr eq $end) + { + say ": Arrived at target after %curr steps (path: %curr)" if $verbose; + say %curr; + last; + } + + for ( (-2,-1), (-2,1), (2,-1), (2,1), (-1,-2), (-1,2), (1,-2), (1,2)) -> ($row-offset, $col-offset) + { + my $new-pos = new-pos-knight(%curr, c => $col-offset, r => $row-offset) // next; + next if %seen{$new-pos}++; + @queue.push: { pos => $new-pos, steps => %curr +1, path => ( %curr, $new-pos).flat }; + } +} + +sub new-pos-knight (BOARDPOS $pos, MOVE :r(:$row-offset), MOVE :c(:$col-offset)) +{ + my ($col, $row) = $pos.comb; + + my $new-row = $row + $row-offset; + return unless 1 <= $new-row <= 8; + + my $new-col = (ord($col) + $col-offset).chr; + return unless $new-col eq any(); + + return $new-col ~ $new-row; +} \ No newline at end of file -- cgit