diff options
| author | Mark Anderson <mark@andemark.io> | 2024-06-23 19:29:37 +0000 |
|---|---|---|
| committer | Mark Anderson <mark@andemark.io> | 2024-06-23 19:29:37 +0000 |
| commit | b490fdbec2abe1c2c620a75de6e14a6f83bc7317 (patch) | |
| tree | 34c1ec9165fdccc4c800ce7785b19a9cd6344172 | |
| parent | c0313e99af1ce5f24179bce037baa33f28e80f84 (diff) | |
| download | perlweeklychallenge-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.raku | 2 | ||||
| -rw-r--r-- | challenge-274/mark-anderson/raku/ch-2.raku | 33 |
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 } |
