diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2022-02-07 17:54:08 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-07 17:54:08 +0000 |
| commit | 3a155754f659bc83e1b8e907e70b210b087e4632 (patch) | |
| tree | d8fb8f029d0b428a15b4537f2fff1e6c334e3a00 | |
| parent | d4fec6b7157921fd3a1f1178f0899696c4d405d5 (diff) | |
| parent | 0d6a1d8434aeac8a9dec8008652455ece54c3206 (diff) | |
| download | perlweeklychallenge-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
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; +} |
