From e534fc299f1ec99db82b84248e69f58dd8c5b79b Mon Sep 17 00:00:00 2001 From: Roger Bell_West Date: Mon, 23 Nov 2020 14:48:14 +0000 Subject: Solutions for challenge #88. --- challenge-088/roger-bell-west/perl/ch-1.pl | 18 +++++ challenge-088/roger-bell-west/perl/ch-2.pl | 52 ++++++++++++++ challenge-088/roger-bell-west/python/ch-1.py | 20 ++++++ challenge-088/roger-bell-west/python/ch-2.py | 58 +++++++++++++++ challenge-088/roger-bell-west/raku/ch-1.p6 | 13 ++++ challenge-088/roger-bell-west/raku/ch-2.p6 | 50 +++++++++++++ challenge-088/roger-bell-west/ruby/ch-1.rb | 20 ++++++ challenge-088/roger-bell-west/ruby/ch-2.rb | 68 ++++++++++++++++++ challenge-088/roger-bell-west/rust/ch-1.rs | 17 +++++ challenge-088/roger-bell-west/rust/ch-2.rs | 101 +++++++++++++++++++++++++++ 10 files changed, 417 insertions(+) create mode 100755 challenge-088/roger-bell-west/perl/ch-1.pl create mode 100755 challenge-088/roger-bell-west/perl/ch-2.pl create mode 100755 challenge-088/roger-bell-west/python/ch-1.py create mode 100755 challenge-088/roger-bell-west/python/ch-2.py create mode 100755 challenge-088/roger-bell-west/raku/ch-1.p6 create mode 100755 challenge-088/roger-bell-west/raku/ch-2.p6 create mode 100755 challenge-088/roger-bell-west/ruby/ch-1.rb create mode 100755 challenge-088/roger-bell-west/ruby/ch-2.rb create mode 100755 challenge-088/roger-bell-west/rust/ch-1.rs create mode 100755 challenge-088/roger-bell-west/rust/ch-2.rs diff --git a/challenge-088/roger-bell-west/perl/ch-1.pl b/challenge-088/roger-bell-west/perl/ch-1.pl new file mode 100755 index 0000000000..7de1c765d2 --- /dev/null +++ b/challenge-088/roger-bell-west/perl/ch-1.pl @@ -0,0 +1,18 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use Test::More tests => 2; + +is_deeply(aop([5, 2, 1, 4, 3]),[24, 60, 120, 30, 40],'example 1'); +is_deeply(aop([2, 1, 4, 3]),[12, 24, 6, 8],'example 2'); + +use List::Util qw(product); +use integer; + +sub aop { + my $ns=shift; + my $p=product(@{$ns}); + return [map {$p/$_} @{$ns}]; +} diff --git a/challenge-088/roger-bell-west/perl/ch-2.pl b/challenge-088/roger-bell-west/perl/ch-2.pl new file mode 100755 index 0000000000..9269ee56e6 --- /dev/null +++ b/challenge-088/roger-bell-west/perl/ch-2.pl @@ -0,0 +1,52 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use Test::More tests => 2; + +is_deeply(sm([ + [ 1, 2, 3 ], + [ 4, 5, 6 ], + [ 7, 8, 9 ], + ]),[1, 2, 3, 6, 9, 8, 7, 4, 5],'example 1'); +is_deeply(sm([ + [ 1, 2, 3, 4 ], + [ 5, 6, 7, 8 ], + [ 9, 10, 11, 12 ], + [ 13, 14, 15, 16 ], + ]),[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10],'example 2'); + +sub sm { + my $m=shift; + my $mx=scalar @{$m}; + my $my=scalar @{$m->[0]}; + my @o=($m->[0][0]); + my @v; + foreach (1..$mx) { + push @v,[(0) x $my]; + } + my @dir=( + [0,1], + [1,0], + [0,-1], + [-1,0], + ); + my ($x,$y,$d)=(0,0,0); + foreach (2..$mx*$my) { + $v[$x][$y]=1; + my ($nx,$ny); + while (1) { + ($nx,$ny)=($x+$dir[$d][0],$y+$dir[$d][1]); + if ($nx<0 || $nx>=$mx || $ny<0 || $ny>=$my || $v[$nx][$ny]==1) { + $d++; + $d%=4; + } else { + last; + } + } + ($x,$y)=($nx,$ny); + push @o,$m->[$x][$y]; + } + return \@o; +} diff --git a/challenge-088/roger-bell-west/python/ch-1.py b/challenge-088/roger-bell-west/python/ch-1.py new file mode 100755 index 0000000000..a6e5a3f2f3 --- /dev/null +++ b/challenge-088/roger-bell-west/python/ch-1.py @@ -0,0 +1,20 @@ +#! /usr/bin/python3 + +from functools import reduce +import operator + +def aop(ns): + p=reduce(operator.mul,ns) + return [p // i for i in ns] + +import unittest; + +class TestAop(unittest.TestCase): + + def test_ex1(self): + self.assertEqual(aop((5, 2, 1, 4, 3)),[24, 60, 120, 30, 40],'example 1') + + def test_ex2(self): + self.assertEqual(aop((2, 1, 4, 3)),[12, 24, 6, 8],'example 2') + +unittest.main() diff --git a/challenge-088/roger-bell-west/python/ch-2.py b/challenge-088/roger-bell-west/python/ch-2.py new file mode 100755 index 0000000000..33f1906b17 --- /dev/null +++ b/challenge-088/roger-bell-west/python/ch-2.py @@ -0,0 +1,58 @@ +#! /usr/bin/python3 + +def sm(m): + mx=len(m) + my=len(m[0]) + o=[m[0][0]] + v=list() + for i in range(mx): + v.append([False] * my) + dir=[ + [0,1], + [1,0], + [0,-1], + [-1,0] + ] + x=0 + y=0 + d=0 + for i in range(mx*my-1): + v[x][y]=True + nx=int() + ny=int() + while (1): + nx=x+dir[d][0] + ny=y+dir[d][1] + if (nx < 0 or + nx >= mx or + ny < 0 or + ny >= my or + v[nx][ny] == True): + d=(d+1)%4 + else: + break + x=nx + y=ny + o.append(m[x][y]) + return o + +import unittest; + +class TestSm(unittest.TestCase): + + def test_ex1(self): + self.assertEqual(sm(( + [ 1, 2, 3 ], + [ 4, 5, 6 ], + [ 7, 8, 9 ] + )),[1, 2, 3, 6, 9, 8, 7, 4, 5],'example 1') + + def test_ex2(self): + self.assertEqual(sm(( + [ 1, 2, 3, 4 ], + [ 5, 6, 7, 8 ], + [ 9, 10, 11, 12 ], + [ 13, 14, 15, 16 ] + )),[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10],'example 2') + +unittest.main() diff --git a/challenge-088/roger-bell-west/raku/ch-1.p6 b/challenge-088/roger-bell-west/raku/ch-1.p6 new file mode 100755 index 0000000000..13f3ee0334 --- /dev/null +++ b/challenge-088/roger-bell-west/raku/ch-1.p6 @@ -0,0 +1,13 @@ +#! /usr/bin/perl6 + +use Test; + +plan 2; + +is-deeply(aop((5, 2, 1, 4, 3)),(24, 60, 120, 30, 40),'example 1'); +is-deeply(aop((2, 1, 4, 3)),(12, 24, 6, 8),'example 2'); + +sub aop(@ns) { + my $p=@ns.reduce: &infix:<*>; + return (map {$p div $_}, @ns); +} diff --git a/challenge-088/roger-bell-west/raku/ch-2.p6 b/challenge-088/roger-bell-west/raku/ch-2.p6 new file mode 100755 index 0000000000..c0faba827a --- /dev/null +++ b/challenge-088/roger-bell-west/raku/ch-2.p6 @@ -0,0 +1,50 @@ +#! /usr/bin/perl6 + +use Test; + +plan 2; + +is-deeply(sm(( + [ 1, 2, 3 ], + [ 4, 5, 6 ], + [ 7, 8, 9 ], + )),(1, 2, 3, 6, 9, 8, 7, 4, 5),'example 1'); +is-deeply(sm(( + [ 1, 2, 3, 4 ], + [ 5, 6, 7, 8 ], + [ 9, 10, 11, 12 ], + [ 13, 14, 15, 16 ], + )),(1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10),'example 2'); + +sub sm(@m) { + my $mx=@m.elems; + my $my=@m[0].elems; + my @o=(@m[0][0]); + my @v; + for 1..$mx { + push @v,[(0) xx $my]; + } + my @dir=( + [0,1], + [1,0], + [0,-1], + [-1,0], + ); + my ($x,$y,$d)=(0,0,0); + for 2..$mx*$my { + @v[$x][$y]=1; + my ($nx,$ny); + while (1) { + ($nx,$ny)=($x+@dir[$d][0],$y+@dir[$d][1]); + if ($nx < 0 || $nx >= $mx || $ny < 0 || $ny >= $my || @v[$nx][$ny]==1) { + $d++; + $d%=4; + } else { + last; + } + } + ($x,$y)=($nx,$ny); + push @o,@m[$x][$y]; + } + return @o.List; +} diff --git a/challenge-088/roger-bell-west/ruby/ch-1.rb b/challenge-088/roger-bell-west/ruby/ch-1.rb new file mode 100755 index 0000000000..9f1c4bf44c --- /dev/null +++ b/challenge-088/roger-bell-west/ruby/ch-1.rb @@ -0,0 +1,20 @@ +#! /usr/bin/ruby + +def aop(*ns) + p=ns.reduce(:*) + return ns.map {|x| p.div(x)} +end + +require 'test/unit' + +class TestAop < Test::Unit::TestCase + + def test_ex1 + assert_equal([24, 60, 120, 30, 40],aop(5, 2, 1, 4, 3)) + end + + def test_ex2 + assert_equal([12, 24, 6, 8],aop(2, 1, 4, 3)) + end + +end diff --git a/challenge-088/roger-bell-west/ruby/ch-2.rb b/challenge-088/roger-bell-west/ruby/ch-2.rb new file mode 100755 index 0000000000..7dfcec29e6 --- /dev/null +++ b/challenge-088/roger-bell-west/ruby/ch-2.rb @@ -0,0 +1,68 @@ +#! /usr/bin/ruby + +def sm(*m) + mx=m.length + my=m[0].length + o=[m[0][0]] + v=Array.new; + 1.upto(mx) do + v.push([false] * my) + end + dir=[ + [0,1], + [1,0], + [0,-1], + [-1,0] + ] + x=0 + y=0 + d=0 + 2.upto(mx*my) do + v[x][y]=true + nx=0 + ny=0 + while (true) do + nx=x+dir[d][0] + ny=y+dir[d][1] + if (nx < 0 or nx >= mx or ny < 0 or ny >= my or v[nx][ny]==true) + d=(d+1)%4 + else + break + end + end + x=nx + y=ny + o.push(m[x][y]) + end + return o +end + + +require 'test/unit' + +class TestSm < Test::Unit::TestCase + + def test_ex1 + assert_equal( + [1, 2, 3, 6, 9, 8, 7, 4, 5], + sm( + [ 1, 2, 3 ], + [ 4, 5, 6 ], + [ 7, 8, 9 ] + ), + ) + end + + def test_ex2 + assert_equal( + [1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10], + sm( + [ 1, 2, 3, 4 ], + [ 5, 6, 7, 8 ], + [ 9, 10, 11, 12 ], + [ 13, 14, 15, 16 ] + ), + ) + end + +end diff --git a/challenge-088/roger-bell-west/rust/ch-1.rs b/challenge-088/roger-bell-west/rust/ch-1.rs new file mode 100755 index 0000000000..9adadfd570 --- /dev/null +++ b/challenge-088/roger-bell-west/rust/ch-1.rs @@ -0,0 +1,17 @@ +#! /bin/sh +//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x; rm -f ${0}x ; exit + +#[test] +fn test_ex1() { + assert_eq!(aop(vec![5, 2, 1, 4, 3]),vec![24, 60, 120, 30, 40]); +} + +#[test] +fn test_ex2() { + assert_eq!(aop(vec![2, 1, 4, 3],),vec![12, 24, 6, 8]); +} + +fn aop(ns: Vec) -> Vec { + let p=ns.iter().fold(1,|sum, item| sum * item); + return ns.iter().map(|i| p/i).collect() +} diff --git a/challenge-088/roger-bell-west/rust/ch-2.rs b/challenge-088/roger-bell-west/rust/ch-2.rs new file mode 100755 index 0000000000..063f60bc14 --- /dev/null +++ b/challenge-088/roger-bell-west/rust/ch-2.rs @@ -0,0 +1,101 @@ +#! /bin/sh +//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x; rm -f ${0}x ; exit + +use std::convert::TryInto; + +#[test] +fn test_ex1() { + assert_eq!(sm(vec![ + vec![ 1, 2, 3 ], + vec![ 4, 5, 6 ], + vec![ 7, 8, 9 ] + ]),vec![1, 2, 3, 6, 9, 8, 7, 4, 5]); +} + +#[test] +fn test_ex2() { + assert_eq!(sm(vec![ + vec![ 1, 2, 3, 4 ], + vec![ 5, 6, 7, 8 ], + vec![ 9, 10, 11, 12 ], + vec![ 13, 14, 15, 16 ], + ],),vec![1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]); +} + +fn sm(m: Vec>) -> Vec { + let mx=m.len() as usize; + let my: usize=m[0].len(); + let mut o=Vec::::with_capacity((mx*my).try_into().unwrap()); + o.push(m[0][0]); + let mut v=vec![vec![false; my]; mx]; + let dir=vec![ + vec![0,1], + vec![1,0], + vec![0,-1], + vec![-1,0] + ]; + let mut x :usize=0; + let mut y :usize=0; + let mut d :usize=0; + for _i in 1..mx*my { + v[x][y]=true; + let mut nx: isize; + let mut ny: isize; + loop { + nx=(x as isize)+dir[d][0]; + ny=(y as isize)+dir[d][1]; + let mut ex=false; + if nx < 0 || nx as usize >= mx || + ny < 0 || ny as usize >= my { + ex=true; + } + if ex==false { + if v[nx as usize][ny as usize]==true { + ex=true; + } + } + if ex { + d=(d+1)%4; + } else { + break; + } + } + x=nx.try_into().unwrap(); + y=ny.try_into().unwrap(); + o.push(m[x][y]); + } + return o +} + +//sub sm(@m) { +// my $mx=@m.elems; +// my $my=@m[0].elems; +// my @o=(@m[0][0]); +// my @v; +// for 1..$mx { +// push @v,[(0) xx $my]; +// } +// my @dir=( +// [0,1], +// [1,0], +// [0,-1], +// [-1,0], +// ); +// my ($x,$y,$d)=(0,0,0); +// for 2..$mx*$my { +// @v[$x][$y]=1; +// my ($nx,$ny); +// while (1) { +// ($nx,$ny)=($x+@dir[$d][0],$y+@dir[$d][1]); +// if ($nx < 0 || $nx >= $mx || $ny < 0 || $ny >= $my || @v[$nx][$ny]==1) { +// $d++; +// $d%=4; +// } else { +// last; +// } +// } +// ($x,$y)=($nx,$ny); +// push @o,@m[$x][$y]; +// } +// return @o.List; +//} -- cgit From df716b4b4e9af980f6cd5d267a16eaa9716f03af Mon Sep 17 00:00:00 2001 From: Roger Bell_West Date: Mon, 23 Nov 2020 14:53:10 +0000 Subject: remove spurious comments --- challenge-088/roger-bell-west/rust/ch-2.rs | 33 ------------------------------ 1 file changed, 33 deletions(-) diff --git a/challenge-088/roger-bell-west/rust/ch-2.rs b/challenge-088/roger-bell-west/rust/ch-2.rs index 063f60bc14..01f91c0a98 100755 --- a/challenge-088/roger-bell-west/rust/ch-2.rs +++ b/challenge-088/roger-bell-west/rust/ch-2.rs @@ -66,36 +66,3 @@ fn sm(m: Vec>) -> Vec { } return o } - -//sub sm(@m) { -// my $mx=@m.elems; -// my $my=@m[0].elems; -// my @o=(@m[0][0]); -// my @v; -// for 1..$mx { -// push @v,[(0) xx $my]; -// } -// my @dir=( -// [0,1], -// [1,0], -// [0,-1], -// [-1,0], -// ); -// my ($x,$y,$d)=(0,0,0); -// for 2..$mx*$my { -// @v[$x][$y]=1; -// my ($nx,$ny); -// while (1) { -// ($nx,$ny)=($x+@dir[$d][0],$y+@dir[$d][1]); -// if ($nx < 0 || $nx >= $mx || $ny < 0 || $ny >= $my || @v[$nx][$ny]==1) { -// $d++; -// $d%=4; -// } else { -// last; -// } -// } -// ($x,$y)=($nx,$ny); -// push @o,@m[$x][$y]; -// } -// return @o.List; -//} -- cgit