aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark <53903062+andemark@users.noreply.github.com>2022-11-21 10:40:38 +0000
committerMark <53903062+andemark@users.noreply.github.com>2022-11-21 10:40:38 +0000
commit92bd65c37f74a0e4072a3db26dc1356fee44188a (patch)
treed8b76b52ca5bfc41afea4fea04051a1f542f0eec
parent8ea75399a70f8ab625f105a9d5ca011759e9dc19 (diff)
downloadperlweeklychallenge-club-92bd65c37f74a0e4072a3db26dc1356fee44188a.tar.gz
perlweeklychallenge-club-92bd65c37f74a0e4072a3db26dc1356fee44188a.tar.bz2
perlweeklychallenge-club-92bd65c37f74a0e4072a3db26dc1356fee44188a.zip
Initial 192 (Raku)
-rw-r--r--challenge-192/mark-anderson/raku/ch-1.raku11
-rw-r--r--challenge-192/mark-anderson/raku/ch-2.raku39
2 files changed, 50 insertions, 0 deletions
diff --git a/challenge-192/mark-anderson/raku/ch-1.raku b/challenge-192/mark-anderson/raku/ch-1.raku
new file mode 100644
index 0000000000..1bdde74046
--- /dev/null
+++ b/challenge-192/mark-anderson/raku/ch-1.raku
@@ -0,0 +1,11 @@
+#!/usr/bin/env raku
+use Test;
+
+is binary-flip(5), 2;
+is binary-flip(4), 3;
+is binary-flip(6), 1;
+
+sub binary-flip($n)
+{
+ (1 x $n.base(2).chars).parse-base(2) +^ $n;
+}
diff --git a/challenge-192/mark-anderson/raku/ch-2.raku b/challenge-192/mark-anderson/raku/ch-2.raku
new file mode 100644
index 0000000000..25c27e2254
--- /dev/null
+++ b/challenge-192/mark-anderson/raku/ch-2.raku
@@ -0,0 +1,39 @@
+#!/usr/bin/env raku
+use Test;
+
+is equal-distribution(< 1 0 5 >), 4;
+is equal-distribution(< 0 2 0 >), -1;
+is equal-distribution(< 0 3 0 >), 2;
+is equal-distribution(< 1 0 2 5 7 >), 17;
+is equal-distribution(< 1 0 5 2 7 >), 14;
+is equal-distribution([1..101]), 85850;
+is equal-distribution([101...1]), 85850;
+
+# Please see the solution from James Smith (drbaggy)
+# Mine is more complicated than it needs to be 🤷
+
+sub equal-distribution(*@a)
+{
+ my $avg = @a.sum / @a.elems;
+ return -1 unless $avg.narrow ~~ Int;
+
+ my ($min-ptr, $max-ptr, $moves) = 0 xx 3;
+
+ loop
+ {
+ my $min = @a[$min-ptr..@a.end].first(* < $avg, :p);
+ my $max = @a[$max-ptr..@a.end].first(* > $avg, :p);
+
+ return $moves unless $min|$max;
+
+ my $amt = min($avg - $min.value, $max.value - $avg);
+
+ @a[$min-ptr..@a.end][$min.key] += $amt;
+ @a[$max-ptr..@a.end][$max.key] -= $amt;
+
+ $min-ptr += $min.key;
+ $max-ptr += $max.key;
+
+ $moves += abs($max-ptr - $min-ptr) * $amt;
+ }
+}