diff options
| -rw-r--r-- | challenge-187/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-187/arne-sommer/raku/ch-1.raku | 39 | ||||
| -rwxr-xr-x | challenge-187/arne-sommer/raku/ch-2.raku | 32 | ||||
| -rwxr-xr-x | challenge-187/arne-sommer/raku/days-together | 39 | ||||
| -rwxr-xr-x | challenge-187/arne-sommer/raku/magical-triplets | 32 |
5 files changed, 143 insertions, 0 deletions
diff --git a/challenge-187/arne-sommer/blog.txt b/challenge-187/arne-sommer/blog.txt new file mode 100644 index 0000000000..1b0746e883 --- /dev/null +++ b/challenge-187/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/magical-together.html diff --git a/challenge-187/arne-sommer/raku/ch-1.raku b/challenge-187/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..e8558a7323 --- /dev/null +++ b/challenge-187/arne-sommer/raku/ch-1.raku @@ -0,0 +1,39 @@ +#! /usr/bin/env raku + +unit sub MAIN (:v(:$verbose)); + +my $year = 2022; + +say days-together({ 'Foo' => { 'SD' => '12-01', 'ED' => '20-01' }, + 'Bar' => { 'SD' => '15-01', 'ED' => '18-01' }}); + + +say days-together({ 'Foo' => { 'SD' => '02-03', 'ED' => '12-03' }, + 'Bar' => { 'SD' => '13-03', 'ED' => '14-03' }}); + + +say days-together({ 'Foo' => { 'SD' => '02-03', 'ED' => '12-03' }, + 'Bar' => { 'SD' => '11-03', 'ED' => '15-03' }}); + +say days-together({ 'Foo' => { 'SD' => '30-03', 'ED' => '05-04' }, + 'Bar' => { 'SD' => '28-03', 'ED' => '02-04' }}); + + +sub days-together ($struct) +{ + my $sf = Date.new($year ~ "-" ~ $struct<Foo>.<SD>.split("-").reverse.join("-")).day-of-year; + my $ef = Date.new($year ~ "-" ~ $struct<Foo>.<ED>.split("-").reverse.join("-")).day-of-year; + my $sb = Date.new($year ~ "-" ~ $struct<Bar>.<SD>.split("-").reverse.join("-")).day-of-year; + my $eb = Date.new($year ~ "-" ~ $struct<Bar>.<ED>.split("-").reverse.join("-")).day-of-year; + + say ": $sf, $ef, $sb, $eb" if $verbose; + + return 0 if $sf > $eb; + return 0 if $sb > $ef; + + my $start = max($sf, $sb); + my $end = min($ef, $eb); + + return $end - $start + 1; +} + diff --git a/challenge-187/arne-sommer/raku/ch-2.raku b/challenge-187/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..fb6b7ea31d --- /dev/null +++ b/challenge-187/arne-sommer/raku/ch-2.raku @@ -0,0 +1,32 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@n where @n.elems >= 3, :v(:$verbose)); + +my $max = @n.combinations(3)>>.sum.max; + +say ":Max: $max" if $verbose; + +# my @candidates = @n.combinations(3)>>.permutations[*;*].unique(:with(&[eqv])); +my @candidates = @n>>.Int.combinations(3)>>.permutations[*;*].unique(:with(&[eqv])); + +say ":Permutations: { @candidates.raku }" if $verbose; + +my @ok = @candidates.grep( { $_[0] + $_[1] > $_[2] && + $_[1] + $_[2] > $_[0] && + $_[0] + $_[2] > $_[1] && + $_.sum == $max }); + +say ":Rule 1-4 applied: { @ok.raku }" if $verbose; + +if @ok.elems == 0 +{ + say "()"; +} +elsif @ok.elems == 1 +{ + say "(", @ok[0].join(", "), ")"; +} +else +{ + say "(", @ok.grep( { $_[0] >= $_[1] >= $_[2] })[0].join(", "), ")"; +} diff --git a/challenge-187/arne-sommer/raku/days-together b/challenge-187/arne-sommer/raku/days-together new file mode 100755 index 0000000000..e8558a7323 --- /dev/null +++ b/challenge-187/arne-sommer/raku/days-together @@ -0,0 +1,39 @@ +#! /usr/bin/env raku + +unit sub MAIN (:v(:$verbose)); + +my $year = 2022; + +say days-together({ 'Foo' => { 'SD' => '12-01', 'ED' => '20-01' }, + 'Bar' => { 'SD' => '15-01', 'ED' => '18-01' }}); + + +say days-together({ 'Foo' => { 'SD' => '02-03', 'ED' => '12-03' }, + 'Bar' => { 'SD' => '13-03', 'ED' => '14-03' }}); + + +say days-together({ 'Foo' => { 'SD' => '02-03', 'ED' => '12-03' }, + 'Bar' => { 'SD' => '11-03', 'ED' => '15-03' }}); + +say days-together({ 'Foo' => { 'SD' => '30-03', 'ED' => '05-04' }, + 'Bar' => { 'SD' => '28-03', 'ED' => '02-04' }}); + + +sub days-together ($struct) +{ + my $sf = Date.new($year ~ "-" ~ $struct<Foo>.<SD>.split("-").reverse.join("-")).day-of-year; + my $ef = Date.new($year ~ "-" ~ $struct<Foo>.<ED>.split("-").reverse.join("-")).day-of-year; + my $sb = Date.new($year ~ "-" ~ $struct<Bar>.<SD>.split("-").reverse.join("-")).day-of-year; + my $eb = Date.new($year ~ "-" ~ $struct<Bar>.<ED>.split("-").reverse.join("-")).day-of-year; + + say ": $sf, $ef, $sb, $eb" if $verbose; + + return 0 if $sf > $eb; + return 0 if $sb > $ef; + + my $start = max($sf, $sb); + my $end = min($ef, $eb); + + return $end - $start + 1; +} + diff --git a/challenge-187/arne-sommer/raku/magical-triplets b/challenge-187/arne-sommer/raku/magical-triplets new file mode 100755 index 0000000000..fb6b7ea31d --- /dev/null +++ b/challenge-187/arne-sommer/raku/magical-triplets @@ -0,0 +1,32 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@n where @n.elems >= 3, :v(:$verbose)); + +my $max = @n.combinations(3)>>.sum.max; + +say ":Max: $max" if $verbose; + +# my @candidates = @n.combinations(3)>>.permutations[*;*].unique(:with(&[eqv])); +my @candidates = @n>>.Int.combinations(3)>>.permutations[*;*].unique(:with(&[eqv])); + +say ":Permutations: { @candidates.raku }" if $verbose; + +my @ok = @candidates.grep( { $_[0] + $_[1] > $_[2] && + $_[1] + $_[2] > $_[0] && + $_[0] + $_[2] > $_[1] && + $_.sum == $max }); + +say ":Rule 1-4 applied: { @ok.raku }" if $verbose; + +if @ok.elems == 0 +{ + say "()"; +} +elsif @ok.elems == 1 +{ + say "(", @ok[0].join(", "), ")"; +} +else +{ + say "(", @ok.grep( { $_[0] >= $_[1] >= $_[2] })[0].join(", "), ")"; +} |
