diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2020-11-23 18:22:55 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-23 18:22:55 +0000 |
| commit | 74bf3e934750a95e8010c6c2ff0178ca53574296 (patch) | |
| tree | fc670017b9df4eafe72dbd85ce96fb27d5b2b996 | |
| parent | f840e61b377865dc1d168cb3318bba5741d9e433 (diff) | |
| parent | df716b4b4e9af980f6cd5d267a16eaa9716f03af (diff) | |
| download | perlweeklychallenge-club-74bf3e934750a95e8010c6c2ff0178ca53574296.tar.gz perlweeklychallenge-club-74bf3e934750a95e8010c6c2ff0178ca53574296.tar.bz2 perlweeklychallenge-club-74bf3e934750a95e8010c6c2ff0178ca53574296.zip | |
Merge pull request #2829 from Firedrake/rogerbw-challenge-088
Solutions for challenge #88.
| -rwxr-xr-x | challenge-088/roger-bell-west/perl/ch-1.pl | 18 | ||||
| -rwxr-xr-x | challenge-088/roger-bell-west/perl/ch-2.pl | 52 | ||||
| -rwxr-xr-x | challenge-088/roger-bell-west/python/ch-1.py | 20 | ||||
| -rwxr-xr-x | challenge-088/roger-bell-west/python/ch-2.py | 58 | ||||
| -rwxr-xr-x | challenge-088/roger-bell-west/raku/ch-1.p6 | 13 | ||||
| -rwxr-xr-x | challenge-088/roger-bell-west/raku/ch-2.p6 | 50 | ||||
| -rwxr-xr-x | challenge-088/roger-bell-west/ruby/ch-1.rb | 20 | ||||
| -rwxr-xr-x | challenge-088/roger-bell-west/ruby/ch-2.rb | 68 | ||||
| -rwxr-xr-x | challenge-088/roger-bell-west/rust/ch-1.rs | 17 | ||||
| -rwxr-xr-x | challenge-088/roger-bell-west/rust/ch-2.rs | 68 |
10 files changed, 384 insertions, 0 deletions
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<i32>) -> Vec<i32> { + 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..01f91c0a98 --- /dev/null +++ b/challenge-088/roger-bell-west/rust/ch-2.rs @@ -0,0 +1,68 @@ +#! /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<i32>>) -> Vec<i32> { + let mx=m.len() as usize; + let my: usize=m[0].len(); + let mut o=Vec::<i32>::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 +} |
