aboutsummaryrefslogtreecommitdiff
path: root/challenge-151
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-02-07 17:54:08 +0000
committerGitHub <noreply@github.com>2022-02-07 17:54:08 +0000
commit3a155754f659bc83e1b8e907e70b210b087e4632 (patch)
treed8fb8f029d0b428a15b4537f2fff1e6c334e3a00 /challenge-151
parentd4fec6b7157921fd3a1f1178f0899696c4d405d5 (diff)
parent0d6a1d8434aeac8a9dec8008652455ece54c3206 (diff)
downloadperlweeklychallenge-club-3a155754f659bc83e1b8e907e70b210b087e4632.tar.gz
perlweeklychallenge-club-3a155754f659bc83e1b8e907e70b210b087e4632.tar.bz2
perlweeklychallenge-club-3a155754f659bc83e1b8e907e70b210b087e4632.zip
Merge pull request #5623 from Firedrake/rogerbw-challenge-151
Solutions for challenge #151
Diffstat (limited to 'challenge-151')
-rwxr-xr-xchallenge-151/roger-bell-west/javascript/ch-1.js66
-rwxr-xr-xchallenge-151/roger-bell-west/javascript/ch-2.js43
-rw-r--r--challenge-151/roger-bell-west/kotlin/ch-1.kt65
-rw-r--r--challenge-151/roger-bell-west/kotlin/ch-2.kt45
-rwxr-xr-xchallenge-151/roger-bell-west/lua/ch-1.lua63
-rwxr-xr-xchallenge-151/roger-bell-west/lua/ch-2.lua47
-rwxr-xr-xchallenge-151/roger-bell-west/perl/ch-1.pl62
-rwxr-xr-xchallenge-151/roger-bell-west/perl/ch-2.pl33
-rw-r--r--challenge-151/roger-bell-west/postscript/ch-1.ps90
-rw-r--r--challenge-151/roger-bell-west/postscript/ch-2.ps52
-rwxr-xr-xchallenge-151/roger-bell-west/python/ch-1.py54
-rwxr-xr-xchallenge-151/roger-bell-west/python/ch-2.py32
-rwxr-xr-xchallenge-151/roger-bell-west/raku/ch-1.p658
-rwxr-xr-xchallenge-151/roger-bell-west/raku/ch-2.p631
-rwxr-xr-xchallenge-151/roger-bell-west/ruby/ch-1.rb65
-rwxr-xr-xchallenge-151/roger-bell-west/ruby/ch-2.rb37
-rwxr-xr-xchallenge-151/roger-bell-west/rust/ch-1.rs62
-rwxr-xr-xchallenge-151/roger-bell-west/rust/ch-2.rs38
18 files changed, 943 insertions, 0 deletions
diff --git a/challenge-151/roger-bell-west/javascript/ch-1.js b/challenge-151/roger-bell-west/javascript/ch-1.js
new file mode 100755
index 0000000000..3d8678e3a6
--- /dev/null
+++ b/challenge-151/roger-bell-west/javascript/ch-1.js
@@ -0,0 +1,66 @@
+#! /usr/bin/node
+
+function str2tree (st) {
+ let o=[0];
+ let d=0;
+ let p=0;
+ for (let e of st.match(/\S+/g)) {
+ if (e == "|") {
+ d++;
+ p=0;
+ m=(1<<(d+1))-1;
+ while (o.length < m) {
+ o.push(0);
+ }
+ } else {
+ let y=0;
+ if (e != "*") {
+ y=e;
+ }
+ let i=(1<<d) -1 +p;
+ o[i]=y;
+ p++;
+ }
+ }
+ return o;
+}
+
+function mindepth(tree) {
+ let firstleaf=tree.length;
+ for (let i=0; i < tree.length; i++) {
+ if (tree[i]==0) {
+ continue;
+ } else if ((i+1) << 1 >= tree.length ) {
+ firstleaf=i;
+ break;
+ } else {
+ let ni=((i+1) << 1)-1;
+ if (tree[ni]==0 && tree[ni+1]==0) {
+ firstleaf=i;
+ break;
+ }
+ }
+ }
+ let t=firstleaf+1;
+ let d=0;
+ while (t>0) {
+ t >>= 1;
+ d++;
+ }
+ return d;
+}
+
+if (mindepth(str2tree("1 | 2 3 | 4 5")) == 2) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (mindepth(str2tree("1 | 2 3 | 4 * * 5 | * 6")) == 3) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
+
diff --git a/challenge-151/roger-bell-west/javascript/ch-2.js b/challenge-151/roger-bell-west/javascript/ch-2.js
new file mode 100755
index 0000000000..ebe3509d49
--- /dev/null
+++ b/challenge-151/roger-bell-west/javascript/ch-2.js
@@ -0,0 +1,43 @@
+#! /usr/bin/node
+
+function plan(houses) {
+ let terminal=houses.length-2;
+ let b=[[0]];
+ let reward=0;
+ while (b.length > 0) {
+ let c=b.pop();
+ let c1=c[c.length-1];
+ if (c1 >= terminal) {
+ let r=c.reduce((x,y) => x+houses[y],0);
+ if (r > reward) {
+ reward = r;
+ }
+ } else {
+ for (let n=c1+2; n <= c1+3; n++) {
+ if (n >= houses.length) {
+ break;
+ }
+ let j=[...c];
+ j.push(n);
+ b.push(j);
+ }
+ }
+ }
+ return reward;
+}
+
+
+if (plan([2, 4, 5]) == 7) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (plan([4, 2, 3, 6, 5, 3]) == 13) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
+
diff --git a/challenge-151/roger-bell-west/kotlin/ch-1.kt b/challenge-151/roger-bell-west/kotlin/ch-1.kt
new file mode 100644
index 0000000000..74704a596c
--- /dev/null
+++ b/challenge-151/roger-bell-west/kotlin/ch-1.kt
@@ -0,0 +1,65 @@
+fun str2tree(st: String): ArrayList<Int> {
+ var o=ArrayList<Int>()
+ o.add(0)
+ var d=0
+ var p=0
+ for (e in st.split(" ")) {
+ if (e == "|") {
+ d += 1
+ p = 0
+ val m = (1 shl (d+1)) -1
+ while (o.size < m) {
+ o.add(0)
+ }
+ } else {
+ var y=0
+ if (e != "*") {
+ y = e.toInt()
+ }
+ val i=(1 shl d) -1 +p
+ o[i] = y
+ p += 1
+ }
+ }
+ return o
+}
+
+fun mindepth(tree: ArrayList<Int>): Int {
+ var firstleaf=tree.size
+ for ((i, e) in tree.withIndex()) {
+ if (e == 0) {
+ continue
+ } else if ((i+1) shl 1 >= tree.size) {
+ firstleaf = i
+ break
+ } else {
+ val ni=((i+1) shl 1)-1
+ if (tree[ni]==0 && tree[ni+1] == 0) {
+ firstleaf = i
+ break
+ }
+ }
+ }
+ firstleaf += 1
+ var d=0
+ while (firstleaf > 0) {
+ firstleaf = firstleaf shr 1
+ d += 1
+ }
+ return d
+}
+
+fun main() {
+ if (mindepth(str2tree("1 | 2 3 | 4 5")) == 2) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+ if (mindepth(str2tree("1 | 2 3 | 4 * * 5 | * 6")) == 3) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ println("")
+}
diff --git a/challenge-151/roger-bell-west/kotlin/ch-2.kt b/challenge-151/roger-bell-west/kotlin/ch-2.kt
new file mode 100644
index 0000000000..1ffef678e3
--- /dev/null
+++ b/challenge-151/roger-bell-west/kotlin/ch-2.kt
@@ -0,0 +1,45 @@
+fun plan(houses: List<Int>): Int {
+ val terminal=houses.size-2
+ var b=ArrayList<ArrayList<Int>>();
+ run {
+ var cx=ArrayList<Int>();
+ cx.add(0)
+ b.add(cx)
+ }
+ var reward=0
+ while (b.size > 0) {
+ val c=b.removeLast()
+ val c1=c[c.size-1]
+ if (c1 >= terminal) {
+ val r=c.map {houses[it]}.sum()
+ if (r > reward) {
+ reward=r
+ }
+ } else {
+ for (n in c1+2..c1+3) {
+ if (n >= houses.size) {
+ break
+ }
+ var j=ArrayList(c)
+ j.add(n)
+ b.add(j)
+ }
+ }
+ }
+ return reward
+}
+
+fun main() {
+ if (plan(listOf(2, 4, 5)) == 7) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+ if (plan(listOf(4, 2, 3, 6, 5, 3)) == 13) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ println("")
+}
diff --git a/challenge-151/roger-bell-west/lua/ch-1.lua b/challenge-151/roger-bell-west/lua/ch-1.lua
new file mode 100755
index 0000000000..a24ded8dd9
--- /dev/null
+++ b/challenge-151/roger-bell-west/lua/ch-1.lua
@@ -0,0 +1,63 @@
+#! /usr/bin/lua
+
+function str2tree(st)
+ local o = {}
+ local d = 0
+ local p = 0
+ for e in string.gmatch(st, "[^%s]+") do
+ if e == "|" then
+ d = d + 1
+ p = 0
+ local m = (1 << (d + 1)) - 1
+ while #o < m do
+ table.insert(o,0)
+ end
+ else
+ local y=0
+ if e ~= "*" then
+ y=0+e
+ end
+ local i = (1 << d) + p
+ o[i]=y
+ p = p + 1
+ end
+ end
+ return o
+end
+
+function mindepth(tree)
+ firstleaf=#tree+1
+ for i,e in ipairs(tree) do
+ if e == 0 then
+ elseif i << 1 > #tree then
+ firstleaf=i
+ break
+ else
+ ni=i << 1
+ if tree[ni] == 0 and tree[ni+1]==0 then
+ firstleaf=i
+ break
+ end
+ end
+ end
+ d=0
+ while firstleaf > 0 do
+ firstleaf = firstleaf >> 1
+ d = d + 1
+ end
+ return d
+end
+
+if mindepth(str2tree("1 | 2 3 | 4 5")) == 2 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if mindepth(str2tree("1 | 2 3 | 4 * * 5 | * 6")) == 3 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
diff --git a/challenge-151/roger-bell-west/lua/ch-2.lua b/challenge-151/roger-bell-west/lua/ch-2.lua
new file mode 100755
index 0000000000..bedb953a2e
--- /dev/null
+++ b/challenge-151/roger-bell-west/lua/ch-2.lua
@@ -0,0 +1,47 @@
+#! /usr/bin/lua
+
+function plan(houses)
+ local terminal=#houses-1
+ local b={{1}}
+ local reward=0
+ while #b > 0 do
+ local c=b[#b]
+ b[#b]=nil
+ if c[#c] >= terminal then
+ local r=0
+ for k,v in pairs(c) do
+ r = r + houses[v]
+ end
+ if r > reward then
+ reward=r
+ end
+ else
+ for n = c[#c]+2,c[#c]+3 do
+ if n > #houses then
+ break
+ end
+ local j={}
+ for i,v in ipairs(c) do
+ table.insert(j,v)
+ end
+ table.insert(j,n)
+ table.insert(b,j)
+ end
+ end
+ end
+ return reward
+end
+
+if plan({2, 4, 5}) == 7 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if plan({4, 2, 3, 6, 5, 3}) == 13 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
diff --git a/challenge-151/roger-bell-west/perl/ch-1.pl b/challenge-151/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..b91c521dad
--- /dev/null
+++ b/challenge-151/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,62 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 2;
+
+is(mindepth(str2tree("1 | 2 3 | 4 5")),2,'example 1');
+
+is(mindepth(str2tree("1 | 2 3 | 4 * * 5 | * 6")),3,'example 2');
+
+sub str2tree {
+ my $st=shift;
+ my @o;
+ my $d=0;
+ my $p=0;
+ foreach my $e (split ' ',$st) {
+ if ($e eq '|') {
+ $d++;
+ $p=0;
+ my $m=(1<<($d+1))-1;
+ if (scalar @o < $m) {
+ push @o,(0) x ($m - scalar @o);
+ }
+ } else {
+ my $y=0;
+ if ($e ne '*') {
+ $y=0+$e;
+ }
+ my $i=(1<<$d) -1 +$p;
+ $o[$i]=$y;
+ $p++;
+ }
+ }
+ return \@o;
+}
+
+sub mindepth {
+ my $tree = shift;
+ my $firstleaf=scalar @{$tree};
+ foreach my $i (0..$#{$tree}) {
+ if ($tree->[$i]==0) {
+ next;
+ } elsif (($i+1) << 1 >= scalar @{$tree}) {
+ $firstleaf=$i;
+ last;
+ } else {
+ my $ni=(($i+1) << 1)-1;
+ if ($tree->[$ni]==0 && $tree->[$ni+1]==0) {
+ $firstleaf=$i;
+ last;
+ }
+ }
+ }
+ my $t=$firstleaf+1;
+ my $d=0;
+ while ($t > 0) {
+ $t >>= 1;
+ $d++;
+ }
+ return $d;
+}
diff --git a/challenge-151/roger-bell-west/perl/ch-2.pl b/challenge-151/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..98f69d92f5
--- /dev/null
+++ b/challenge-151/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,33 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 2;
+
+is(planloot([2, 4, 5]),7,'example 1');
+
+is(planloot([4, 2, 3, 6, 5, 3]),13,'example 2');
+
+use List::Util qw(sum max);
+
+sub planloot {
+ my $houses = shift;
+ my $terminal=scalar @{$houses}-2;
+ my @b=([0]);
+ my $reward=0;
+ while (scalar @b > 0) {
+ my $c=pop @b;
+ if ($c->[-1] >= $terminal) {
+ $reward=max($reward,sum(map {$houses->[$_]} @{$c}));
+ } else {
+ foreach my $n ($c->[-1]+2..$c->[-1]+3) {
+ if ($n >= scalar @{$houses}) {
+ last;
+ }
+ push @b,[@{$c},$n];
+ }
+ }
+ }
+ return $reward;
+}
diff --git a/challenge-151/roger-bell-west/postscript/ch-1.ps b/challenge-151/roger-bell-west/postscript/ch-1.ps
new file mode 100644
index 0000000000..85f11a949b
--- /dev/null
+++ b/challenge-151/roger-bell-west/postscript/ch-1.ps
@@ -0,0 +1,90 @@
+%!PS
+
+/apush { % [a b] c -> [a b c]
+ /t exch def
+ [ exch aload pop t ]
+} bind def
+
+/strtok {
+ 1 dict begin
+ /out 0 array def
+ {
+ ( ) search
+ {
+ out exch apush /out exch def
+ pop
+ } {
+ out exch apush /out exch def
+ exit
+ } ifelse
+ } loop
+ out
+ end
+} bind def
+
+/str2tree {
+ 7 dict begin
+ /o [ 0 ] def
+ /d 0 def
+ /p 0 def
+ strtok {
+ dup (|) eq {
+ pop
+ /d d 1 add def
+ /p 0 def
+ /m 1 d 1 add bitshift 1 sub def
+ o length m lt {
+ m o length sub {
+ /o o 0 apush def
+ } repeat
+ } if
+ } {
+ dup (*) eq {
+ pop
+ /y 0 def
+ } {
+ cvi /y exch def
+ } ifelse
+ o 1 d bitshift 1 sub p add y put
+ /p p 1 add def
+ } ifelse
+ } forall
+ o
+ end
+} bind def
+
+/mindepth {
+ 5 dict begin
+ /tree exch def
+ tree length /firstleaf exch def
+ /i 0 def
+ 0 1 tree length 1 sub {
+ 0 ne {
+ i 1 add 1 bitshift tree length ge {
+ /firstleaf i def
+ exit
+ } {
+ /ni i 1 add 1 bitshift 1 sub def
+ tree ni get 0 eq tree ni 1 add get 0 eq and {
+ /firstleaf i def
+ exit
+ } if
+ } ifelse
+ } if
+ /i i 1 add def
+ } for
+ /t firstleaf 1 add def
+ /d 0 def
+ {
+ t 0 le {
+ exit
+ } if
+ /t t -1 bitshift def
+ /d d 1 add def
+ } loop
+ d
+ end
+} bind def
+
+(1 | 2 3 | 4 5) str2tree mindepth 2 eq { (Pass) } { (FAIL) } ifelse print ( ) print
+(1 | 2 3 | 4 * * 5 | * 6) str2tree mindepth 3 eq { (Pass) } { (FAIL) } ifelse =
diff --git a/challenge-151/roger-bell-west/postscript/ch-2.ps b/challenge-151/roger-bell-west/postscript/ch-2.ps
new file mode 100644
index 0000000000..0791d79596
--- /dev/null
+++ b/challenge-151/roger-bell-west/postscript/ch-2.ps
@@ -0,0 +1,52 @@
+%!PS
+
+/apush { % [a b] c -> [a b c]
+ 1 dict begin
+ /t exch def
+ [ exch aload pop t ]
+ end
+} bind def
+
+/apop { % [a b c] -> [a b] c
+ 1 dict begin
+ [ exch aload pop /t exch def ] t
+ end
+} bind def
+
+/plan {
+ 8 dict begin
+ /houses exch def
+ /terminal houses length 2 sub def
+ /b [ [ 0 ] ] def
+ /reward 0 def
+ {
+ b length 0 le {
+ exit
+ } if
+ b apop /c exch def /b exch def
+ /c1 c c length 1 sub get def
+ c1 terminal ge {
+ /r 0 def
+ c {
+ houses exch get r add /r exch def
+ } forall
+ r reward gt {
+ /reward r def
+ } if
+ } {
+ c1 2 add 1 c1 3 add {
+ /n exch def
+ n houses length ge {
+ exit
+ } if
+ b [ c aload pop n ] apush /b exch def
+ } for
+ } ifelse
+ } loop
+ reward
+ end
+} bind def
+
+[ 2 4 5 ] plan 7 eq { (Pass) } { (FAIL) } ifelse print ( ) print
+
+[ 4 2 3 6 5 3 ] plan 13 eq { (Pass) } { (FAIL) } ifelse =
diff --git a/challenge-151/roger-bell-west/python/ch-1.py b/challenge-151/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..34dff6a976
--- /dev/null
+++ b/challenge-151/roger-bell-west/python/ch-1.py
@@ -0,0 +1,54 @@
+#! /usr/bin/python3
+
+import unittest
+
+def str2tree(str):
+ o=[0]
+ d=0
+ p=0
+ for e in str.split():
+ if e == '|':
+ d += 1
+ p=0
+ m=(1<<(d+1))-1
+ while len(o) < m:
+ o.append(0)
+ else:
+ if e == '*':
+ y=0
+ else:
+ y=int(e)
+ i = (1<<d) - 1 + p
+ o[i]=y
+ p += 1
+ return o
+
+def mindepth(tree):
+ firstleaf=len(tree)
+ for i,e in enumerate(tree):
+ if e==0:
+ continue
+ elif (i+1) << 1 >= len(tree):
+ firstleaf=i
+ break
+ else:
+ ni=((i+1) << 1) -1
+ if tree[ni]==0 and tree[ni+1]==0:
+ firstleaf=i
+ break
+ t=firstleaf+1
+ d=0
+ while t > 0:
+ t >>= 1
+ d += 1
+ return d
+
+class TestStr2tree(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(mindepth(str2tree("1 | 2 3 | 4 5")),2,'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(mindepth(str2tree("1 | 2 3 | 4 * * 5 | * 6")),3,'example 2')
+
+unittest.main()
diff --git a/challenge-151/roger-bell-west/python/ch-2.py b/challenge-151/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..dec69ca6af
--- /dev/null
+++ b/challenge-151/roger-bell-west/python/ch-2.py
@@ -0,0 +1,32 @@
+#! /usr/bin/python3
+
+import unittest
+
+def plan(houses):
+ terminal=len(houses)-2
+ b=[[0]]
+ reward=0
+ while len(b) > 0:
+ c=b.pop()
+ if c[-1] >= terminal:
+ r=sum(houses[i] for i in c)
+ if r > reward:
+ reward=r
+ else:
+ for n in range(c[-1]+2,c[-1]+4):
+ if n >= len(houses):
+ break
+ j=c.copy()
+ j.append(n)
+ b.append(j)
+ return reward
+
+class TestPlan(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(plan([2, 4, 5]),7,'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(plan([4, 2, 3, 6, 5, 3]),13,'example 2')
+
+unittest.main()
diff --git a/challenge-151/roger-bell-west/raku/ch-1.p6 b/challenge-151/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..0558352065
--- /dev/null
+++ b/challenge-151/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,58 @@
+#! /usr/bin/perl6
+
+use Test;
+plan 2;
+
+is(mindepth(str2tree("1 | 2 3 | 4 5")),2,'example 1');
+
+is(mindepth(str2tree("1 | 2 3 | 4 * * 5 | * 6")),3,'example 2');
+
+sub str2tree($st) {
+ my @o;
+ my $d=0;
+ my $p=0;
+ for $st.words -> $e {
+ if ($e eq '|') {
+ $d++;
+ $p=0;
+ my $m=(1 +< ($d+1))-1;
+ if (@o.elems < $m) {
+ @o.append(0 x ($m - @o.elems));
+ }
+ } else {
+ my $y=0;
+ if ($e ne '*') {
+ $y=0+$e;
+ }
+ my $i=(1 +< $d) -1 +$p;
+ @o[$i]=$y;
+ $p++;
+ }
+ }
+ return @o;
+}
+
+sub mindepth(@tree) {
+ my $firstleaf=@tree.elems;
+ for @tree.kv -> $i,$e {
+ if ($e==0) {
+ next;
+ } elsif (($i+1) +< 1 >= @tree.elems) {
+ $firstleaf=$i;
+ last;
+ } else {
+ my $ni=(($i+1) +< 1)-1;
+ if (@tree[$ni]==0 && @tree[$ni+1]==0) {
+ $firstleaf=$i;
+ last;
+ }
+ }
+ }
+ my $t=$firstleaf+1;
+ my $d=0;
+ while ($t > 0) {
+ $t +>= 1;
+ $d++;
+ }
+ return $d;
+}
diff --git a/challenge-151/roger-bell-west/raku/ch-2.p6 b/challenge-151/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..59868af6d3
--- /dev/null
+++ b/challenge-151/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,31 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 2;
+
+is(planloot([2, 4, 5]),7,'example 1');
+
+is(planloot([4, 2, 3, 6, 5, 3]),13,'example 2');
+
+sub planloot(@houses) {
+ my $terminal=@houses.elems-2;
+ my @b=[[0]];
+ my $reward=0;
+ while (@b.elems > 0) {
+ my @c=(pop @b).flat;
+ if (@c[*-1] >= $terminal) {
+ $reward=max($reward,sum(map {@houses[$_]}, @c));
+ } else {
+ for @c[*-1]+2..@c[*-1]+3 -> $n {
+ if ($n >= @houses.elems) {
+ last;
+ }
+ my @j=@c.clone;
+ @j.append($n);
+ push @b,@j;
+ }
+ }
+ }
+ return $reward;
+}
diff --git a/challenge-151/roger-bell-west/ruby/ch-1.rb b/challenge-151/roger-bell-west/ruby/ch-1.rb
new file mode 100755
index 0000000000..902dc37fa6
--- /dev/null
+++ b/challenge-151/roger-bell-west/ruby/ch-1.rb
@@ -0,0 +1,65 @@
+#! /usr/bin/ruby
+
+require 'test/unit'
+
+def str2tree(st)
+ o=[]
+ d=0
+ p=0
+ st.split(' ').each do |e|
+ if e == "|" then
+ d += 1
+ p = 0
+ m = (1 << (d+1)) -1
+ while o.length < m do
+ o.push(0)
+ end
+ else
+ y=0
+ if e != "*" then
+ y=e.to_i
+ end
+ i = (1 << d) -1 +p
+ o[i] = y
+ p += 1
+ end
+ end
+ return o
+end
+
+def mindepth(tree)
+ firstleaf=tree.length
+ tree.each_with_index do |e,i|
+ if e==0 then
+ next
+ elsif (i+1) << 1 >= tree.length then
+ firstleaf = i
+ break
+ else
+ ni=((i+1) << 1)-1
+ if tree[ni] == 0 && tree[ni+1] == 0 then
+ firstleaf=i
+ break
+ end
+ end
+ end
+ t=firstleaf+1
+ d=0
+ while t>0 do
+ t >>= 1
+ d += 1
+ end
+ return d
+end
+
+class TestMindepth < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(2,mindepth(str2tree("1 | 2 3 | 4 5")))
+ end
+
+ def test_ex2
+ assert_equal(3,mindepth(str2tree("1 | 2 3 | 4 * * 5 | * 6")))
+ end
+
+end
diff --git a/challenge-151/roger-bell-west/ruby/ch-2.rb b/challenge-151/roger-bell-west/ruby/ch-2.rb
new file mode 100755
index 0000000000..1d98a8824e
--- /dev/null
+++ b/challenge-151/roger-bell-west/ruby/ch-2.rb
@@ -0,0 +1,37 @@
+#! /usr/bin/ruby
+
+require 'test/unit'
+
+def plan(houses)
+ terminal=houses.length-2
+ b=[[0]]
+ reward=0
+ while b.length > 0 do
+ c=b.pop
+ if c[-1] >= terminal then
+ reward=[reward,c.map{|i| houses[i]}.sum].max
+ else
+ (c[-1]+2).upto(c[-1]+3) do |n|
+ if n >= houses.length then
+ break
+ end
+ j=Array.new(c)
+ j.push(n)
+ b.push(j)
+ end
+ end
+ end
+ return reward
+end
+
+class TestPlan < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(7,plan([2, 4, 5]))
+ end
+
+ def test_ex2
+ assert_equal(13,plan([4, 2, 3, 6, 5, 3]))
+ end
+
+end
diff --git a/challenge-151/roger-bell-west/rust/ch-1.rs b/challenge-151/roger-bell-west/rust/ch-1.rs
new file mode 100755
index 0000000000..94afd0ebaf
--- /dev/null
+++ b/challenge-151/roger-bell-west/rust/ch-1.rs
@@ -0,0 +1,62 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit
+
+#[test]
+fn test_ex1() {
+ assert_eq!(mindepth(str2tree("1 | 2 3 | 4 5")), 2);
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(mindepth(str2tree("1 | 2 3 | 4 * * 5 | * 6")), 3);
+}
+
+fn str2tree(st: &str) -> Vec<u32> {
+ let mut o: Vec<u32> = vec![0];
+ let mut d = 0;
+ let mut p = 0;
+ for e in st.split_whitespace() {
+ if e == "|" {
+ d += 1;
+ p = 0;
+ let m = (1 << (d + 1)) - 1;
+ if o.len() < m {
+ o.resize(m, 0);
+ }
+ } else {
+ let mut y = 0;
+ if e != "*" {
+ y = e.parse::<u32>().unwrap();
+ }
+ let i = (1 << d) - 1 + p;
+ o[i] = y;
+ p += 1;
+ }
+ }
+ return o;
+}
+
+fn mindepth(tree: Vec<u32>) -> usize {
+ let mut firstleaf = tree.len();
+ for (i, e) in tree.iter().enumerate() {
+ if *e == 0 {
+ continue;
+ } else if (i + 1) << 1 >= tree.len() {
+ firstleaf = i;
+ break;
+ } else {
+ let ni = ((i + 1) << 1) - 1;
+ if tree[ni] == 0 && tree[ni + 1] == 0 {
+ firstleaf = i;
+ break;
+ }
+ }
+ }
+ firstleaf += 1;
+ let mut d = 0;
+ while firstleaf > 0 {
+ firstleaf >>= 1;
+ d += 1;
+ }
+ return d;
+}
diff --git a/challenge-151/roger-bell-west/rust/ch-2.rs b/challenge-151/roger-bell-west/rust/ch-2.rs
new file mode 100755
index 0000000000..a8319fee65
--- /dev/null
+++ b/challenge-151/roger-bell-west/rust/ch-2.rs
@@ -0,0 +1,38 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit
+
+#[test]
+fn test_ex1() {
+ assert_eq!(plan(vec![2, 4, 5]), 7);
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(plan(vec![4, 2, 3, 6, 5, 3]), 13);
+}
+
+fn plan(houses: Vec<u32>) -> u32 {
+ let terminal = houses.len() - 2;
+ let mut b = vec![vec![0]];
+ let mut reward = 0;
+ while b.len() > 0 {
+ let c = b.pop().unwrap();
+ let c1 = c[c.len() - 1];
+ if c1 >= terminal {
+ let r = c.iter().map(|i| houses[*i]).sum();
+ if r > reward {
+ reward = r;
+ }
+ } else {
+ for n in (c1 + 2)..=(c1 + 3) {
+ if n >= houses.len() {
+ break;
+ }
+ let mut j = c.clone();
+ j.push(n);
+ b.push(j);
+ }
+ }
+ }
+ return reward;
+}