aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-11-23 18:22:55 +0000
committerGitHub <noreply@github.com>2020-11-23 18:22:55 +0000
commit74bf3e934750a95e8010c6c2ff0178ca53574296 (patch)
treefc670017b9df4eafe72dbd85ce96fb27d5b2b996
parentf840e61b377865dc1d168cb3318bba5741d9e433 (diff)
parentdf716b4b4e9af980f6cd5d267a16eaa9716f03af (diff)
downloadperlweeklychallenge-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-xchallenge-088/roger-bell-west/perl/ch-1.pl18
-rwxr-xr-xchallenge-088/roger-bell-west/perl/ch-2.pl52
-rwxr-xr-xchallenge-088/roger-bell-west/python/ch-1.py20
-rwxr-xr-xchallenge-088/roger-bell-west/python/ch-2.py58
-rwxr-xr-xchallenge-088/roger-bell-west/raku/ch-1.p613
-rwxr-xr-xchallenge-088/roger-bell-west/raku/ch-2.p650
-rwxr-xr-xchallenge-088/roger-bell-west/ruby/ch-1.rb20
-rwxr-xr-xchallenge-088/roger-bell-west/ruby/ch-2.rb68
-rwxr-xr-xchallenge-088/roger-bell-west/rust/ch-1.rs17
-rwxr-xr-xchallenge-088/roger-bell-west/rust/ch-2.rs68
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
+}