aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-124/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-124/arne-sommer/factors26
-rwxr-xr-xchallenge-124/arne-sommer/raku/ch-1.raku23
-rwxr-xr-xchallenge-124/arne-sommer/raku/ch-2.raku27
-rwxr-xr-xchallenge-124/arne-sommer/raku/happy-women-day20
-rwxr-xr-xchallenge-124/arne-sommer/raku/happy-women-day-any23
-rwxr-xr-xchallenge-124/arne-sommer/raku/happy-women-day-short3
-rwxr-xr-xchallenge-124/arne-sommer/raku/tow-dispatcher21
-rwxr-xr-xchallenge-124/arne-sommer/raku/tow-dispatcher221
-rwxr-xr-xchallenge-124/arne-sommer/raku/tow-dispatcher327
-rwxr-xr-xchallenge-124/arne-sommer/raku/tug-of-war38
-rwxr-xr-xchallenge-124/arne-sommer/raku/tug-of-war-bag36
-rwxr-xr-xchallenge-124/arne-sommer/raku/tug-of-war-sum37
-rwxr-xr-xchallenge-124/arne-sommer/raku/tug-of-war-sum-plain27
-rwxr-xr-xchallenge-124/arne-sommer/raku/tug-of-war-zero20
15 files changed, 324 insertions, 26 deletions
diff --git a/challenge-124/arne-sommer/blog.txt b/challenge-124/arne-sommer/blog.txt
new file mode 100644
index 0000000000..b6d08b0450
--- /dev/null
+++ b/challenge-124/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/happy-tug.html
diff --git a/challenge-124/arne-sommer/factors b/challenge-124/arne-sommer/factors
deleted file mode 100755
index f21d97536f..0000000000
--- a/challenge-124/arne-sommer/factors
+++ /dev/null
@@ -1,26 +0,0 @@
-#! /usr/bin/env raku
-
-unit sub MAIN (Int $number where $number > 0, :u(:$upto));
-
-$upto
- ?? ( say "$_: " ~ factors($_) for 1..$number )
- !! say factors($number);
-
-sub factors ($number is copy)
-{
- return (1) if $number == 1;
- return ($number) if $number.is-prime;
-
- my @factors;
-
- for (2 .. $number div 2).grep( *.is-prime) -> $candidate
- {
- while $number %% $candidate
- {
- @factors.push: $candidate;
- $number /= $candidate;
- }
- }
-
- return @factors;
-}
diff --git a/challenge-124/arne-sommer/raku/ch-1.raku b/challenge-124/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..f04fe58f1b
--- /dev/null
+++ b/challenge-124/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,23 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $char where $char.chars == 1);
+
+"
+ ^^^^^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^^^^^
+ ^
+ ^
+ ^
+ ^^^^^
+ ^
+ ^
+".subst('^', $char, :g).substr(1).print;
diff --git a/challenge-124/arne-sommer/raku/ch-2.raku b/challenge-124/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..68f5e0deb7
--- /dev/null
+++ b/challenge-124/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,27 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@n where @n.elems > 0 &&
+ all(@n) ~~ Int &&
+ @n.elems == @n.unique.elems);
+
+my $best = Inf;
+my @subset1;
+my $sum = @n.sum;
+
+for @n.combinations(@n.elems / 2) -> @first
+{
+ my @second = (@n (-) @first).keys.sort;
+
+ my $difference = ($sum - @first.sum).abs;
+
+ if $difference < $best
+ {
+ $best = $difference;
+ @subset1 = @first;
+
+ last if $best == 0;
+ }
+}
+
+say "Subset 1 = ({ @subset1.join(", ") })";
+say "Subset 2 = ({ (@n (-) @subset1).keys.sort.join(", ") })";
diff --git a/challenge-124/arne-sommer/raku/happy-women-day b/challenge-124/arne-sommer/raku/happy-women-day
new file mode 100755
index 0000000000..5e016c1a5a
--- /dev/null
+++ b/challenge-124/arne-sommer/raku/happy-women-day
@@ -0,0 +1,20 @@
+#! /usr/bin/env raku
+
+" ^^^^^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^^^^^
+ ^
+ ^
+ ^
+ ^^^^^
+ ^
+ ^
+".print;
diff --git a/challenge-124/arne-sommer/raku/happy-women-day-any b/challenge-124/arne-sommer/raku/happy-women-day-any
new file mode 100755
index 0000000000..f04fe58f1b
--- /dev/null
+++ b/challenge-124/arne-sommer/raku/happy-women-day-any
@@ -0,0 +1,23 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $char where $char.chars == 1);
+
+"
+ ^^^^^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^ ^
+ ^^^^^
+ ^
+ ^
+ ^
+ ^^^^^
+ ^
+ ^
+".subst('^', $char, :g).substr(1).print;
diff --git a/challenge-124/arne-sommer/raku/happy-women-day-short b/challenge-124/arne-sommer/raku/happy-women-day-short
new file mode 100755
index 0000000000..1f24c1e5c2
--- /dev/null
+++ b/challenge-124/arne-sommer/raku/happy-women-day-short
@@ -0,0 +1,3 @@
+#! /usr/bin/env raku
+
+say "♀";
diff --git a/challenge-124/arne-sommer/raku/tow-dispatcher b/challenge-124/arne-sommer/raku/tow-dispatcher
new file mode 100755
index 0000000000..fb0c7ec383
--- /dev/null
+++ b/challenge-124/arne-sommer/raku/tow-dispatcher
@@ -0,0 +1,21 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@n where @n.elems > 0 && all(@n) ~~ Int, :v(:$verbose));
+
+my @subset1;
+my @subset2;
+
+for @n.sort -> $current
+{
+ @subset1.sum <= @subset2.sum
+ ?? @subset1.push: $current
+ !! @subset2.push: $current;
+}
+
+my $sum1 = @subset1.sum;
+my $sum2 = @subset2.sum;
+
+say "Subset 1 = ({ @subset1.join(", ") }){ $verbose ?? " (sum: $sum1)" !! "" }";
+say "Subset 2 = ({ @subset2.join(", ") }){ $verbose ?? " (sum: $sum2)" !! "" }";
+
+say ": Difference: { ($sum1 - $sum2).abs }" if $verbose;
diff --git a/challenge-124/arne-sommer/raku/tow-dispatcher2 b/challenge-124/arne-sommer/raku/tow-dispatcher2
new file mode 100755
index 0000000000..0e850493b4
--- /dev/null
+++ b/challenge-124/arne-sommer/raku/tow-dispatcher2
@@ -0,0 +1,21 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@n where @n.elems > 0 && all(@n) ~~ Int, :v(:$verbose));
+
+my @subset1;
+my @subset2;
+
+for @n.sort -> $current
+{
+ @subset1.sum <= @subset2.sum && @subset1.elems <= @subset2.elems
+ ?? @subset1.push: $current
+ !! @subset2.push: $current;
+}
+
+my $sum1 = @subset1.sum;
+my $sum2 = @subset2.sum;
+
+say "Subset 1 = ({ @subset1.join(", ") }){ $verbose ?? " (sum: $sum1)" !! "" }";
+say "Subset 2 = ({ @subset2.join(", ") }){ $verbose ?? " (sum: $sum2)" !! "" }";
+
+say ": Difference: { ($sum1 - $sum2).abs }" if $verbose;
diff --git a/challenge-124/arne-sommer/raku/tow-dispatcher3 b/challenge-124/arne-sommer/raku/tow-dispatcher3
new file mode 100755
index 0000000000..808628fc45
--- /dev/null
+++ b/challenge-124/arne-sommer/raku/tow-dispatcher3
@@ -0,0 +1,27 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@n where @n.elems > 0 && all(@n) ~~ Int, :v(:$verbose));
+
+my @subset1;
+my @subset2;
+
+my @sorted = @n.sort;
+
+while (1)
+{
+ last unless @sorted; @subset1.push(@sorted.shift);
+ last unless @sorted; @subset2.push(@sorted.shift);
+ last unless @sorted; @subset1.push(@sorted.pop);
+ last unless @sorted; @subset2.push(@sorted.pop);
+
+# say ":: @subset1[] || @subset2[] ::";
+
+}
+
+my $sum1 = @subset1.sum;
+my $sum2 = @subset2.sum;
+
+say "Subset 1 = ({ @subset1.sort.join(", ") }){ $verbose ?? " (sum: $sum1)" !! "" }";
+say "Subset 2 = ({ @subset2.sort.join(", ") }){ $verbose ?? " (sum: $sum2)" !! "" }";
+
+say ": Difference: { ($sum1 - $sum2).abs }" if $verbose;
diff --git a/challenge-124/arne-sommer/raku/tug-of-war b/challenge-124/arne-sommer/raku/tug-of-war
new file mode 100755
index 0000000000..42ff835892
--- /dev/null
+++ b/challenge-124/arne-sommer/raku/tug-of-war
@@ -0,0 +1,38 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@n where @n.elems > 0 &&
+ all(@n) ~~ Int &&
+ @n.elems == @n.unique.elems,
+ :v(:$verbose),
+ :a(:$all));
+
+my $best = Inf;
+my @subset1;
+my @subset2;
+
+for @n.combinations(@n.elems / 2) -> @first
+{
+ my @second = (@n (-) @first).keys.sort;
+
+ my $difference = (@first.sum - @second.sum).abs;
+
+ if $difference < $best
+ {
+ say ": { @first.join(", ") } - { @second.join(", ") } = $difference [BEST]" if $verbose;
+
+ $best = $difference;
+ @subset1 = @first;
+ @subset2 = @second;
+
+ last if $best == 0 && !$all;
+ }
+ else
+ {
+ say ": { @first.join(", ") } - { @second.join(", ") } = $difference" if $verbose;
+ }
+}
+
+say "Subset 1 = ({ @subset1.join(", ") })";
+say "Subset 2 = ({ @subset2.join(", ") })";
+
+say ": Difference: $best" if $verbose;
diff --git a/challenge-124/arne-sommer/raku/tug-of-war-bag b/challenge-124/arne-sommer/raku/tug-of-war-bag
new file mode 100755
index 0000000000..ca37e19bed
--- /dev/null
+++ b/challenge-124/arne-sommer/raku/tug-of-war-bag
@@ -0,0 +1,36 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@n where @n.elems > 0 && all(@n) ~~ Int,
+ :v(:$verbose),
+ :a(:$all));
+
+my $best = Inf;
+my @subset1;
+my @subset2;
+
+for @n.combinations(@n.elems / 2) -> @first
+{
+ my @second = (@n (-) @first.Bag).kxxv.sort;
+
+ my $difference = (@first.sum - @second.sum).abs;
+
+ if $difference < $best
+ {
+ say ": { @first.join(", ") } - { @second.join(", ") } = $difference [BEST]" if $verbose;
+
+ $best = $difference;
+ @subset1 = @first;
+ @subset2 = @second;
+
+ last if $best == 0 && !$all;
+ }
+ else
+ {
+ say ": { @first.join(", ") } - { @second.join(", ") } = $difference" if $verbose;
+ }
+}
+
+say "Subset 1 = ({ @subset1.join(", ") })";
+say "Subset 2 = ({ @subset2.join(", ") })";
+
+say ": Difference: $best" if $verbose;
diff --git a/challenge-124/arne-sommer/raku/tug-of-war-sum b/challenge-124/arne-sommer/raku/tug-of-war-sum
new file mode 100755
index 0000000000..74f31a0c60
--- /dev/null
+++ b/challenge-124/arne-sommer/raku/tug-of-war-sum
@@ -0,0 +1,37 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@n where @n.elems > 0 &&
+ all(@n) ~~ Int &&
+ @n.elems == @n.unique.elems,
+ :v(:$verbose),
+ :a(:$all));
+
+my $best = Inf;
+my @subset1;
+my $sum = @n.sum;
+
+for @n.combinations(@n.elems / 2) -> @first
+{
+ my @second = (@n (-) @first).keys.sort;
+
+ my $difference = ($sum - @first.sum).abs;
+
+ if $difference < $best
+ {
+ say ": { @first.join(", ") } - { (@n (-) @first).keys.sort.join(", ") } = $difference [BEST]" if $verbose;
+
+ $best = $difference;
+ @subset1 = @first;
+
+ last if $best == 0 && !$all;
+ }
+ else
+ {
+ say ": { @first.join(", ") } - { (@n (-) @first).keys.sort.join(", ") } = $difference" if $verbose;
+ }
+}
+
+say "Subset 1 = ({ @subset1.join(", ") })";
+say "Subset 2 = ({ (@n (-) @subset1).keys.sort.join(", ") })";
+
+say ": Difference: $best" if $verbose;
diff --git a/challenge-124/arne-sommer/raku/tug-of-war-sum-plain b/challenge-124/arne-sommer/raku/tug-of-war-sum-plain
new file mode 100755
index 0000000000..68f5e0deb7
--- /dev/null
+++ b/challenge-124/arne-sommer/raku/tug-of-war-sum-plain
@@ -0,0 +1,27 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@n where @n.elems > 0 &&
+ all(@n) ~~ Int &&
+ @n.elems == @n.unique.elems);
+
+my $best = Inf;
+my @subset1;
+my $sum = @n.sum;
+
+for @n.combinations(@n.elems / 2) -> @first
+{
+ my @second = (@n (-) @first).keys.sort;
+
+ my $difference = ($sum - @first.sum).abs;
+
+ if $difference < $best
+ {
+ $best = $difference;
+ @subset1 = @first;
+
+ last if $best == 0;
+ }
+}
+
+say "Subset 1 = ({ @subset1.join(", ") })";
+say "Subset 2 = ({ (@n (-) @subset1).keys.sort.join(", ") })";
diff --git a/challenge-124/arne-sommer/raku/tug-of-war-zero b/challenge-124/arne-sommer/raku/tug-of-war-zero
new file mode 100755
index 0000000000..770d4da1a7
--- /dev/null
+++ b/challenge-124/arne-sommer/raku/tug-of-war-zero
@@ -0,0 +1,20 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (*@n where @n.elems > 0 &&
+ all(@n) ~~ Int, # &&
+ # @n.elems == @n.unique.elems,
+ :v(:$verbose));
+
+my $half-sum = @n.sum / 2;
+
+if $verbose
+{
+ say ": Half sum: $half-sum";
+ say ": Combinations: ", @n.combinations(@n.elems / 2);
+ say ": Sums: ", @n.combinations(@n.elems / 2).map({ @$_.sum});
+}
+
+# (say "0"; exit ) unless $half-sum == $half-sum.Int;
+
+say + so @n.combinations(@n.elems / 2).map({ @$_.sum}).any == $half-sum;
+