From a6f7542fac67534b6a4da87c483955ee56a41290 Mon Sep 17 00:00:00 2001 From: arnesom Date: Sun, 8 Aug 2021 23:52:30 +0200 Subject: Arne Sommer --- challenge-124/arne-sommer/blog.txt | 1 + challenge-124/arne-sommer/factors | 26 --------------- challenge-124/arne-sommer/raku/ch-1.raku | 23 +++++++++++++ challenge-124/arne-sommer/raku/ch-2.raku | 27 +++++++++++++++ challenge-124/arne-sommer/raku/happy-women-day | 20 ++++++++++++ challenge-124/arne-sommer/raku/happy-women-day-any | 23 +++++++++++++ .../arne-sommer/raku/happy-women-day-short | 3 ++ challenge-124/arne-sommer/raku/tow-dispatcher | 21 ++++++++++++ challenge-124/arne-sommer/raku/tow-dispatcher2 | 21 ++++++++++++ challenge-124/arne-sommer/raku/tow-dispatcher3 | 27 +++++++++++++++ challenge-124/arne-sommer/raku/tug-of-war | 38 ++++++++++++++++++++++ challenge-124/arne-sommer/raku/tug-of-war-bag | 36 ++++++++++++++++++++ challenge-124/arne-sommer/raku/tug-of-war-sum | 37 +++++++++++++++++++++ .../arne-sommer/raku/tug-of-war-sum-plain | 27 +++++++++++++++ challenge-124/arne-sommer/raku/tug-of-war-zero | 20 ++++++++++++ 15 files changed, 324 insertions(+), 26 deletions(-) create mode 100644 challenge-124/arne-sommer/blog.txt delete mode 100755 challenge-124/arne-sommer/factors create mode 100755 challenge-124/arne-sommer/raku/ch-1.raku create mode 100755 challenge-124/arne-sommer/raku/ch-2.raku create mode 100755 challenge-124/arne-sommer/raku/happy-women-day create mode 100755 challenge-124/arne-sommer/raku/happy-women-day-any create mode 100755 challenge-124/arne-sommer/raku/happy-women-day-short create mode 100755 challenge-124/arne-sommer/raku/tow-dispatcher create mode 100755 challenge-124/arne-sommer/raku/tow-dispatcher2 create mode 100755 challenge-124/arne-sommer/raku/tow-dispatcher3 create mode 100755 challenge-124/arne-sommer/raku/tug-of-war create mode 100755 challenge-124/arne-sommer/raku/tug-of-war-bag create mode 100755 challenge-124/arne-sommer/raku/tug-of-war-sum create mode 100755 challenge-124/arne-sommer/raku/tug-of-war-sum-plain create mode 100755 challenge-124/arne-sommer/raku/tug-of-war-zero 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; + -- cgit