aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xchallenge-094/roger-bell-west/perl/ch-1.pl38
-rwxr-xr-xchallenge-094/roger-bell-west/perl/ch-2.pl28
-rwxr-xr-xchallenge-094/roger-bell-west/python/ch-1.py35
-rwxr-xr-xchallenge-094/roger-bell-west/python/ch-2.py22
-rwxr-xr-xchallenge-094/roger-bell-west/raku/ch-1.p630
-rwxr-xr-xchallenge-094/roger-bell-west/raku/ch-2.p628
-rwxr-xr-xchallenge-094/roger-bell-west/ruby/ch-1.rb47
-rwxr-xr-xchallenge-094/roger-bell-west/ruby/ch-2.rb26
-rwxr-xr-xchallenge-094/roger-bell-west/rust/ch-1.rs44
-rwxr-xr-xchallenge-094/roger-bell-west/rust/ch-2.rs25
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;
+}
+