diff options
| author | Roger Bell_West <roger@firedrake.org> | 2020-10-12 14:11:02 +0100 |
|---|---|---|
| committer | Roger Bell_West <roger@firedrake.org> | 2020-10-12 14:11:02 +0100 |
| commit | 93e729872243499407d495846097b5d6488d94ea (patch) | |
| tree | 75336dfe5469894fd472b0644663c624b872016b | |
| parent | 2e7fb5ec844f60c121ef26d50e6b7f24b8849780 (diff) | |
| download | perlweeklychallenge-club-93e729872243499407d495846097b5d6488d94ea.tar.gz perlweeklychallenge-club-93e729872243499407d495846097b5d6488d94ea.tar.bz2 perlweeklychallenge-club-93e729872243499407d495846097b5d6488d94ea.zip | |
Solutions for challenge 82.
| -rwxr-xr-x | challenge-082/roger-bell-west/perl/ch-1.pl | 38 | ||||
| -rwxr-xr-x | challenge-082/roger-bell-west/perl/ch-2.pl | 32 | ||||
| -rwxr-xr-x | challenge-082/roger-bell-west/python/ch-1.py | 40 | ||||
| -rwxr-xr-x | challenge-082/roger-bell-west/python/ch-2.py | 37 | ||||
| -rwxr-xr-x | challenge-082/roger-bell-west/raku/ch-1.p6 | 32 | ||||
| -rwxr-xr-x | challenge-082/roger-bell-west/raku/ch-2.p6 | 31 | ||||
| -rwxr-xr-x | challenge-082/roger-bell-west/ruby/ch-1.rb | 49 | ||||
| -rwxr-xr-x | challenge-082/roger-bell-west/ruby/ch-2.rb | 45 |
8 files changed, 304 insertions, 0 deletions
diff --git a/challenge-082/roger-bell-west/perl/ch-1.pl b/challenge-082/roger-bell-west/perl/ch-1.pl new file mode 100755 index 0000000000..52d220c256 --- /dev/null +++ b/challenge-082/roger-bell-west/perl/ch-1.pl @@ -0,0 +1,38 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use Test::More tests => 5; + +is_deeply(factor(12),{1 => 1, 2 => 1, 3 => 1, 4 => 1, 6 => 1, 12 => 1},'twelve'); +is_deeply(factor(18),{1 => 1, 2 => 1, 3 => 1, 6 => 1, 9 => 1, 18 => 1},'eighteen'); +is_deeply(factor(23),{1 => 1, 23 => 1},'twenty-three'); + +is_deeply(commonfactor(12,18),[1,2,3,6],'twelve-eighteen'); +is_deeply(commonfactor(18,23),[1],'twelve-twentythree'); + +sub factor { + my $n=shift; + my %o=map {$_ => 1} (1,$n); + foreach my $i (2..int(sqrt($n))) { + if ($n % $i == 0) { + $o{$n/$i}=$o{$i}=1; + } + } + return \%o; +} + +sub commonfactor { + my @f=map {factor($_)} @_; + my $s=shift @f; + while (@f) { + my $q=shift @f; + foreach my $f (keys %{$s}) { + unless (exists $q->{$f}) { + delete $s->{$f}; + } + } + } + return [sort keys %{$s}]; +} diff --git a/challenge-082/roger-bell-west/perl/ch-2.pl b/challenge-082/roger-bell-west/perl/ch-2.pl new file mode 100755 index 0000000000..30b078022a --- /dev/null +++ b/challenge-082/roger-bell-west/perl/ch-2.pl @@ -0,0 +1,32 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use Test::More tests => 5; + +is(isinterleave(qw(XY X XXY)),1,'example 1'); +is(isinterleave(qw(XXY XXZ XXXXZY)),1,'example 2'); +is(isinterleave(qw(YX X XXY)),0,'example 3'); +is(isinterleave(qw(ACF BDEG ABCDEFG)),1,'example 4'); +is(isinterleave(qw(ACF BDGE ABCDEFG)),0,'example 5'); + +sub isinterleave { + my ($a,$b,$c)=@_; + my @s=(map {[split '',$_]} ($a,$b,$c)); + my @l=map {$#{$_}} @s; + my @buf=([0,0,0]); + while (@buf) { + my $n=shift @buf; + if ($n->[2] > $l[2]) { + return 1; + } + if ($n->[0] <= $l[0] && $s[0][$n->[0]] eq $s[2][$n->[2]]) { + push @buf,[$n->[0]+1,$n->[1],$n->[2]+1]; + } + if ($n->[1] <= $l[1] && $s[1][$n->[1]] eq $s[2][$n->[2]]) { + push @buf,[$n->[0],$n->[1]+1,$n->[2]+1]; + } + } + return 0; +} diff --git a/challenge-082/roger-bell-west/python/ch-1.py b/challenge-082/roger-bell-west/python/ch-1.py new file mode 100755 index 0000000000..88e8cc4399 --- /dev/null +++ b/challenge-082/roger-bell-west/python/ch-1.py @@ -0,0 +1,40 @@ +#! /usr/bin/python3 + +import unittest +from math import sqrt + +def factor(n): + o=set() + o.add(1) + o.add(n) + for i in range(2,int(sqrt(n))+1): + if (n % i == 0): + o.add(int(n/i)) + o.add(i) + return o + +def commonfactor(*fs): + f=list(map(factor,fs)) + s=f.pop(); + while (f): + s = s & f.pop() + return sorted(s) + +class TestCf(unittest.TestCase): + + def test_f1(self): + self.assertEqual(factor(12),set((1,2,3,4,6,12)),'twelve') + + def test_f2(self): + self.assertEqual(factor(18),set((1,2,3,6,9,18)),'eighteen') + + def test_f3(self): + self.assertEqual(factor(23),set((1,23)),'twenty-three') + + def test_cf1(self): + self.assertEqual(commonfactor(12,18),[1,2,3,6],'twelve-eighteen') + + def test_cf2(self): + self.assertEqual(commonfactor(18,23),[1],'twelve-twentythree') + +unittest.main() diff --git a/challenge-082/roger-bell-west/python/ch-2.py b/challenge-082/roger-bell-west/python/ch-2.py new file mode 100755 index 0000000000..4b88c1acf0 --- /dev/null +++ b/challenge-082/roger-bell-west/python/ch-2.py @@ -0,0 +1,37 @@ +#! /usr/bin/python3 + +import unittest +from collections import deque + +def isinterleave(a,b,c): + l=list(map(len,(a,b,c))) + buf=deque() + buf.append([0,0,0]) + while (buf): + n=buf.popleft() + if (n[2] >= l[2]): + return 1 + if ((n[0] < l[0]) and (a[n[0]] == c[n[2]])): + buf.append([n[0]+1,n[1],n[2]+1]) + if ((n[1] < l[1]) and (b[n[1]] == c[n[2]])): + buf.append([n[0],n[1]+1,n[2]+1]) + return 0 + +class TestInterleave(unittest.TestCase): + + def test_ex1(self): + self.assertEqual(isinterleave('XY','X','XXY'),1,'example 1') + + def test_ex2(self): + self.assertEqual(isinterleave('XXY','XXZ','XXXXZY'),1,'example 2') + + def test_ex3(self): + self.assertEqual(isinterleave('YX','X','XXY'),0,'example 3') + + def test_ex4(self): + self.assertEqual(isinterleave('ACF','BDEG','ABCDEFG'),1,'example 4') + + def test_ex5(self): + self.assertEqual(isinterleave('ACF','BDGE','ABCDEFG'),0,'example 5') + +unittest.main() diff --git a/challenge-082/roger-bell-west/raku/ch-1.p6 b/challenge-082/roger-bell-west/raku/ch-1.p6 new file mode 100755 index 0000000000..01207a3e42 --- /dev/null +++ b/challenge-082/roger-bell-west/raku/ch-1.p6 @@ -0,0 +1,32 @@ +#! /usr/bin/perl6 + +use Test; + +plan 5; + +is-deeply(factor(12),SetHash.new(1,2,3,4,6,12),'twelve'); +is-deeply(factor(18),SetHash.new(1,2,3,6,9,18),'eighteen'); +is-deeply(factor(23),SetHash.new(1,23),'twenty-three'); + +is-deeply(commonfactor(12,18),(1,2,3,6),'twelve-eighteen'); +is-deeply(commonfactor(18,23),(1,),'twelve-twentythree'); + +sub factor($n) { + my $o=SetHash.new(1,$n); + for 2..floor(sqrt($n)) -> $i { + if ($n % $i == 0) { + $o{Int.new($n/$i)}++; + $o{$i}++; + } + } + return $o; +} + +sub commonfactor { + my @f=map {factor($_)},@_; + my $s=shift @f; + while (@f) { + $s (&)= shift @f; + } + return $s.keys.sort; +} diff --git a/challenge-082/roger-bell-west/raku/ch-2.p6 b/challenge-082/roger-bell-west/raku/ch-2.p6 new file mode 100755 index 0000000000..8d468d02a3 --- /dev/null +++ b/challenge-082/roger-bell-west/raku/ch-2.p6 @@ -0,0 +1,31 @@ +#! /usr/bin/perl6 + +use Test; + +plan 5; + +is(isinterleave('XY','X','XXY'),1,'example 1'); +is(isinterleave('XXY','XXZ','XXXXZY'),1,'example 2'); +is(isinterleave('YX','X','XXY'),0,'example 3'); +is(isinterleave('ACF','BDEG','ABCDEFG'),1,'example 4'); +is(isinterleave('ACF','BDGE','ABCDEFG'),0,'example 5'); + +sub isinterleave { + my ($a,$b,$c)=@_; + my @s=(map {[$_.comb]}, ($a,$b,$c)); + my @l=map {$_.end},@s; + my @buf=([0,0,0],); + while (@buf) { + my $n=shift @buf; + if ($n.[2] > @l[2]) { + return 1; + } + if ($n.[0] <= @l[0] && @s[0][$n.[0]] eq @s[2][$n.[2]]) { + push @buf,[$n.[0]+1,$n.[1],$n.[2]+1]; + } + if ($n.[1] <= @l[1] && @s[1][$n.[1]] eq @s[2][$n.[2]]) { + push @buf,[$n.[0],$n.[1]+1,$n.[2]+1]; + } + } + return 0; +} diff --git a/challenge-082/roger-bell-west/ruby/ch-1.rb b/challenge-082/roger-bell-west/ruby/ch-1.rb new file mode 100755 index 0000000000..309176d51c --- /dev/null +++ b/challenge-082/roger-bell-west/ruby/ch-1.rb @@ -0,0 +1,49 @@ +#! /usr/bin/ruby + +require 'set' + +def factor(n) + o=Set.new([1,n]) + 2.upto(Math.sqrt(n).floor) do |i| + if (n % i == 0) + o.add(n/i) + o.add(i) + end + end + return o +end + +def commonfactor(*fs) + f=fs.map{|x| factor(x)} + s=f.pop + while (!f.empty?) + s = s & f.pop + end + return s.sort +end + +require 'test/unit' + +class TestCf < Test::Unit::TestCase + + def test_f1 + assert_equal(Set.new([1,2,3,4,6,12]),factor(12)) + end + + def test_f2 + assert_equal(Set.new([1,2,3,6,9,18]),factor(18)) + end + + def test_f3 + assert_equal(Set.new([1,23]),factor(23)) + end + + def test_cf1 + assert_equal([1,2,3,6],commonfactor(12,18)) + end + + def test_cf2 + assert_equal([1],commonfactor(18,23)) + end + +end diff --git a/challenge-082/roger-bell-west/ruby/ch-2.rb b/challenge-082/roger-bell-west/ruby/ch-2.rb new file mode 100755 index 0000000000..067bddb305 --- /dev/null +++ b/challenge-082/roger-bell-west/ruby/ch-2.rb @@ -0,0 +1,45 @@ +#! /usr/bin/ruby + +def isinterleave(a,b,c) + l=[a,b,c].map{|x| x.length} + buf=[[0,0,0]] + while (!buf.empty?) + n=buf.pop + if (n[2] >= l[2]) + return 1 + end + if ((n[0] < l[0]) and (a[n[0]] == c[n[2]])) + buf.push([n[0]+1,n[1],n[2]+1]) + end + if ((n[1] < l[1]) and (b[n[1]] == c[n[2]])) + buf.push([n[0],n[1]+1,n[2]+1]) + end + end + return 0 +end + +require 'test/unit' + +class TestInterleave < Test::Unit::TestCase + + def test_ex1 + assert_equal(isinterleave('XY','X','XXY'),1) + end + + def test_ex2 + assert_equal(isinterleave('XXY','XXZ','XXXXZY'),1) + end + + def test_ex3 + assert_equal(isinterleave('YX','X','XXY'),0) + end + + def test_ex4 + assert_equal(isinterleave('ACF','BDEG','ABCDEFG'),1) + end + + def test_ex5 + assert_equal(isinterleave('ACF','BDGE','ABCDEFG'),0) + end + +end |
