diff options
| -rw-r--r-- | challenge-193/wambash/raku/ch-1.raku | 20 | ||||
| -rw-r--r-- | challenge-193/wambash/raku/ch-2.raku | 37 |
2 files changed, 57 insertions, 0 deletions
diff --git a/challenge-193/wambash/raku/ch-1.raku b/challenge-193/wambash/raku/ch-1.raku new file mode 100644 index 0000000000..7655c58aa3 --- /dev/null +++ b/challenge-193/wambash/raku/ch-1.raku @@ -0,0 +1,20 @@ +#!/usr/bin/env raku + +sub binary-flip ($n) { + $n + andthen .base(2) + andthen .trans: <0 1> => <1 0> + andthen :2( $_ ) +} + +multi MAIN (Bool :test($)!) { + use Test; + is binary-flip(5),2; + is binary-flip(4),3; + is binary-flip(6),1; + done-testing; +} + +multi MAIN ($n) { + say binary-flip $n +} diff --git a/challenge-193/wambash/raku/ch-2.raku b/challenge-193/wambash/raku/ch-2.raku new file mode 100644 index 0000000000..eacc0091cf --- /dev/null +++ b/challenge-193/wambash/raku/ch-2.raku @@ -0,0 +1,37 @@ +#!/usr/bin/env raku +# +my sub agg( $ ( :$average, :to-next($from-previous), :$moves, ), $n ) { + my $to-next = $from-previous + $n - $average; + + \( + :$average, + :$to-next, + moves => $moves + $to-next.abs , + ) +} + +sub equal-distribution (+@list) { + return Nil unless @list.sum %% @list.elems; + + my $average = @list.sum div @list.elems; + + @list + andthen \(:$average, :0moves, :0to-next,), .Slip + andthen .reduce: &agg + andthen .<moves> +} + +multi MAIN (Bool :test($)!) { + use Test; + is equal-distribution(1,0,5), 4; + is equal-distribution(1,2,3), 2; + is equal-distribution(1,2,3), 2; + is equal-distribution(0,2,0), Nil; + is equal-distribution(0,3,0), 2; + is equal-distribution(1..5), 10; + done-testing; +} + +multi MAIN (*@list) { + say equal-distribution(@list) // -1 +} |
