diff options
| -rw-r--r-- | challenge-206/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-206/arne-sommer/raku/array-pairings | 38 | ||||
| -rwxr-xr-x | challenge-206/arne-sommer/raku/array-pairings-half | 42 | ||||
| -rwxr-xr-x | challenge-206/arne-sommer/raku/ch-1.raku | 57 | ||||
| -rwxr-xr-x | challenge-206/arne-sommer/raku/ch-2.raku | 42 | ||||
| -rwxr-xr-x | challenge-206/arne-sommer/raku/shortest-time | 48 | ||||
| -rwxr-xr-x | challenge-206/arne-sommer/raku/shortest-time-class | 57 |
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; |
