diff options
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 +} |
