aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xchallenge-097/roger-bell-west/perl/ch-1.pl20
-rwxr-xr-xchallenge-097/roger-bell-west/perl/ch-2.pl46
-rwxr-xr-xchallenge-097/roger-bell-west/python/ch-1.py31
-rwxr-xr-xchallenge-097/roger-bell-west/python/ch-2.py43
-rwxr-xr-xchallenge-097/roger-bell-west/raku/ch-1.p617
-rwxr-xr-xchallenge-097/roger-bell-west/raku/ch-2.p640
-rwxr-xr-xchallenge-097/roger-bell-west/ruby/ch-1.rb38
-rwxr-xr-xchallenge-097/roger-bell-west/ruby/ch-2.rb59
-rwxr-xr-xchallenge-097/roger-bell-west/rust/ch-1.rs38
-rwxr-xr-xchallenge-097/roger-bell-west/rust/ch-2.rs49
10 files changed, 381 insertions, 0 deletions
diff --git a/challenge-097/roger-bell-west/perl/ch-1.pl b/challenge-097/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..f8246667eb
--- /dev/null
+++ b/challenge-097/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,20 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 3;
+
+is(cc('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG',3),'QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD','example 1');
+is(cc('QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD',-3),'THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG','example 2');
+is(cc('A QUICK MOVEMENT OF THE ENEMY WILL JEOPARDIZE SIX GUNBOATS',13),'N DHVPX ZBIRZRAG BS GUR RARZL JVYY WRBCNEQVMR FVK THAOBNGF','example 3');
+
+sub cc {
+ my $s=shift;
+ my $n=shift;
+ my @plain=('A'..'Z');
+ my @cipher=(@plain,@plain);
+ splice @cipher,0,(26*2-$n)%26;
+ my %m=map {$plain[$_] => $cipher[$_]} (0..$#plain);
+ return join('',map {$m{$_} || $_} split '',$s);
+}
diff --git a/challenge-097/roger-bell-west/perl/ch-2.pl b/challenge-097/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..051378ad2e
--- /dev/null
+++ b/challenge-097/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,46 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 2;
+
+is(bs('101100101',3),1,'example 1');
+is(bs('00011011',2),4,'example 2');
+
+use List::Util qw(sum);
+
+sub bs {
+ my $b=shift;
+ my $s=shift;
+ my @bb=grep /./,split /(.{$s})/,$b;
+ if (length($bb[-1]) != $s) {
+ return -1;
+ }
+ my $mc;
+ my %cost;
+ foreach my $x (0..$#bb-1) {
+ $cost{$x}{$x}=0;
+ foreach my $y ($x+1..$#bb) {
+ $cost{$x}{$y}=$cost{$y}{$x}=diff($bb[$x],$bb[$y]);
+ }
+ my $tc=sum(map {$cost{$x}{$_}} 0..$#bb);
+ if (!defined $mc || $tc < $mc) {
+ $mc=$tc;
+ }
+ }
+ return $mc;
+}
+
+sub diff {
+ my ($a,$b)=@_;
+ my @ac=split '',$a;
+ my @bc=split '',$b;
+ my $d=0;
+ foreach my $i (0..$#ac) {
+ if ($ac[$i] ne $bc[$i]) {
+ $d++;
+ }
+ }
+ return $d;
+}
diff --git a/challenge-097/roger-bell-west/python/ch-1.py b/challenge-097/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..b7698fb71a
--- /dev/null
+++ b/challenge-097/roger-bell-west/python/ch-1.py
@@ -0,0 +1,31 @@
+#! /usr/bin/python3
+
+def cc(s,n):
+ plain=list([chr(i) for i in range(ord('A'),ord('Z')+1)])
+ cmap=dict()
+ asize=len(plain)
+ for p in range(asize):
+ c=(p+asize*2-n) % asize
+ cmap[plain[p]]=plain[c]
+ out=""
+ for i in range(len(s)):
+ if s[i] in cmap:
+ out += cmap[s[i]]
+ else:
+ out += s[i]
+ return out
+
+import unittest
+
+class TestCc(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(cc('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG',3),'QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD','example 1')
+
+ def test_ex2(self):
+ self.assertEqual(cc('QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD',-3),'THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG','example 2')
+
+ def test_ex3(self):
+ self.assertEqual(cc('A QUICK MOVEMENT OF THE ENEMY WILL JEOPARDIZE SIX GUNBOATS',13),'N DHVPX ZBIRZRAG BS GUR RARZL JVYY WRBCNEQVMR FVK THAOBNGF','example 3')
+
+unittest.main()
diff --git a/challenge-097/roger-bell-west/python/ch-2.py b/challenge-097/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..df7ff3bd30
--- /dev/null
+++ b/challenge-097/roger-bell-west/python/ch-2.py
@@ -0,0 +1,43 @@
+#! /usr/bin/python3
+
+from collections import defaultdict
+
+def diff(a,b):
+ d=0
+ for i in range(len(a)):
+ if a[i] != b[i]:
+ d += 1
+ return d
+
+def bs(b,s):
+ bb=list()
+ i=0
+ while i<len(b):
+ bb.append(b[i:i+s])
+ i+=s
+ if len(bb[len(bb)-1]) != s:
+ return -1
+ mc=-1
+ cost=defaultdict(dict)
+ for x in range(len(bb)-1):
+ cost[x][x]=0
+ for y in range(x+1,len(bb)):
+ t=diff(bb[x],bb[y])
+ cost[x][y]=t
+ cost[y][x]=t
+ tc=sum(cost[x][i] for i in range(len(bb)))
+ if mc==-1 or tc < mc:
+ mc=tc
+ return mc
+
+import unittest
+
+class TestBs(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(bs('101100101',3),1,'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(bs('00011011',2),4,'example 2')
+
+unittest.main()
diff --git a/challenge-097/roger-bell-west/raku/ch-1.p6 b/challenge-097/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..e10e0e8951
--- /dev/null
+++ b/challenge-097/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,17 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 3;
+
+is(cc('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG',3),'QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD','example 1');
+is(cc('QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD',-3),'THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG','example 2');
+is(cc('A QUICK MOVEMENT OF THE ENEMY WILL JEOPARDIZE SIX GUNBOATS',13),'N DHVPX ZBIRZRAG BS GUR RARZL JVYY WRBCNEQVMR FVK THAOBNGF','example 3');
+
+sub cc($s,$n) {
+ my @plain=('A'..'Z');
+ my @cipher=(@plain,@plain).flat;
+ splice @cipher,0,(26*2-$n)%26;
+ my %m=map {@plain[$_] => @cipher[$_]},(0..@plain.end);
+ return (map {%m{$_} || $_},$s.comb()).join('');
+}
diff --git a/challenge-097/roger-bell-west/raku/ch-2.p6 b/challenge-097/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..e37f4c165a
--- /dev/null
+++ b/challenge-097/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,40 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 2;
+
+is(bs('101100101',3),1,'example 1');
+is(bs('00011011',2),4,'example 2');
+
+sub bs($b,$s) {
+ my @bb=$b.comb($s);
+ if (chars(@bb[@bb.end]) != $s) {
+ return -1;
+ }
+ my $mc=-1;
+ my %cost;
+ for (0..@bb.end-1) -> $x {
+ %cost{$x}{$x}=0;
+ for ($x+1..@bb.end) -> $y {
+ %cost{$x}{$y}=%cost{$y}{$x}=diff(@bb[$x],@bb[$y]);
+ }
+ my $tc=sum(map {%cost{$x}{$_}},0..@bb.end);
+ if ($mc==-1 || $tc < $mc) {
+ $mc=$tc;
+ }
+ }
+ return $mc;
+}
+
+sub diff($a,$b) {
+ my @ac=$a.comb;
+ my @bc=$b.comb;
+ my $d=0;
+ for (0..@ac.end) -> $i {
+ if (@ac[$i] ne @bc[$i]) {
+ $d++;
+ }
+ }
+ return $d;
+}
diff --git a/challenge-097/roger-bell-west/ruby/ch-1.rb b/challenge-097/roger-bell-west/ruby/ch-1.rb
new file mode 100755
index 0000000000..7bbb7bc518
--- /dev/null
+++ b/challenge-097/roger-bell-west/ruby/ch-1.rb
@@ -0,0 +1,38 @@
+#! /usr/bin/ruby
+
+def cc(s,n)
+ plain=('A'..'Z').to_a
+ cmap=Hash.new
+ asize=plain.length
+ 0.upto(asize-1) do |p|
+ c=(p+asize*2-n) % asize
+ cmap[plain[p]]=plain[c]
+ end
+ out=""
+ s.split('').each do |ss|
+ if cmap.has_key?(ss) then
+ out += cmap[ss]
+ else
+ out += ss
+ end
+ end
+ return out
+end
+
+require 'test/unit'
+
+class TestCc < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal('QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD',cc('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG',3))
+ end
+
+ def test_ex2
+ assert_equal('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG',cc('QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD',-3))
+ end
+
+ def test_ex3
+ assert_equal('N DHVPX ZBIRZRAG BS GUR RARZL JVYY WRBCNEQVMR FVK THAOBNGF',cc('A QUICK MOVEMENT OF THE ENEMY WILL JEOPARDIZE SIX GUNBOATS',13))
+ end
+
+end
diff --git a/challenge-097/roger-bell-west/ruby/ch-2.rb b/challenge-097/roger-bell-west/ruby/ch-2.rb
new file mode 100755
index 0000000000..f52fb91988
--- /dev/null
+++ b/challenge-097/roger-bell-west/ruby/ch-2.rb
@@ -0,0 +1,59 @@
+#! /usr/bin/ruby
+
+def diff(a,b)
+ aa=a.split('')
+ bb=b.split('')
+ d=0
+ 0.upto(aa.length()-1) do |i|
+ if a[i] != b[i]
+ d+=1
+ end
+ end
+ return d
+end
+
+def bs(b,s)
+ bb=Array.new
+ i=0
+ while (i < b.length) do
+ bb.push(b.slice(i,s))
+ i+=s
+ end
+ if bb[-1].length != s then
+ return -1
+ end
+ mc=-1
+ cost=Hash.new
+ 0.upto(bb.length-2) do |x|
+ if !cost.has_key?(x) then
+ cost[x]=Hash.new
+ end
+ cost[x][x]=0
+ x+1.upto(bb.length-1) do |y|
+ cost[x][y]=diff(bb[x],bb[y])
+ if !cost.has_key?(y) then
+ cost[y]=Hash.new
+ end
+ cost[y][x]=cost[x][y]
+ end
+ tc=0.upto(bb.length-1).map{|i| cost[x][i]}.sum()
+ if mc==-1 or tc < mc then
+ mc=tc
+ end
+ end
+ return mc
+end
+
+require 'test/unit'
+
+class TestBs < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(1,bs('101100101',3))
+ end
+
+ def test_ex2
+ assert_equal(4,bs('00011011',2))
+ end
+
+end
diff --git a/challenge-097/roger-bell-west/rust/ch-1.rs b/challenge-097/roger-bell-west/rust/ch-1.rs
new file mode 100755
index 0000000000..628a801393
--- /dev/null
+++ b/challenge-097/roger-bell-west/rust/ch-1.rs
@@ -0,0 +1,38 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x; rm -f ${0}x ; exit
+
+use std::collections::HashMap;
+
+#[test]
+fn test_ex1() {
+ assert_eq!(cc("THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG",3),"QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD");
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(cc("QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD",-3),"THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG");
+}
+
+#[test]
+fn test_ex3() {
+ assert_eq!(cc("A QUICK MOVEMENT OF THE ENEMY WILL JEOPARDIZE SIX GUNBOATS",13),"N DHVPX ZBIRZRAG BS GUR RARZL JVYY WRBCNEQVMR FVK THAOBNGF");
+}
+
+fn cc(s: &str, n: i8) -> String {
+ let plain=(b'A'..=b'Z').map(|b| b as char).collect::<Vec<char>>();
+ let mut cmap: HashMap<char,char>=HashMap::new();
+ let asize=plain.len();
+ for p in 0..asize {
+ let c=(((p as i8)+(asize as i8)*2-n) % (asize as i8)) as usize;
+ cmap.insert(plain[p],plain[c]);
+ }
+ let mut out: String="".to_string();
+ for ss in s.chars() {
+ if cmap.contains_key(&ss) {
+ out.push(*cmap.get(&ss).unwrap());
+ } else {
+ out.push(ss);
+ }
+ }
+ return out.to_string();
+}
diff --git a/challenge-097/roger-bell-west/rust/ch-2.rs b/challenge-097/roger-bell-west/rust/ch-2.rs
new file mode 100755
index 0000000000..722796a67f
--- /dev/null
+++ b/challenge-097/roger-bell-west/rust/ch-2.rs
@@ -0,0 +1,49 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x; rm -f ${0}x ; exit
+
+#[test]
+fn test_ex1() {
+ assert_eq!(bs("101100101",3),1);
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(bs("00011011",2),4);
+}
+
+fn diff(a: &str,b: &str) -> i64 {
+ let mut d: i64=0;
+ for (s,t) in a.chars().zip(b.chars()) {
+ if s != t {
+ d+=1;
+ }
+ }
+ return d;
+}
+
+fn bs(b: &str, s: i64) -> i64 {
+ let mut bb: Vec<String>=vec![];
+ let mut i=0;
+ while i<b.len() {
+ bb.push(b[i..i+(s as usize)].to_string());
+ i+=s as usize;
+ }
+ if bb[bb.len()-1].len() != s as usize {
+ return -1;
+ }
+ let mut mc: i64 = -1;
+ let mut cost=vec![vec![0; bb.len()]; bb.len()];
+ for x in 0..bb.len()-1 {
+ cost[x][x]=0;
+ for y in x+1..bb.len() {
+ let t=diff(&bb[x],&bb[y]);
+ cost[x][y]=t;
+ cost[y][x]=t;
+ }
+ let tc=(0..bb.len()).map(|i| cost[x][i]).sum();
+ if mc==-1 || tc < mc {
+ mc=tc;
+ }
+ }
+ return mc;
+}