aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-187/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-187/arne-sommer/raku/ch-1.raku39
-rwxr-xr-xchallenge-187/arne-sommer/raku/ch-2.raku32
-rwxr-xr-xchallenge-187/arne-sommer/raku/days-together39
-rwxr-xr-xchallenge-187/arne-sommer/raku/magical-triplets32
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(", "), ")";
+}