aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Anderson <mark@andemark.io>2024-06-23 19:29:37 +0000
committerMark Anderson <mark@andemark.io>2024-06-23 19:29:37 +0000
commitb490fdbec2abe1c2c620a75de6e14a6f83bc7317 (patch)
tree34c1ec9165fdccc4c800ce7785b19a9cd6344172
parentc0313e99af1ce5f24179bce037baa33f28e80f84 (diff)
downloadperlweeklychallenge-club-b490fdbec2abe1c2c620a75de6e14a6f83bc7317.tar.gz
perlweeklychallenge-club-b490fdbec2abe1c2c620a75de6e14a6f83bc7317.tar.bz2
perlweeklychallenge-club-b490fdbec2abe1c2c620a75de6e14a6f83bc7317.zip
Challenge 274 Solutions (Raku)
-rw-r--r--challenge-274/mark-anderson/raku/ch-1.raku2
-rw-r--r--challenge-274/mark-anderson/raku/ch-2.raku33
2 files changed, 10 insertions, 25 deletions
diff --git a/challenge-274/mark-anderson/raku/ch-1.raku b/challenge-274/mark-anderson/raku/ch-1.raku
index 63616835e6..f8e03dc39a 100644
--- a/challenge-274/mark-anderson/raku/ch-1.raku
+++ b/challenge-274/mark-anderson/raku/ch-1.raku
@@ -5,7 +5,7 @@ grammar Goat-Latin
{
has @.words;
- token TOP { [<.vowel> || <.consonant>]* % ' ' }
+ token TOP { [<.vowel> || <.consonant>]* % ' ' }
token vowel { :i <[aeiou]> <.alpha>* { @.words.push: ~$/ ~ "maa" ~ "a" x @.words } }
token consonant { :i <-[aeiou]> <.alpha>* { @.words.push: ~$/.comb.rotate.join ~ "maa" ~ "a" x @.words } }
}
diff --git a/challenge-274/mark-anderson/raku/ch-2.raku b/challenge-274/mark-anderson/raku/ch-2.raku
index 5947529783..b57d36d2bb 100644
--- a/challenge-274/mark-anderson/raku/ch-2.raku
+++ b/challenge-274/mark-anderson/raku/ch-2.raku
@@ -6,34 +6,19 @@ is-deeply bus-route([[12,3,41],[15,9,35],[30,5,25]]), (0,1,2,3,25,26,27,40,41,42
sub bus-route(@r)
{
- @r .= map(&schedule);
-
- gather for ^60 [Z] [Z] @r -> ($minute, $routes)
+ gather for ^60 -> $minute
{
- given $routes.sort({ abs($minute - .<depart>), .<arrive> }) -> $routes
- {
- my @arrivals = $routes>>.<arrive>;
-
- if @arrivals.head >= 60
- {
- @arrivals = @arrivals >>mod>> 60
- }
+ my $arrivals := @r.map({ schedule($_, $minute) })
+ .sort({ .[0], .[1] })
+ .map({ .[1] });
- next if @arrivals.head == @arrivals.min;
-
- take $minute
- }
+ take $minute if $arrivals[0] > any($arrivals[1..*])
}
}
-sub schedule([$interval, $depart, $duration])
+sub schedule([$interval, $depart, $duration], $minute)
{
- my $departures := $depart, $depart + $interval...60;
-
- my $schedule = do for flat map { $_ xx $interval }, $departures
- {
- .Map given :depart($_), :arrive($_ + $duration)
- }
-
- $schedule.rotate($interval - $depart - 1)
+ my $departures := $depart, $depart + $interval ... 1000;
+ my $next = $departures.first(* >= $minute);
+ $next, $next + $duration
}