Valid temperatures
PWC 181 Task 2 asks for input validation of dates and numbers. OK, it should ask for input validation so my solution isn’t totally over the top. Better safe then sorry.
my $data = q:to/EOH/;
2022-08-01, 20
2022-08-09, 10
2022-08-03, 19
2022-08-06, 24
2022-08-05, 22
2022-08-10, 28
2022-08-07, 20
2022-08-04, 18
2022-08-08, 21
2022-08-02, 25
EOH
$data.lines()
==> map(* ~~ / $<date> = [ \d+ ‘-’ \d?\d ‘-’ \d?\d ] \s* ‘,’ \s* $<temperature> = [ '-'?\d+ [ '.' \d+ ]? ] /)
==> map(-> (Date(Str:D(Match)) :$date, Numeric(Str:D(Match)) :$temperature, *%) { [ $date, $temperature ] })
==> sort(*.first)
==> map( -> [$date, $temperature ] {
state $last-temp;
LEAVE $last-temp = $temperature;
once next;
„$date, Δ{abs $last-temp - $temperature}°C“ if $temperature > $last-temp;
})
==> -> *@a { @a.join($?NL) }()
==> put();
First I use a regex with named captures to get hold of the date and temperature Str
s. Those are not overly helpful, as I need to sort by date. The 2nd map solves that problem with nested coercions in a destructuring sub-signature. As Match
contains a few extra methods that I don’t care for, I need to gobble those up with an anonymous hash slurpy. Now I have a LoL with a date and temperature sub-list, where the date is a Date
and the temperature is something Numeric
. I sort by the first and then destructure again. I use a state
container to keep a link between consecutive iteration steps. (To make this hyper
-friendly, we would need to .rotor
.) I always want $last-temp
to contain the $temperature
of the previous iteration but I don’t want to do anything else in the first iteration. Hence, the LEAVE
-phaser and the once
. Anything else means to create the output text. Since I don’t want a combo breaker, I use a pointy-block like we need to in a feed-operator-chain to add newlines where they belong.
If you managed to stuff more Raku-features into your solution, you out-convoluted me and I would love to see your code.
Joking aside, I believe to have another candidate for macro-ideas.txt
. If we look at the first and second map, there is a pattern. We use the same named-arguments in both. With RakuAST it might be possible to provide a Regex
, a block and a list of coercions, to produce a Sub
that does that in one go. That would be a neat shortcut for simple parsers that deal with lines of text.
-
September 12, 2022 at 14:242022.37 More videos – Rakudo Weekly News