diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2024-06-23 17:54:23 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-23 17:54:23 +0100 |
| commit | 30043caab92fa001aaeba3fdebf0636ebf210c06 (patch) | |
| tree | 18090c20c5b279ba05fa6b301c6a4309f61cf20a | |
| parent | 3eabc6518905efbf4fa490561c6ca754ee6920f5 (diff) | |
| parent | 2d02116e61f83cc3bf305f989ef37a6b1f727166 (diff) | |
| download | perlweeklychallenge-club-30043caab92fa001aaeba3fdebf0636ebf210c06.tar.gz perlweeklychallenge-club-30043caab92fa001aaeba3fdebf0636ebf210c06.tar.bz2 perlweeklychallenge-club-30043caab92fa001aaeba3fdebf0636ebf210c06.zip | |
Merge pull request #10305 from arnesom/branch-for-challenge-274
Branch for challenge 274
| -rw-r--r-- | challenge-274/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-274/arne-sommer/raku/bus-route | 80 | ||||
| -rwxr-xr-x | challenge-274/arne-sommer/raku/ch-1.raku | 16 | ||||
| -rwxr-xr-x | challenge-274/arne-sommer/raku/ch-2.raku | 80 | ||||
| -rwxr-xr-x | challenge-274/arne-sommer/raku/goat-latin | 16 |
5 files changed, 193 insertions, 0 deletions
diff --git a/challenge-274/arne-sommer/blog.txt b/challenge-274/arne-sommer/blog.txt new file mode 100644 index 0000000000..0ca62becb1 --- /dev/null +++ b/challenge-274/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/goat-bus.html diff --git a/challenge-274/arne-sommer/raku/bus-route b/challenge-274/arne-sommer/raku/bus-route new file mode 100755 index 0000000000..10e7b013d7 --- /dev/null +++ b/challenge-274/arne-sommer/raku/bus-route @@ -0,0 +1,80 @@ +#! /usr/bin/env raku + +unit sub MAIN (Str $routestr = "12 11 41 | 15 5 35", :v(:$verbose)); + +my @routes = $routestr.split("|")>>.words>>.Numeric; + +die "All the routes must have three integers each" unless all(@routes>>.elems) == 3; +die "Non-negative integers only" unless all(@routes[*;*]) ~~ UInt; + +my @departures; + +for @routes -> @route +{ + state $rid = 0; $rid++; + my $interval = @route[0]; + my $offset = @route[1]; + my $duration = @route[2]; + + say ": Route: $rid Interval: $interval Offset: $offset Duration: $duration" if $verbose; + + die "Route $rid: Interval does not comply with 60 min rule" unless 60 %% $interval; + die "Route $rid: Interval must be positive" unless $interval > 0; + + my $min = $offset; + + while $min < 60 + { + @departures.push: { dept => $min, route => $rid, arrival => $min + $duration }; + + $min += $interval; + } +} + +my @sorted = @departures.sort({ $^a<dept> <=> $^b<dept> || $^a<arrival> <=> $^b<arrival> || $^a<route> <=> $^b<route> }); + +if $verbose +{ + for @sorted -> %dep + { + say ": Departure at { %dep<dept>.fmt('%02d') }: route %dep<route> arrive at %dep<arrival>"; + } +} + +exit if $verbose && $verbose eq '2'; + +my @skip; + +for 0 .. 59 -> $min +{ + my @todo = @sorted.grep( *<dept> >= $min ); + + unless @todo.elems + { + if @skip && @skip[0] == 0 + { + @skip.push: $min; + say ": Min:$min (no more departures this hour, and we skipped the first one this hour) * skip" if $verbose; + } + elsif $verbose + { + say ": Min:$min (no more departures this hour, and we took the first one this hour) - first"; + } + next; + } + + my %first = @todo.shift; + my %wait_to = %first; + + for @todo -> %dept + { + %wait_to = %dept if %dept<arrival> < %wait_to<arrival>; + } + + my $ok = %first eqv %wait_to; + + @skip.push: $min if !$ok; + say ": Min:{ $min.fmt('%02d') }: { $min == %wait_to<dept> ?? "" !! "wait to %wait_to<dept>" } take route %wait_to<route> and arrive at %wait_to<arrival> { $ok ?? "- first" !! "* skip" }" if $verbose; +} + +say "[{ @skip.join(", ") }]"; diff --git a/challenge-274/arne-sommer/raku/ch-1.raku b/challenge-274/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..101b68ecc3 --- /dev/null +++ b/challenge-274/arne-sommer/raku/ch-1.raku @@ -0,0 +1,16 @@ +#! /usr/bin/env raku + +unit sub MAIN ($sentence where $sentence.chars > 0); + +say $sentence.words.map( *.&goatify-word ).join(" "); + +sub goatify-word ($word is copy) +{ + state $add = 2; + + $word = $word.substr(1) ~ $word.substr(0,1) if $word !~~ /^<[aeiou]>/; + + $word ~= "m" ~ "a" x $add++; + + return $word; +} diff --git a/challenge-274/arne-sommer/raku/ch-2.raku b/challenge-274/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..10e7b013d7 --- /dev/null +++ b/challenge-274/arne-sommer/raku/ch-2.raku @@ -0,0 +1,80 @@ +#! /usr/bin/env raku + +unit sub MAIN (Str $routestr = "12 11 41 | 15 5 35", :v(:$verbose)); + +my @routes = $routestr.split("|")>>.words>>.Numeric; + +die "All the routes must have three integers each" unless all(@routes>>.elems) == 3; +die "Non-negative integers only" unless all(@routes[*;*]) ~~ UInt; + +my @departures; + +for @routes -> @route +{ + state $rid = 0; $rid++; + my $interval = @route[0]; + my $offset = @route[1]; + my $duration = @route[2]; + + say ": Route: $rid Interval: $interval Offset: $offset Duration: $duration" if $verbose; + + die "Route $rid: Interval does not comply with 60 min rule" unless 60 %% $interval; + die "Route $rid: Interval must be positive" unless $interval > 0; + + my $min = $offset; + + while $min < 60 + { + @departures.push: { dept => $min, route => $rid, arrival => $min + $duration }; + + $min += $interval; + } +} + +my @sorted = @departures.sort({ $^a<dept> <=> $^b<dept> || $^a<arrival> <=> $^b<arrival> || $^a<route> <=> $^b<route> }); + +if $verbose +{ + for @sorted -> %dep + { + say ": Departure at { %dep<dept>.fmt('%02d') }: route %dep<route> arrive at %dep<arrival>"; + } +} + +exit if $verbose && $verbose eq '2'; + +my @skip; + +for 0 .. 59 -> $min +{ + my @todo = @sorted.grep( *<dept> >= $min ); + + unless @todo.elems + { + if @skip && @skip[0] == 0 + { + @skip.push: $min; + say ": Min:$min (no more departures this hour, and we skipped the first one this hour) * skip" if $verbose; + } + elsif $verbose + { + say ": Min:$min (no more departures this hour, and we took the first one this hour) - first"; + } + next; + } + + my %first = @todo.shift; + my %wait_to = %first; + + for @todo -> %dept + { + %wait_to = %dept if %dept<arrival> < %wait_to<arrival>; + } + + my $ok = %first eqv %wait_to; + + @skip.push: $min if !$ok; + say ": Min:{ $min.fmt('%02d') }: { $min == %wait_to<dept> ?? "" !! "wait to %wait_to<dept>" } take route %wait_to<route> and arrive at %wait_to<arrival> { $ok ?? "- first" !! "* skip" }" if $verbose; +} + +say "[{ @skip.join(", ") }]"; diff --git a/challenge-274/arne-sommer/raku/goat-latin b/challenge-274/arne-sommer/raku/goat-latin new file mode 100755 index 0000000000..101b68ecc3 --- /dev/null +++ b/challenge-274/arne-sommer/raku/goat-latin @@ -0,0 +1,16 @@ +#! /usr/bin/env raku + +unit sub MAIN ($sentence where $sentence.chars > 0); + +say $sentence.words.map( *.&goatify-word ).join(" "); + +sub goatify-word ($word is copy) +{ + state $add = 2; + + $word = $word.substr(1) ~ $word.substr(0,1) if $word !~~ /^<[aeiou]>/; + + $word ~= "m" ~ "a" x $add++; + + return $word; +} |
