diff --git a/extra/project-euler/215/215-tests.factor b/extra/project-euler/215/215-tests.factor index ddd87cc2ff..9d265b70d2 100644 --- a/extra/project-euler/215/215-tests.factor +++ b/extra/project-euler/215/215-tests.factor @@ -1,4 +1,4 @@ -USING: project-euler.215 tools.test ; +USING: project-euler.215 project-euler.215.private tools.test ; IN: project-euler.215.tests [ 8 ] [ 9 3 solve ] unit-test diff --git a/extra/project-euler/215/215.factor b/extra/project-euler/215/215.factor index 056de72e50..fc09b37515 100644 --- a/extra/project-euler/215/215.factor +++ b/extra/project-euler/215/215.factor @@ -1,6 +1,33 @@ +! Copyright (c) 2008 Eric Mertens. +! See http://factorcode.org/license.txt for BSD license. USING: accessors kernel locals math ; IN: project-euler.215 +! http://projecteuler.net/index.php?section=problems&id=215 + +! DESCRIPTION +! ----------- + +! Consider the problem of building a wall out of 2x1 and 3x1 bricks +! (horizontalvertical dimensions) such that, for extra strength, the gaps +! between horizontally-adjacent bricks never line up in consecutive layers, +! i.e. never form a "running crack". + +! For example, the following 93 wall is not acceptable due to the running crack +! shown in red: + +! See problem site for image... + +! There are eight ways of forming a crack-free 9x3 wall, written W(9,3) = 8. + +! Calculate W(32,10). + + +! SOLUTION +! -------- + + end : failure? ( t -- ? ) ways>> 0 = ; inline -: choice ( t p q -- t t ) [ [ two>> ] [ three>> ] bi ] 2dip bi* ; inline +: choice ( t p q -- t t ) + [ [ two>> ] [ three>> ] bi ] 2dip bi* ; inline GENERIC: merge ( t t -- t ) GENERIC# block-merge 1 ( t t -- t ) @@ -43,14 +71,22 @@ M: end h2 dup failure? [ ] unless ; : next-row ( t -- t ) [ h-1 ] [ h1 ] choice swap ; : first-row ( n -- t ) - [ ] dip - 1- [| a b c | b c a b ] times 2drop ; + [ ] dip + 1- [| a b c | b c a b ] times 2drop ; GENERIC: total ( t -- n ) M: block total [ total ] dup choice + ; M: end total ways>> ; : solve ( width height -- ways ) - [ first-row ] dip 1- [ next-row ] times total ; + [ first-row ] dip 1- [ next-row ] times total ; -: euler215 ( -- ways ) 32 10 solve ; +PRIVATE> + +: euler215 ( -- answer ) + 32 10 solve ; + +! [ euler215 ] 100 ave-time +! 208 ms ave run time - 9.06 SD (100 trials) + +MAIN: euler215 diff --git a/extra/project-euler/project-euler.factor b/extra/project-euler/project-euler.factor index 036167865f..9549505bf6 100644 --- a/extra/project-euler/project-euler.factor +++ b/extra/project-euler/project-euler.factor @@ -20,7 +20,7 @@ USING: definitions io io.files kernel math math.parser project-euler.097 project-euler.100 project-euler.116 project-euler.117 project-euler.134 project-euler.148 project-euler.150 project-euler.151 project-euler.164 project-euler.169 project-euler.173 project-euler.175 - project-euler.186 project-euler.190 ; + project-euler.186 project-euler.190 project-euler.215 ; IN: project-euler