From e1ceee2f1f521bd94407dcfc33a663b045f91155 Mon Sep 17 00:00:00 2001 From: Jan Krňávek Date: Sun, 9 Apr 2023 20:33:05 +0200 Subject: solution week 211-2 -- backtracking, (potentiality fast but not) --- challenge-211/wambash/raku/ch-2.raku | 41 ++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 challenge-211/wambash/raku/ch-2.raku (limited to 'challenge-211') diff --git a/challenge-211/wambash/raku/ch-2.raku b/challenge-211/wambash/raku/ch-2.raku new file mode 100644 index 0000000000..57f2b1be23 --- /dev/null +++ b/challenge-211/wambash/raku/ch-2.raku @@ -0,0 +1,41 @@ +#!/usr/bin/env raku + +sub average { @^a.sum / @^a.elems } + +sub split-same-average-reducer ( @acc, $item, :$average, :$elems-limit ) { + @acc + andthen .grep: { .elems < $elems-limit }\ + andthen .map: { |@^list, $item }\ + andthen .grep: { .&average ≤ $average }\ + andthen |@acc, |$_ +} + +sub split-same-average (+@nums) { + my $average = average @nums; + my $elems-limit = @nums.elems div 2; + + @nums + andthen .sort + andthen (list(),), |$_ + andthen .reduce: {split-same-average-reducer @^acc, $^item, :$average, :$elems-limit }\ + andthen .first: { .&average == $average }, +} + +multi MAIN (Bool :test($)!) { + use Test; + is split-same-average(1, 2, 3, 4, 5, 6, 7, 8),(4,5); + is split-same-average(1,3), Nil; + is split-same-average(< + 44531 73257 49118 89580 + 25846 88015 19523 99285 + 75574 80036 10796 89896 + 77776 69138 75824 80610 + 47566 1623 20068 5294 + >), + <10796 19523 20068 47566 69138 73257 75574 75824 80036 89896>; + done-testing; +} + +multi MAIN (*@nums) { + say split-same-average @nums +} -- cgit