diff options
| -rwxr-xr-x | challenge-094/roger-bell-west/perl/ch-1.pl | 38 | ||||
| -rwxr-xr-x | challenge-094/roger-bell-west/perl/ch-2.pl | 28 | ||||
| -rwxr-xr-x | challenge-094/roger-bell-west/python/ch-1.py | 35 | ||||
| -rwxr-xr-x | challenge-094/roger-bell-west/python/ch-2.py | 22 | ||||
| -rwxr-xr-x | challenge-094/roger-bell-west/raku/ch-1.p6 | 30 | ||||
| -rwxr-xr-x | challenge-094/roger-bell-west/raku/ch-2.p6 | 28 | ||||
| -rwxr-xr-x | challenge-094/roger-bell-west/ruby/ch-1.rb | 47 | ||||
| -rwxr-xr-x | challenge-094/roger-bell-west/ruby/ch-2.rb | 26 | ||||
| -rwxr-xr-x | challenge-094/roger-bell-west/rust/ch-1.rs | 44 | ||||
| -rwxr-xr-x | challenge-094/roger-bell-west/rust/ch-2.rs | 25 |
10 files changed, 323 insertions, 0 deletions
diff --git a/challenge-094/roger-bell-west/perl/ch-1.pl b/challenge-094/roger-bell-west/perl/ch-1.pl new file mode 100755 index 0000000000..3d9150b892 --- /dev/null +++ b/challenge-094/roger-bell-west/perl/ch-1.pl @@ -0,0 +1,38 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use Test::More tests => 2; + +is_deeply(ga(qw(opt bat saw tab pot top was)),[[qw(bat tab)],[qw(opt pot top)],[qw(saw was)]],'example 1'); +is_deeply(ga('x'),[['x']],'example 2'); + +sub ga { + my @in=@_; + my %g; + foreach my $word (@in) { + push @{$g{wh($word)}},$word; + } + my @out; + foreach my $k (values %g) { + push @out,[sort @{$k}]; + } + @out=sort {$a->[0] cmp $b->[0]} @out; + return \@out; +} + +sub wh { + my $w=shift; + $w=lc($w); + if ($w =~ /[^a-z]/) { + return 0; + } + my $b=ord('a'); + my @p=(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101); + my $n=1; + foreach my $c (split '',$w) { + $n*=$p[ord($c)-$b]; + } + return $n; +} diff --git a/challenge-094/roger-bell-west/perl/ch-2.pl b/challenge-094/roger-bell-west/perl/ch-2.pl new file mode 100755 index 0000000000..284a179b07 --- /dev/null +++ b/challenge-094/roger-bell-west/perl/ch-2.pl @@ -0,0 +1,28 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use Test::More tests => 1; + +is_deeply(bt2ll([1,2,3,4,5,undef,undef,undef,undef,6,7]), + [1,2,4,5,6,7,3], + 'example 1', + ); + +sub bt2ll { + my $tree=shift; + return recurse($tree,0,[]); +} + +sub recurse { + my ($tree,$start,$out)=@_; + push @{$out},$tree->[$start]; + my $b=$start*2+1; + foreach my $ba ($b,$b+1) { + if ($ba <= $#{$tree} && defined $tree->[$ba]) { + recurse($tree,$ba,$out); + } + } + return $out; +} diff --git a/challenge-094/roger-bell-west/python/ch-1.py b/challenge-094/roger-bell-west/python/ch-1.py new file mode 100755 index 0000000000..b20544485a --- /dev/null +++ b/challenge-094/roger-bell-west/python/ch-1.py @@ -0,0 +1,35 @@ +#! /usr/bin/python3 + +from collections import defaultdict + +def ga(*l): + g=defaultdict(set) + for word in l: + g[wh(word)].add(word) + r=set() + for v in g.values(): + r.add(frozenset(v)) + return r + +def wh(word): + w=word.lower() + if not w.isalpha(): + return 0 + b=ord('a') + p=list([2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101]) + n=1 + for c in w: + n *= p[ord(c)-b] + return n + +import unittest + +class TestGa(unittest.TestCase): + + def test_ex1(self): + self.assertEqual(ga('opt','bat','saw','tab','pot','top','was'),{frozenset({'bat','tab'}),frozenset({'opt','pot','top'}),frozenset({'saw','was'})},'example 1'); + + def test_ex2(self): + self.assertEqual(ga('x'),{frozenset({'x'})},'example 2'); + +unittest.main() diff --git a/challenge-094/roger-bell-west/python/ch-2.py b/challenge-094/roger-bell-west/python/ch-2.py new file mode 100755 index 0000000000..b21b96c956 --- /dev/null +++ b/challenge-094/roger-bell-west/python/ch-2.py @@ -0,0 +1,22 @@ +#! /usr/bin/python3 + +def bt2ll(*tree): + return recurse(tree,0) + +def recurse(tree,start): + out=list([tree[start]]) + b=start*2+1 + for ba in range(b,b+2): + if ba < len(tree) and tree[ba] is not None: + for t in recurse(tree,ba): + out.append(t) + return out + +import unittest + +class TestBt2ll(unittest.TestCase): + + def test_ex1(self): + self.assertEqual(bt2ll(1,2,3,4,5,None,None,None,None,6,7),[1,2,4,5,6,7,3],'example 1'); + +unittest.main() diff --git a/challenge-094/roger-bell-west/raku/ch-1.p6 b/challenge-094/roger-bell-west/raku/ch-1.p6 new file mode 100755 index 0000000000..5c78f206fe --- /dev/null +++ b/challenge-094/roger-bell-west/raku/ch-1.p6 @@ -0,0 +1,30 @@ +#! /usr/bin/perl6 + +use Test; + +plan 2; + +is-deeply(ga('opt','bat','saw','tab','pot','top','was'),Set.new(Set.new('bat','tab'),Set.new('opt','pot','top'),Set.new('saw','was')),'example 1'); +is-deeply(ga('x'),Set.new(Set.new('x')),'example 2'); + +sub ga(**@in) { + my %g; + for @in -> $word { + push %g{wh($word)},$word; + } + return Set(map {Set($_)}, %g.values); +} + +sub wh($word) { + my $w=lc($word); + if ($w ~~ /<-[a..z]>/) { + return 0; + } + my $b='a'.ord; + my @p=(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101); + my $n=1; + for $w.comb(/./) -> $c { + $n*=@p[$c.ord-$b]; + } + return $n; +} diff --git a/challenge-094/roger-bell-west/raku/ch-2.p6 b/challenge-094/roger-bell-west/raku/ch-2.p6 new file mode 100755 index 0000000000..b5f9d81554 --- /dev/null +++ b/challenge-094/roger-bell-west/raku/ch-2.p6 @@ -0,0 +1,28 @@ +#! /usr/bin/perl6 + +use Test; + +plan 1; + +is-deeply(bt2ll(1,2,3,4,5,-1,-1,-1,-1,6,7), + (1,2,4,5,6,7,3), + 'example 1', + ); + +sub bt2ll(**@tree) { + return recurse(@tree,0); +} + +sub recurse(@tree,$start) { + my @out=(@tree[$start]); + my $b=$start*2+1; + for ($b,$b+1) -> $ba { + if ($ba <= @tree.end && @tree[$ba]>=0) { + for recurse(@tree,$ba) -> $t { + push @out,$t; + } + } + } + return @out.flat; +} + diff --git a/challenge-094/roger-bell-west/ruby/ch-1.rb b/challenge-094/roger-bell-west/ruby/ch-1.rb new file mode 100755 index 0000000000..9525c6f42e --- /dev/null +++ b/challenge-094/roger-bell-west/ruby/ch-1.rb @@ -0,0 +1,47 @@ +#! /usr/bin/ruby + +require 'set' + +def ga(*l) + g=Hash.new + l.each do |word| + h=wh(word) + if !g.has_key?(h) then + g[h]=Set.new; + end + g[h] << word + end + r=Set.new + g.values().each do |v| + r << v + end + return r +end + +def wh(word) + w=word.downcase + if w =~ /[^a-z]/ then + return 0 + end + b='a'.ord + p=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101] + n=1 + w.chars do |c| + n *= p[c.ord-b] + end + return n +end + +require 'test/unit' + +class TestGa < Test::Unit::TestCase + + def test_ex1 + assert_equal(Set.new([Set.new(['bat','tab']),Set.new(['opt','pot','top']),Set.new(['saw','was'])]),ga('opt','bat','saw','tab','pot','top','was')) + end + + def test_ex2 + assert_equal(Set.new([Set.new(["x"])]),ga('x')) + end + +end diff --git a/challenge-094/roger-bell-west/ruby/ch-2.rb b/challenge-094/roger-bell-west/ruby/ch-2.rb new file mode 100755 index 0000000000..7a4c52b9d9 --- /dev/null +++ b/challenge-094/roger-bell-west/ruby/ch-2.rb @@ -0,0 +1,26 @@ +#! /usr/bin/ruby + +def bt2ll(*tree) + return recurse(tree,0) +end + +def recurse(tree,start) + out=Array.new([tree[start]]) + b=start*2+1 + b.upto(b+1) do |ba| + if ba <= tree.length && !tree[ba].nil? then + recurse(tree,ba).each() {|t| out.push(t)} + end + end + return out +end + +require 'test/unit' + +class TestBt2ll < Test::Unit::TestCase + + def test_ex1 + assert_equal([1,2,4,5,6,7,3],bt2ll(1,2,3,4,5,nil,nil,nil,nil,6,7)) + end + +end diff --git a/challenge-094/roger-bell-west/rust/ch-1.rs b/challenge-094/roger-bell-west/rust/ch-1.rs new file mode 100755 index 0000000000..2767b9b437 --- /dev/null +++ b/challenge-094/roger-bell-west/rust/ch-1.rs @@ -0,0 +1,44 @@ +#! /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!(ga(vec!["opt".to_string(),"bat".to_string(),"saw".to_string(),"tab".to_string(),"pot".to_string(),"top".to_string(),"was".to_string()]),vec![vec!["bat".to_string(),"tab".to_string()],vec!["opt".to_string(),"pot".to_string(),"top".to_string()],vec!["saw".to_string(),"was".to_string()]]); +} + +#[test] +fn test_ex2() { + assert_eq!(ga(vec!["x".to_string()]),vec![vec!["x".to_string()]]); +} + +fn ga(l: Vec<String>) -> Vec<Vec<String>> { + let mut g: HashMap<u128,Vec<String>>=HashMap::new(); + for word in l { + let h=wh(&word); + let mut e: Vec<String>=vec![]; + if g.contains_key(&h) { + e=g.get(&h).unwrap().to_vec(); + } + e.push(word); + g.insert(h,e); + } + let mut r: Vec<Vec<String>>=vec![]; + for (_k,v) in g { + let mut vv=v.clone(); + vv.sort(); + r.push(vv); + } + r.sort(); + return r; +} + +fn wh (word: &String) -> u128 { + let pr=vec![2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101]; + let mut n: u128 = 1; + for i in word.chars() { + n*=pr[(i.to_digit(36).unwrap()-10) as usize]; + } + return n; +} diff --git a/challenge-094/roger-bell-west/rust/ch-2.rs b/challenge-094/roger-bell-west/rust/ch-2.rs new file mode 100755 index 0000000000..04b02f0aac --- /dev/null +++ b/challenge-094/roger-bell-west/rust/ch-2.rs @@ -0,0 +1,25 @@ +#! /bin/sh +//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x; rm -f ${0}x ; exit + +#[test] +fn test_ex1() { + assert_eq!(bt2ll(vec![1,2,3,4,5,-1,-1,-1,-1,6,7]),vec![1,2,4,5,6,7,3]); +} + +fn bt2ll(tree: Vec<i32>) -> Vec<i32> { + return recurse(tree,0); +} + +fn recurse(tree: Vec<i32>, start: usize) -> Vec<i32> { + let mut out=vec![tree[start]]; + let b=start*2+1; + for ba in b..=b+1 { + if ba < tree.len() && tree[ba]>-1 { + for t in recurse(tree.clone(),ba) { + out.push(t); + } + } + } + return out; +} + |
