aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark <53903062+andemark@users.noreply.github.com>2022-11-21 14:48:11 +0000
committerMark <53903062+andemark@users.noreply.github.com>2022-11-21 14:48:11 +0000
commit76d541d487e55adde0e3f1ead7a39bbf0f9c029b (patch)
treeb6d8954cd9190b12fe20aa08b1a3c2fc1e4d0830
parent92bd65c37f74a0e4072a3db26dc1356fee44188a (diff)
downloadperlweeklychallenge-club-76d541d487e55adde0e3f1ead7a39bbf0f9c029b.tar.gz
perlweeklychallenge-club-76d541d487e55adde0e3f1ead7a39bbf0f9c029b.tar.bz2
perlweeklychallenge-club-76d541d487e55adde0e3f1ead7a39bbf0f9c029b.zip
Challenge 192 Solutions (Raku)
-rw-r--r--challenge-192/mark-anderson/raku/ch-1.raku3
-rw-r--r--challenge-192/mark-anderson/raku/ch-2.raku28
2 files changed, 11 insertions, 20 deletions
diff --git a/challenge-192/mark-anderson/raku/ch-1.raku b/challenge-192/mark-anderson/raku/ch-1.raku
index 1bdde74046..866743e8e7 100644
--- a/challenge-192/mark-anderson/raku/ch-1.raku
+++ b/challenge-192/mark-anderson/raku/ch-1.raku
@@ -7,5 +7,6 @@ is binary-flip(6), 1;
sub binary-flip($n)
{
- (1 x $n.base(2).chars).parse-base(2) +^ $n;
+ #(1 x $n.base(2).chars).parse-base(2) +^ $n
+ $n.base(2).trans('01' => '10').parse-base(2)
}
diff --git a/challenge-192/mark-anderson/raku/ch-2.raku b/challenge-192/mark-anderson/raku/ch-2.raku
index 25c27e2254..d236b2cf94 100644
--- a/challenge-192/mark-anderson/raku/ch-2.raku
+++ b/challenge-192/mark-anderson/raku/ch-2.raku
@@ -9,31 +9,21 @@ 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 🤷
+# Thanks to scimon, drbaggy, and others for simplifying this for me :)
sub equal-distribution(*@a)
{
my $avg = @a.sum / @a.elems;
return -1 unless $avg.narrow ~~ Int;
+ my $moves;
- my ($min-ptr, $max-ptr, $moves) = 0 xx 3;
-
- loop
+ for @a.rotor(2 => -1)
{
- 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;
+ my $n = $avg - .[0];
+ .[0] += $n;
+ .[1] -= $n;
+ $moves += abs($n)
}
+
+ $moves
}