aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-206/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-206/arne-sommer/raku/array-pairings38
-rwxr-xr-xchallenge-206/arne-sommer/raku/array-pairings-half42
-rwxr-xr-xchallenge-206/arne-sommer/raku/ch-1.raku57
-rwxr-xr-xchallenge-206/arne-sommer/raku/ch-2.raku42
-rwxr-xr-xchallenge-206/arne-sommer/raku/shortest-time48
-rwxr-xr-xchallenge-206/arne-sommer/raku/shortest-time-class57
7 files changed, 285 insertions, 0 deletions
diff --git a/challenge-206/arne-sommer/blog.txt b/challenge-206/arne-sommer/blog.txt
new file mode 100644
index 0000000000..45c402e88a
--- /dev/null
+++ b/challenge-206/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/paired-time.html
diff --git a/challenge-206/arne-sommer/raku/array-pairings b/challenge-206/arne-sommer/raku/array-pairings
new file mode 100755
index 0000000000..14e595ba0e
--- /dev/null
+++ b/challenge-206/arne-sommer/raku/array-pairings
@@ -0,0 +1,38 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@array where @array.elems >= 2 && @array.elems %% 2 && all(@array) ~~ /^<[0..9]>*$/, :v($verbose));
+
+my @permutations = @array.permutations;
+
+say ": Permutations: { @permutations.join("|") }" if $verbose;
+
+my $max = -Inf;
+
+for @permutations -> @candidate
+{
+ my $sum = max-sum-min-pair(@candidate);
+
+ $max = max($max, $sum);
+}
+
+say $max;
+
+sub max-sum-min-pair (@array is copy)
+{
+ my $sum = 0;
+
+ my $echo = $verbose ?? ":Candidate: { @array.join(",") } Pairs:" !! "";
+
+ while @array.elems
+ {
+ my $first = @array.shift;
+ my $second = @array.shift;
+ my $minimum = min($first, $second);
+ $echo ~= "[$first,$second -> $minimum]" if $verbose;
+ $sum += $minimum;
+ }
+
+ say "$echo -> Sum: $sum" if $verbose;
+
+ return $sum;
+}
diff --git a/challenge-206/arne-sommer/raku/array-pairings-half b/challenge-206/arne-sommer/raku/array-pairings-half
new file mode 100755
index 0000000000..7d467861fc
--- /dev/null
+++ b/challenge-206/arne-sommer/raku/array-pairings-half
@@ -0,0 +1,42 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@array where @array.elems >= 2 && @array.elems %% 2 && all(@array) ~~ /^<[0..9]>*$/, :v($verbose));
+
+my @permutations = @array.permutations;
+
+say ": Permutations: { @permutations.join("|") }" if $verbose;
+
+my $max = -Inf;
+
+for @permutations -> @candidate
+{
+ state $index = 0;
+ $index++;
+ next if $index %% 2;
+
+ my $sum = max-sum-min-pair(@candidate);
+
+ $max = max($max, $sum);
+}
+
+say $max;
+
+sub max-sum-min-pair (@array is copy)
+{
+ my $sum = 0;
+
+ my $echo = $verbose ?? ":Candidate: { @array.join(",") } Pairs:" !! "";
+
+ while @array.elems
+ {
+ my $first = @array.shift;
+ my $second = @array.shift;
+ my $minimum = min($first, $second);
+ $echo ~= "[$first,$second -> $minimum]" if $verbose;
+ $sum += $minimum;
+ }
+
+ say "$echo -> Sum: $sum" if $verbose;
+
+ return $sum;
+}
diff --git a/challenge-206/arne-sommer/raku/ch-1.raku b/challenge-206/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..2ab21eceee
--- /dev/null
+++ b/challenge-206/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,57 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@time where @time.elems >= 2 && all(@time) ~~ /^<[012]><[0..9]>\:<[0..5]><[0..9]>$/, :v($verbose));
+
+class HHMM
+{
+ has UInt $.hh is rw where 0 <= $_ <= 23;
+ has UInt $.mm is rw where 0 <= $_ <= 59;
+
+ method minutes
+ {
+ return $.hh * 60 + $.mm;
+ }
+
+ method diff (HHMM $second)
+ {
+ my $diff = $second.minutes - $.minutes;
+ return 24 * 60 + $diff if $diff < 0;
+ return $diff;
+ }
+
+ method Str
+ {
+ return $.hh.fmt('%02d') ~ ":" ~ $.mm.fmt('%02d');
+ }
+}
+
+my @sorted = @time.sort.map({ HHMM.new(hh => $_.substr(0,2).UInt, mm => $_.substr(3,2).UInt) });
+
+say ": Sorted: { @sorted.join(", ") }" if $verbose;
+
+if (@sorted.elems > @sorted.unique.elems)
+{
+ say "0";
+ exit;
+}
+
+@sorted.push: @sorted.head if @sorted.elems > 2;
+
+say ": Sorted roundtrip: { @sorted.join(", ") }" if $verbose;
+
+my $shortest = Inf;
+my $first = @sorted.shift;
+my $second;
+
+while (@sorted)
+{
+ my $second = @sorted.shift;
+ my $diff = $first.diff($second);
+
+ $shortest = min($shortest, $diff);
+ say ": first:$first second: $second -> diff:$diff" if $verbose;
+
+ $first = $second;
+}
+
+say $shortest;
diff --git a/challenge-206/arne-sommer/raku/ch-2.raku b/challenge-206/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..7d467861fc
--- /dev/null
+++ b/challenge-206/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,42 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@array where @array.elems >= 2 && @array.elems %% 2 && all(@array) ~~ /^<[0..9]>*$/, :v($verbose));
+
+my @permutations = @array.permutations;
+
+say ": Permutations: { @permutations.join("|") }" if $verbose;
+
+my $max = -Inf;
+
+for @permutations -> @candidate
+{
+ state $index = 0;
+ $index++;
+ next if $index %% 2;
+
+ my $sum = max-sum-min-pair(@candidate);
+
+ $max = max($max, $sum);
+}
+
+say $max;
+
+sub max-sum-min-pair (@array is copy)
+{
+ my $sum = 0;
+
+ my $echo = $verbose ?? ":Candidate: { @array.join(",") } Pairs:" !! "";
+
+ while @array.elems
+ {
+ my $first = @array.shift;
+ my $second = @array.shift;
+ my $minimum = min($first, $second);
+ $echo ~= "[$first,$second -> $minimum]" if $verbose;
+ $sum += $minimum;
+ }
+
+ say "$echo -> Sum: $sum" if $verbose;
+
+ return $sum;
+}
diff --git a/challenge-206/arne-sommer/raku/shortest-time b/challenge-206/arne-sommer/raku/shortest-time
new file mode 100755
index 0000000000..cf689ef91f
--- /dev/null
+++ b/challenge-206/arne-sommer/raku/shortest-time
@@ -0,0 +1,48 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@time where @time.elems >= 2 && all(@time) ~~ /^<[012]><[0..9]>\:<[0..5]><[0..9]>$/, :v($verbose));
+
+my @sorted = @time.sort;
+
+say ": Sorted: { @sorted.join(", ") }" if $verbose;
+
+if (@sorted.elems > @sorted.unique.elems)
+{
+ say "0";
+ exit;
+}
+
+@sorted.push: @sorted.head if @sorted.elems > 2;
+
+say ": Sorted roundtrip: { @sorted.join(", ") }" if $verbose;
+
+my $shortest = Inf;
+my $first = @sorted.shift;
+my $second;
+
+while (@sorted)
+{
+ my $second = @sorted.shift;
+ my $diff = time-diff($first, $second);
+
+ $shortest = min($shortest, $diff);
+ say ": first:$first second: $second -> diff:$diff" if $verbose;
+
+ $first = $second;
+}
+
+say $shortest;
+
+sub time-diff ($first, $second)
+{
+ my ($first-h, $first-m) = $first.split(":");
+ my ($second-h, $second-m) = $second.split(":");
+
+ my $first-min = $first-h * 60 + $first-m;
+ my $second-min = $second-h * 60 + $second-m;
+
+ my $diff = ($second-min - $first-min);
+
+ return 24 * 60 + $diff if $diff < 0;
+ return $diff;
+}
diff --git a/challenge-206/arne-sommer/raku/shortest-time-class b/challenge-206/arne-sommer/raku/shortest-time-class
new file mode 100755
index 0000000000..2ab21eceee
--- /dev/null
+++ b/challenge-206/arne-sommer/raku/shortest-time-class
@@ -0,0 +1,57 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@time where @time.elems >= 2 && all(@time) ~~ /^<[012]><[0..9]>\:<[0..5]><[0..9]>$/, :v($verbose));
+
+class HHMM
+{
+ has UInt $.hh is rw where 0 <= $_ <= 23;
+ has UInt $.mm is rw where 0 <= $_ <= 59;
+
+ method minutes
+ {
+ return $.hh * 60 + $.mm;
+ }
+
+ method diff (HHMM $second)
+ {
+ my $diff = $second.minutes - $.minutes;
+ return 24 * 60 + $diff if $diff < 0;
+ return $diff;
+ }
+
+ method Str
+ {
+ return $.hh.fmt('%02d') ~ ":" ~ $.mm.fmt('%02d');
+ }
+}
+
+my @sorted = @time.sort.map({ HHMM.new(hh => $_.substr(0,2).UInt, mm => $_.substr(3,2).UInt) });
+
+say ": Sorted: { @sorted.join(", ") }" if $verbose;
+
+if (@sorted.elems > @sorted.unique.elems)
+{
+ say "0";
+ exit;
+}
+
+@sorted.push: @sorted.head if @sorted.elems > 2;
+
+say ": Sorted roundtrip: { @sorted.join(", ") }" if $verbose;
+
+my $shortest = Inf;
+my $first = @sorted.shift;
+my $second;
+
+while (@sorted)
+{
+ my $second = @sorted.shift;
+ my $diff = $first.diff($second);
+
+ $shortest = min($shortest, $diff);
+ say ": first:$first second: $second -> diff:$diff" if $verbose;
+
+ $first = $second;
+}
+
+say $shortest;