From 8dd4b781055df120cd5ab9c9db899be619871a6d Mon Sep 17 00:00:00 2001 From: Roger Bell_West Date: Mon, 25 Jan 2021 19:44:06 +0000 Subject: Solutions for challenge #097 --- challenge-097/roger-bell-west/perl/ch-1.pl | 20 ++++++++++ challenge-097/roger-bell-west/perl/ch-2.pl | 46 ++++++++++++++++++++++ challenge-097/roger-bell-west/python/ch-1.py | 31 +++++++++++++++ challenge-097/roger-bell-west/python/ch-2.py | 43 ++++++++++++++++++++ challenge-097/roger-bell-west/raku/ch-1.p6 | 17 ++++++++ challenge-097/roger-bell-west/raku/ch-2.p6 | 40 +++++++++++++++++++ challenge-097/roger-bell-west/ruby/ch-1.rb | 38 ++++++++++++++++++ challenge-097/roger-bell-west/ruby/ch-2.rb | 59 ++++++++++++++++++++++++++++ challenge-097/roger-bell-west/rust/ch-1.rs | 38 ++++++++++++++++++ challenge-097/roger-bell-west/rust/ch-2.rs | 49 +++++++++++++++++++++++ 10 files changed, 381 insertions(+) create mode 100755 challenge-097/roger-bell-west/perl/ch-1.pl create mode 100755 challenge-097/roger-bell-west/perl/ch-2.pl create mode 100755 challenge-097/roger-bell-west/python/ch-1.py create mode 100755 challenge-097/roger-bell-west/python/ch-2.py create mode 100755 challenge-097/roger-bell-west/raku/ch-1.p6 create mode 100755 challenge-097/roger-bell-west/raku/ch-2.p6 create mode 100755 challenge-097/roger-bell-west/ruby/ch-1.rb create mode 100755 challenge-097/roger-bell-west/ruby/ch-2.rb create mode 100755 challenge-097/roger-bell-west/rust/ch-1.rs create mode 100755 challenge-097/roger-bell-west/rust/ch-2.rs 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 @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::>(); + let mut cmap: HashMap=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=vec![]; + let mut i=0; + while i