aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Krňávek <Jan.Krnavek@gmail.com>2024-08-05 19:35:26 +0200
committerJan Krňávek <Jan.Krnavek@gmail.com>2024-08-05 19:35:26 +0200
commitd0082a9da8758301e2d7b59cc30b74f30d97f979 (patch)
tree64c2046a308f2def15cda1581ef6f104b0deaa2a
parent7aced3260b50bc903ed5cb12cf5a98af98e00861 (diff)
downloadperlweeklychallenge-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.raku21
-rw-r--r--challenge-281/wambash/raku/ch-2.raku50
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
+}