aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-274/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-274/arne-sommer/raku/bus-route80
-rwxr-xr-xchallenge-274/arne-sommer/raku/ch-1.raku16
-rwxr-xr-xchallenge-274/arne-sommer/raku/ch-2.raku80
-rwxr-xr-xchallenge-274/arne-sommer/raku/goat-latin16
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;
+}