diff options
| author | Jan Krňávek <Jan.Krnavek@gmail.com> | 2024-08-05 19:35:26 +0200 |
|---|---|---|
| committer | Jan Krňávek <Jan.Krnavek@gmail.com> | 2024-08-05 19:35:26 +0200 |
| commit | d0082a9da8758301e2d7b59cc30b74f30d97f979 (patch) | |
| tree | 64c2046a308f2def15cda1581ef6f104b0deaa2a | |
| parent | 7aced3260b50bc903ed5cb12cf5a98af98e00861 (diff) | |
| download | perlweeklychallenge-club-d0082a9da8758301e2d7b59cc30b74f30d97f979.tar.gz perlweeklychallenge-club-d0082a9da8758301e2d7b59cc30b74f30d97f979.tar.bz2 perlweeklychallenge-club-d0082a9da8758301e2d7b59cc30b74f30d97f979.zip | |
solutions week 281
| -rw-r--r-- | challenge-281/wambash/raku/ch-1.raku | 21 | ||||
| -rw-r--r-- | challenge-281/wambash/raku/ch-2.raku | 50 |
2 files changed, 71 insertions, 0 deletions
diff --git a/challenge-281/wambash/raku/ch-1.raku b/challenge-281/wambash/raku/ch-1.raku new file mode 100644 index 0000000000..f6aa3c168c --- /dev/null +++ b/challenge-281/wambash/raku/ch-1.raku @@ -0,0 +1,21 @@ +#!/usr/bin/env raku +enum Col (<a>..<h>); + +sub check-color ($coordinates) { + $coordinates + andthen .comb + andthen Col::{.[0]} + .[1] + andthen $_ %% 2 +} + +multi MAIN (Bool :test($)!) { + use Test; + is check-color('d3'), True; + is check-color('g5'), False; + is check-color('e6'), True; + done-testing; +} + +multi MAIN ($coordinates) { + say check-color $coordinates +} diff --git a/challenge-281/wambash/raku/ch-2.raku b/challenge-281/wambash/raku/ch-2.raku new file mode 100644 index 0000000000..0d13f4fce5 --- /dev/null +++ b/challenge-281/wambash/raku/ch-2.raku @@ -0,0 +1,50 @@ +#!/usr/bin/env raku +use v6.e.PREVIEW; +use Graph; + + +enum Col (<a>..<h>); +enum Row (1=> 1, slip 2..8); + +constant @vertices = Col::.values.sort X, Row::.values.sort; + +sub move ( @ (Col $col, Row $row), @ ($col-diff,$row-diff) ) { + Col($col+$col-diff)//Nil, Row($row+$row-diff)//Nil + andthen .all.defined ?? $_ !! Empty +} + +sub knight-jump ( +@vertex (Col $, Row $) ) { + 1 X, (-2, 2) + andthen .map: { slip $_, .reverse }\ + andthen .map: &move.assuming(@vertex)\ +} + +constant @edges = ( + @vertices + andthen .map: { slip $_.join X, knight-jump $_ }\ + andthen .map: { %( from => .[0].join, to => .[1].join, weight => 1 ) } +); + +constant knight-moves = Graph.new( + @edges +); + +sub knight's-move ($start, $end) { + knight-moves.find-shortest-path: $start, $end + andthen .elems - 1 +} + +multi MAIN (Bool :test($)!) { + use Test; + is knight-jump( g, Row(2) ), ((e,Row(3)),(h,Row(4)),); + is knight-jump( c, Row(4) ), ((d,Row(2)),(a,Row(5)),(d,Row(6)),(e,Row(5))); + is knight's-move('g2','a8'), 4; + is knight's-move('g2','h2'), 3; + is knight's-move('g2','h4'), 1; + is knight's-move('g2','g6'), 2; + done-testing; +} + +multi MAIN ($start, $end) { + say knight's-move $start, $end +} |
