aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-11-21 13:44:20 +0000
committerGitHub <noreply@github.com>2022-11-21 13:44:20 +0000
commit9adf8e851010ce1069fda39900ac5b9a45f476ce (patch)
tree4fc96c9fed4b5aa675cf479e67a9acc22630aa9e
parent8e6f566361b50895c2323ba1e1f8dd3b36a1b258 (diff)
parentab9c68aa298728a6c35d540dadeafbd9aaae713e (diff)
downloadperlweeklychallenge-club-9adf8e851010ce1069fda39900ac5b9a45f476ce.tar.gz
perlweeklychallenge-club-9adf8e851010ce1069fda39900ac5b9a45f476ce.tar.bz2
perlweeklychallenge-club-9adf8e851010ce1069fda39900ac5b9a45f476ce.zip
Merge pull request #7131 from Firedrake/rogerbw-challenge-192
Solutions for challenge #192
-rwxr-xr-xchallenge-192/roger-bell-west/javascript/ch-1.js34
-rwxr-xr-xchallenge-192/roger-bell-west/javascript/ch-2.js58
-rw-r--r--challenge-192/roger-bell-west/kotlin/ch-1.kt30
-rw-r--r--challenge-192/roger-bell-west/kotlin/ch-2.kt58
-rwxr-xr-xchallenge-192/roger-bell-west/lua/ch-1.lua32
-rwxr-xr-xchallenge-192/roger-bell-west/lua/ch-2.lua61
-rwxr-xr-xchallenge-192/roger-bell-west/perl/ch-1.pl21
-rwxr-xr-xchallenge-192/roger-bell-west/perl/ch-2.pl48
-rw-r--r--challenge-192/roger-bell-west/postscript/ch-1.ps59
-rw-r--r--challenge-192/roger-bell-west/postscript/ch-2.ps103
-rwxr-xr-xchallenge-192/roger-bell-west/python/ch-1.py24
-rwxr-xr-xchallenge-192/roger-bell-west/python/ch-2.py45
-rwxr-xr-xchallenge-192/roger-bell-west/raku/ch-1.p619
-rwxr-xr-xchallenge-192/roger-bell-west/raku/ch-2.p638
-rwxr-xr-xchallenge-192/roger-bell-west/ruby/ch-1.rb30
-rwxr-xr-xchallenge-192/roger-bell-west/ruby/ch-2.rb47
-rwxr-xr-xchallenge-192/roger-bell-west/rust/ch-1.rs27
-rwxr-xr-xchallenge-192/roger-bell-west/rust/ch-2.rs56
18 files changed, 790 insertions, 0 deletions
diff --git a/challenge-192/roger-bell-west/javascript/ch-1.js b/challenge-192/roger-bell-west/javascript/ch-1.js
new file mode 100755
index 0000000000..c81f2c7f45
--- /dev/null
+++ b/challenge-192/roger-bell-west/javascript/ch-1.js
@@ -0,0 +1,34 @@
+#! /usr/bin/node
+
+"use strict"
+
+function binaryflip(n) {
+ let m = n;
+ let r = 0;
+ while (m > 0) {
+ m >>= 1;
+ r += 1;
+ }
+ return (1 << r) - 1 - n;
+}
+
+if (binaryflip(5) == 2) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (binaryflip(4) == 3) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (binaryflip(6) == 1) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-192/roger-bell-west/javascript/ch-2.js b/challenge-192/roger-bell-west/javascript/ch-2.js
new file mode 100755
index 0000000000..66191166ec
--- /dev/null
+++ b/challenge-192/roger-bell-west/javascript/ch-2.js
@@ -0,0 +1,58 @@
+#! /usr/bin/node
+
+"use strict"
+
+function equaldistribution(list) {
+ let s = list.reduce((x, y) => x + y, 0);
+ if (s % list.length != 0) {
+ return -1;
+ }
+ let m = s / list.length;
+ let out = 0;
+ let w = list;
+ while (true) {
+ for (let i = 0; i < w.length-1; i++) {
+ if (w[i] > m) {
+ let v = w[i] - m;
+ w[i+1] += v;
+ out += v;
+ w[i] = m;
+ } else if (w[i] < m) {
+ let v = Math.min(m - w[i], w[i+1]);
+ w[i+1] -= v;
+ out += v;
+ w[i] += v;
+ }
+ }
+ let done = true;
+ for (let v of w) {
+ if (v != m) {
+ done = false;
+ break;
+ }
+ }
+ if (done) {
+ break;
+ }
+ }
+ return out;
+}
+
+if (equaldistribution([1, 0, 5]) == 4) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (equaldistribution([0, 2, 0]) == -1) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (equaldistribution([0, 3, 0]) == 2) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-192/roger-bell-west/kotlin/ch-1.kt b/challenge-192/roger-bell-west/kotlin/ch-1.kt
new file mode 100644
index 0000000000..c8eeb9470a
--- /dev/null
+++ b/challenge-192/roger-bell-west/kotlin/ch-1.kt
@@ -0,0 +1,30 @@
+fun binaryflip(n: Int): Int {
+ var m = n
+ var r = 0
+ while (m > 0) {
+ m = m shr 1
+ r += 1
+ }
+ return (1 shl r) - 1 - n
+}
+
+fun main() {
+ if (binaryflip(5) == 2) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+ if (binaryflip(4) == 3) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+ if (binaryflip(6) == 1) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ println("")
+}
diff --git a/challenge-192/roger-bell-west/kotlin/ch-2.kt b/challenge-192/roger-bell-west/kotlin/ch-2.kt
new file mode 100644
index 0000000000..e8d43ae9e6
--- /dev/null
+++ b/challenge-192/roger-bell-west/kotlin/ch-2.kt
@@ -0,0 +1,58 @@
+import kotlin.math.*
+
+fun equaldistribution(list: List<Int>): Int {
+ val s = list.sum()
+ if (s % list.size != 0) {
+ return -1
+ }
+ val m = s / list.size
+ var o: Int = 0
+ var w = ArrayList(list)
+ while (true) {
+ for (i in 0..w.size-2) {
+ if (w[i] > m) {
+ val v = w[i] - m
+ w[i+1] += v
+ o += v
+ w[i] = m
+ } else if (w[i] < m) {
+ val v = minOf(m - w[i], w[i+1])
+ w[i+1] -= v
+ o += v
+ w[i] += v
+ }
+ }
+ var done = true
+ for (v in w) {
+ if (v != m) {
+ done = false
+ break
+ }
+ }
+ if (done) {
+ break
+ }
+ }
+ return o
+}
+
+fun main() {
+ if (equaldistribution(listOf(1, 0, 5)) == 4) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+ if (equaldistribution(listOf(0, 2, 0)) == -1) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+ if (equaldistribution(listOf(0, 3, 0)) == 2) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ println("")
+}
diff --git a/challenge-192/roger-bell-west/lua/ch-1.lua b/challenge-192/roger-bell-west/lua/ch-1.lua
new file mode 100755
index 0000000000..b3523f34ae
--- /dev/null
+++ b/challenge-192/roger-bell-west/lua/ch-1.lua
@@ -0,0 +1,32 @@
+#! /usr/bin/lua
+
+function binaryflip(n)
+ local m = n
+ local r = 0
+ while m > 0 do
+ m = m >> 1
+ r = r + 1
+ end
+ return (1 << r) - 1 - n
+end
+
+if binaryflip(5) == 2 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if binaryflip(4) == 3 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if binaryflip(6) == 1 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
diff --git a/challenge-192/roger-bell-west/lua/ch-2.lua b/challenge-192/roger-bell-west/lua/ch-2.lua
new file mode 100755
index 0000000000..90a1afe43c
--- /dev/null
+++ b/challenge-192/roger-bell-west/lua/ch-2.lua
@@ -0,0 +1,61 @@
+#! /usr/bin/lua
+
+function equaldistribution(list)
+ local s = 0
+ for i,v in ipairs(list) do
+ s = s + v
+ end
+ if s % #list ~= 0 then
+ return -1
+ end
+ local m = s / #list
+ local out = 0
+ local w = list
+ while true do
+ for i = 1,#w-1 do
+ if w[i] > m then
+ v = w[i] - m
+ w[i+1] = w[i+1] + v
+ out = out + v
+ w[i] = m
+ elseif w[i] < m then
+ v = math.min(m - w[i], w[i+1])
+ w[i+1] = w[i+1] - v
+ out = out + v
+ w[i] = w[i] + v
+ end
+ end
+ local done = true
+ for i,v in ipairs(w) do
+ if v ~= m then
+ done = false
+ break
+ end
+ end
+ if done then
+ break
+ end
+ end
+ return out
+end
+
+if equaldistribution({1, 0, 5}) == 4 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if equaldistribution({0, 2, 0}) == -1 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if equaldistribution({0, 3, 0}) == 2 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
diff --git a/challenge-192/roger-bell-west/perl/ch-1.pl b/challenge-192/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..9dd8abf9a4
--- /dev/null
+++ b/challenge-192/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,21 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 3;
+
+is(binaryflip(5), 2, 'example 1');
+is(binaryflip(4), 3, 'example 2');
+is(binaryflip(6), 1, 'example 3');
+
+sub binaryflip($n) {
+ my $m = $n;
+ my $r = 0;
+ while ($m > 0) {
+ $m >>= 1;
+ $r++;
+ }
+ return (1 << $r) - 1 - $n;
+}
diff --git a/challenge-192/roger-bell-west/perl/ch-2.pl b/challenge-192/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..20c9dc5081
--- /dev/null
+++ b/challenge-192/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,48 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 3;
+use List::Util qw(sum min);
+
+is(equaldistribution([1, 0, 5]), 4, 'example 1');
+is(equaldistribution([0, 2, 0]), -1, 'example 2');
+is(equaldistribution([0, 3, 0]), 2, 'example 3');
+
+sub equaldistribution($list) {
+ my $s = sum(@{$list});
+ if ($s % (scalar @{$list}) != 0) {
+ return -1;
+ }
+ my $m = $s / scalar @{$list};
+ my $out = 0;
+ my @w = @{$list};
+ while (1) {
+ foreach my $i (0..$#w-1) {
+ if ($w[$i] > $m) {
+ my $v = $w[$i] - $m;
+ $w[$i+1] += $v;
+ $out += $v;
+ $w[$i] = $m;
+ } elsif ($w[$i] < $m) {
+ my $v = min($m - $w[$i], $w[$i+1]);
+ $w[$i+1] -= $v;
+ $out += $v;
+ $w[$i] += $v;
+ }
+ }
+ my $done = 1;
+ foreach my $v (@w) {
+ if ($v != $m) {
+ $done = 0;
+ last;
+ }
+ }
+ if ($done) {
+ last;
+ }
+ }
+ return $out;
+}
diff --git a/challenge-192/roger-bell-west/postscript/ch-1.ps b/challenge-192/roger-bell-west/postscript/ch-1.ps
new file mode 100644
index 0000000000..5a6ace974a
--- /dev/null
+++ b/challenge-192/roger-bell-west/postscript/ch-1.ps
@@ -0,0 +1,59 @@
+%!PS
+
+% begin included library code
+% see https://github.com/Firedrake/postscript-libraries/
+/test {
+ /test.count test.count 1 add def
+ {
+ /test.pass test.pass 1 add def
+ } {
+ ( ) print
+ test.count (....) cvs print
+ (-fail) print
+ } ifelse
+} bind def
+
+/test.start {
+ print (:) print
+ /test.pass 0 def
+ /test.count 0 def
+} bind def
+
+/test.end {
+ ( ) print
+ test.count 0 gt {
+ (Passed ) print
+ test.pass (...) cvs print
+ (/) print
+ test.count (...) cvs print
+ ( \() print
+ test.pass 100 mul test.count idiv (...) cvs print
+ (%\)) print
+ (\r\n) print
+ } if
+} bind def
+
+
+% end included library code
+
+/binaryflip {
+ 3 dict begin
+ /n exch def
+ /m n def
+ /r 0 def
+ {
+ m 0 eq {
+ exit
+ } if
+ /m m -1 bitshift def
+ /r r 1 add def
+ } loop
+ 1 r bitshift 1 sub n sub
+ end
+} bind def
+
+(binaryflip) test.start
+5 binaryflip 2 eq test
+4 binaryflip 3 eq test
+6 binaryflip 1 eq test
+test.end
diff --git a/challenge-192/roger-bell-west/postscript/ch-2.ps b/challenge-192/roger-bell-west/postscript/ch-2.ps
new file mode 100644
index 0000000000..8ae2e0232d
--- /dev/null
+++ b/challenge-192/roger-bell-west/postscript/ch-2.ps
@@ -0,0 +1,103 @@
+%!PS
+
+% begin included library code
+% see https://github.com/Firedrake/postscript-libraries/
+/test {
+ /test.count test.count 1 add def
+ {
+ /test.pass test.pass 1 add def
+ } {
+ ( ) print
+ test.count (....) cvs print
+ (-fail) print
+ } ifelse
+} bind def
+
+/test.end {
+ ( ) print
+ test.count 0 gt {
+ (Passed ) print
+ test.pass (...) cvs print
+ (/) print
+ test.count (...) cvs print
+ ( \() print
+ test.pass 100 mul test.count idiv (...) cvs print
+ (%\)) print
+ (\r\n) print
+ } if
+} bind def
+
+/reduce { % array proc -> value
+ 2 dict begin
+ /p exch def
+ /a exch def
+ a 0 get
+ 1 1 a length 1 sub {
+ a exch get
+ p
+ } for
+ end
+} bind def
+
+/all { % [a b] proc -> bool
+ 1 dict begin
+ /p exch def
+ true exch
+ {
+ p not {
+ pop false
+ exit
+ } if
+ } forall
+ end
+} bind def
+
+/test.start {
+ print (:) print
+ /test.pass 0 def
+ /test.count 0 def
+} bind def
+
+
+% end included library code
+
+/equaldistribution {
+ 8 dict begin
+ /list exch def
+ /s list { add } reduce def
+ s list length mod 0 eq {
+ /m s list length idiv def
+ /out 0 def
+ /w [ list aload pop ] def
+ {
+ 0 1 w length 2 sub {
+ /i exch def
+ w i get m gt {
+ /v w i get m sub def
+ w i 1 add w i 1 add get m add put
+ /out out v add def
+ w i m put
+ } if
+ w i get m lt {
+ /v m w i get sub w i 1 add get min def
+ w i 1 add w i 1 add get v sub put
+ /out out v add def
+ w i w i get v add put
+ } if
+ } for
+ w { m eq } all {
+ exit
+ } if
+ } loop
+ out
+ } {
+ -1
+ } ifelse
+ end
+} bind def
+
+(equaldistribution) test.start
+[ 1 0 5 ] equaldistribution 4 eq test
+[ 0 2 0 ] equaldistribution -1 eq test
+[ 0 3 0 ] equaldistribution 2 eq test
+test.end
diff --git a/challenge-192/roger-bell-west/python/ch-1.py b/challenge-192/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..b4384b5825
--- /dev/null
+++ b/challenge-192/roger-bell-west/python/ch-1.py
@@ -0,0 +1,24 @@
+#! /usr/bin/python3
+
+import unittest
+
+def binaryflip(n):
+ m = n
+ r = 0
+ while m > 0:
+ m >>= 1
+ r += 1
+ return (1 << r) - 1 - n
+
+class TestBinaryflip(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(binaryflip(5), 2, 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(binaryflip(4), 3, 'example 2')
+
+ def test_ex3(self):
+ self.assertEqual(binaryflip(6), 1, 'example 3')
+
+unittest.main()
diff --git a/challenge-192/roger-bell-west/python/ch-2.py b/challenge-192/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..55a41e3843
--- /dev/null
+++ b/challenge-192/roger-bell-west/python/ch-2.py
@@ -0,0 +1,45 @@
+#! /usr/bin/python3
+
+import unittest
+import re
+
+def equaldistribution(list):
+ s = sum(list)
+ if s % len(list) != 0:
+ return -1
+ m = s // len(list)
+ out = 0
+ w = list
+ while True:
+ for i in range(len(list)-1):
+ if w[i] > m:
+ v = w[i] - m
+ w[i+1] += v
+ out += v
+ w[i] = m
+ elif w[i] < m:
+ v = min(m - w[i], w[i+1])
+ w[i+1] -= v
+ out += v
+ w[i] += v
+ done = True
+ for v in w:
+ if v != m:
+ done = False
+ break
+ if done:
+ break
+ return out
+
+class TestEqualdistribution(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(equaldistribution([1, 0, 5]), 4, "example 1")
+
+ def test_ex2(self):
+ self.assertEqual(equaldistribution([0, 2, 0]), -1, "example 2")
+
+ def test_ex3(self):
+ self.assertEqual(equaldistribution([0, 3, 0]), 2, "example 3")
+
+unittest.main()
diff --git a/challenge-192/roger-bell-west/raku/ch-1.p6 b/challenge-192/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..0bdb113a97
--- /dev/null
+++ b/challenge-192/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,19 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 3;
+
+is(binaryflip(5), 2, 'example 1');
+is(binaryflip(4), 3, 'example 2');
+is(binaryflip(6), 1, 'example 3');
+
+sub binaryflip($n) {
+ my $m = $n;
+ my $r = 0;
+ while ($m > 0) {
+ $m +>= 1;
+ $r++;
+ }
+ return (1 +< $r) - 1 - $n;
+}
diff --git a/challenge-192/roger-bell-west/raku/ch-2.p6 b/challenge-192/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..7b216c665d
--- /dev/null
+++ b/challenge-192/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,38 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 3;
+
+is(equaldistribution([1, 0, 5]), 4, 'example 1');
+is(equaldistribution([0, 2, 0]), -1, 'example 2');
+is(equaldistribution([0, 3, 0]), 2, 'example 3');
+
+sub equaldistribution(@list) {
+ my $s = @list.sum;
+ if ($s % @list.elems != 0) {
+ return -1;
+ }
+ my $m = $s div @list.elems;
+ my $out = 0;
+ my @w = @list;
+ while (True) {
+ for (0..@w.elems-2) -> $i {
+ if (@w[$i] > $m) {
+ my $v = @w[$i] - $m;
+ @w[$i+1] += $v;
+ $out += $v;
+ @w[$i] = $m;
+ } elsif (@w[$i] < $m) {
+ my $v = min($m - @w[$i], @w[$i+1]);
+ @w[$i+1] -= $v;
+ $out += $v;
+ @w[$i] += $v;
+ }
+ }
+ if (@w.all == $m) {
+ last;
+ }
+ }
+ return $out;
+}
diff --git a/challenge-192/roger-bell-west/ruby/ch-1.rb b/challenge-192/roger-bell-west/ruby/ch-1.rb
new file mode 100755
index 0000000000..ecf5bc3342
--- /dev/null
+++ b/challenge-192/roger-bell-west/ruby/ch-1.rb
@@ -0,0 +1,30 @@
+#! /usr/bin/ruby
+
+require 'test/unit'
+
+require 'set'
+
+def binaryflip(n)
+ m = n
+ r = 0
+ while (m > 0) do
+ m >>= 1
+ r += 1
+ end
+ return (1 << r) - 1 - n
+end
+
+class TestBinaryflip < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(2, binaryflip(5));
+ end
+
+ def test_ex2
+ assert_equal(3, binaryflip(4));
+ end
+
+ def test_ex3
+ assert_equal(1, binaryflip(6));
+ end
+end
diff --git a/challenge-192/roger-bell-west/ruby/ch-2.rb b/challenge-192/roger-bell-west/ruby/ch-2.rb
new file mode 100755
index 0000000000..08b1394ce3
--- /dev/null
+++ b/challenge-192/roger-bell-west/ruby/ch-2.rb
@@ -0,0 +1,47 @@
+#! /usr/bin/ruby
+
+require 'test/unit'
+
+def equaldistribution(list)
+ s = list.sum
+ if s % list.length != 0 then
+ return -1
+ end
+ m = s / list.length
+ out = 0
+ w = list
+ while true do
+ 0.upto(w.length-2) do |i|
+ if w[i] > m then
+ v = w[i] - m
+ w[i+1] += v
+ out += v
+ w[i] = m
+ elsif w[i] < m then
+ v = [m - w[i], w[i+1]].min
+ w[i+1] -= v
+ out += v
+ w[i] += v
+ end
+ end
+ if w.all? {|s| s == m} then
+ break
+ end
+ end
+ return out
+end
+
+class TestEqualdistribution < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(4, equaldistribution([1, 0, 5]))
+ end
+
+ def test_ex2
+ assert_equal(-1, equaldistribution([0, 2, 0]))
+ end
+
+ def test_ex3
+ assert_equal(2, equaldistribution([0, 3, 0]))
+ end
+end
diff --git a/challenge-192/roger-bell-west/rust/ch-1.rs b/challenge-192/roger-bell-west/rust/ch-1.rs
new file mode 100755
index 0000000000..e93b2c8ebf
--- /dev/null
+++ b/challenge-192/roger-bell-west/rust/ch-1.rs
@@ -0,0 +1,27 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit
+
+#[test]
+fn test_ex1() {
+ assert_eq!(binaryflip(5), 2);
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(binaryflip(4), 3);
+}
+
+#[test]
+fn test_ex3() {
+ assert_eq!(binaryflip(6), 1);
+}
+
+fn binaryflip(n: usize) -> usize {
+ let mut m = n;
+ let mut r = 0;
+ while m > 0 {
+ m >>= 1;
+ r += 1;
+ }
+ (1 << r) - 1 - n
+}
diff --git a/challenge-192/roger-bell-west/rust/ch-2.rs b/challenge-192/roger-bell-west/rust/ch-2.rs
new file mode 100755
index 0000000000..7517d1f1aa
--- /dev/null
+++ b/challenge-192/roger-bell-west/rust/ch-2.rs
@@ -0,0 +1,56 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit
+
+use std::cmp::min;
+
+#[test]
+fn test_ex1() {
+ assert_eq!(equaldistribution(vec![1, 0, 5]), 4);
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(equaldistribution(vec![0, 2, 0]), -1);
+}
+
+#[test]
+fn test_ex3() {
+ assert_eq!(equaldistribution(vec![0, 3, 0]), 2);
+}
+
+fn equaldistribution(list: Vec<isize>) -> isize {
+ let s = list.iter().sum::<isize>();
+ let l = list.len() as isize;
+ if s % l != 0 {
+ return -1;
+ }
+ let m = s / l;
+ let mut out = 0;
+ let mut w = list.clone();
+ loop {
+ for i in 0..w.len() - 1 {
+ if w[i] > m {
+ let v = w[i] - m;
+ w[i + 1] += v;
+ out += v;
+ w[i] = m;
+ } else if w[i] < m {
+ let v = min(m - w[i], w[i + 1]);
+ w[i + 1] -= v;
+ out += v;
+ w[i] += v;
+ }
+ }
+ let mut done = true;
+ for v in &w {
+ if *v != m {
+ done = false;
+ break;
+ }
+ }
+ if done {
+ break;
+ }
+ }
+ out
+}