From 727e554c0afbbba7e6a977704d0be3c57f6c2674 Mon Sep 17 00:00:00 2001 From: Ben Davies Date: Wed, 29 Sep 2021 09:03:10 -0300 Subject: Add Ben Davies' Raku solutions for challenge 132 --- challenge-132/ben-davies/raku/ch-1.raku | 11 +++++++++++ challenge-132/ben-davies/raku/ch-2.raku | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 challenge-132/ben-davies/raku/ch-1.raku create mode 100644 challenge-132/ben-davies/raku/ch-2.raku diff --git a/challenge-132/ben-davies/raku/ch-1.raku b/challenge-132/ben-davies/raku/ch-1.raku new file mode 100644 index 0000000000..5836cfc91e --- /dev/null +++ b/challenge-132/ben-davies/raku/ch-1.raku @@ -0,0 +1,11 @@ +use v6; +unit sub MAIN( + #|[ A yyyy/mm/dd formatted birthday. ] + Str:D $input where ?m/ ^ $=[\d+] '/' $=[\d ** 2] '/' $=[\d ** 2] $ / +) { + my Date:D $birthday .= new: +$, +$, +$, :&formatter; + my Date:D $today .= new: 2021, 9, 22, :&formatter; + my Int:D $lifespan = $today - $birthday; + put $birthday - $lifespan, ', ', $today + $lifespan; + sub formatter(Dateish:D $date --> Str:D) { '%d/%02d/%02d'.sprintf: $date.year, $date.month, $date.day } +} diff --git a/challenge-132/ben-davies/raku/ch-2.raku b/challenge-132/ben-davies/raku/ch-2.raku new file mode 100644 index 0000000000..ea037c976c --- /dev/null +++ b/challenge-132/ben-davies/raku/ch-2.raku @@ -0,0 +1,33 @@ +use v6; + +#|[ Performs a hash join given the probe input, build input, and corresponding + indices with which to compare. ] +sub hashjoin(@S, @R, Int:D $si, Int:D $ri) { + # 1. For each tuple r in the build input R + # 1.1 Add r to the in-memory hash table + @R.classify({ $^r[$ri] }, :into(my %hash{Any})); + # 2. Do a final scan of the probe input S and add the resulting join tuples + # to the output relation + @S.sort({ $^a[$si] cmp $^b[$si] }).map({ + %hash{$^s[$si]} andthen |.map({ |$s, |$^r[^$ri], |$^r[$ri^..*] }) }) +} + +my @player-ages = ( + [20, "Alex" ], + [28, "Joe" ], + [38, "Mike" ], + [18, "Alex" ], + [25, "David" ], + [18, "Simon" ], +); + +my @player-names = ( + ["Alex", "Stewart"], + ["Joe", "Root" ], + ["Mike", "Gatting"], + ["Joe", "Blog" ], + ["Alex", "Jones" ], + ["Simon","Duane" ], +); + +sub MAIN() { .put for hashjoin @player-ages, @player-names, 1, 0 } -- cgit