From d0082a9da8758301e2d7b59cc30b74f30d97f979 Mon Sep 17 00:00:00 2001 From: Jan Krňávek Date: Mon, 5 Aug 2024 19:35:26 +0200 Subject: solutions week 281 --- challenge-281/wambash/raku/ch-1.raku | 21 +++++++++++++++ challenge-281/wambash/raku/ch-2.raku | 50 ++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 challenge-281/wambash/raku/ch-1.raku create mode 100644 challenge-281/wambash/raku/ch-2.raku 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 (..); + +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 (..); +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 +} -- cgit From fb45c676a28e4d47d81cba82f273059f255de670 Mon Sep 17 00:00:00 2001 From: Jan Krňávek Date: Mon, 5 Aug 2024 19:40:27 +0200 Subject: try undefined enum --- challenge-281/wambash/raku/ch-2.raku | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/challenge-281/wambash/raku/ch-2.raku b/challenge-281/wambash/raku/ch-2.raku index 0d13f4fce5..85cbe99c8b 100644 --- a/challenge-281/wambash/raku/ch-2.raku +++ b/challenge-281/wambash/raku/ch-2.raku @@ -9,8 +9,8 @@ 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 + try { Col($col+$col-diff), Row($row+$row-diff) }\ + orelse Empty } sub knight-jump ( +@vertex (Col $, Row $) ) { -- cgit From 1a09a37ffd076a2f5ba66eb55f4391851946ee27 Mon Sep 17 00:00:00 2001 From: Jan Krňávek Date: Mon, 5 Aug 2024 20:01:29 +0200 Subject: direct making adjacency-list --- challenge-281/wambash/raku/ch-2.raku | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/challenge-281/wambash/raku/ch-2.raku b/challenge-281/wambash/raku/ch-2.raku index 85cbe99c8b..8a96934cd6 100644 --- a/challenge-281/wambash/raku/ch-2.raku +++ b/challenge-281/wambash/raku/ch-2.raku @@ -4,29 +4,27 @@ use Graph; enum Col (..); -enum Row (1=> 1, slip 2..8); +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) ) { - try { Col($col+$col-diff), Row($row+$row-diff) }\ + try { Col($col+$col-diff), Row($row+$row-diff) }\ orelse Empty } sub knight-jump ( +@vertex (Col $, Row $) ) { - 1 X, (-2, 2) + -1, 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 %adjacency-list = %( + @vertices.map: { $_.join => set knight-jump($_).map: *.join }\ ); constant knight-moves = Graph.new( - @edges + :%adjacency-list ); sub knight's-move ($start, $end) { @@ -36,8 +34,8 @@ sub knight's-move ($start, $end) { 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-jump( g, Row(2) ), ((e,Row(1)),(f,Row(4)),(e,Row(3)),(h,Row(4)),); + is knight-jump( c, Row(4) ), ((b,Row(2)),(a,Row(3)),(b,Row(6)),(e,Row(3)),(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; -- cgit