ABC problem: Difference between revisions
Content added Content deleted
(Add Lang example) |
|||
Line 8,905: | Line 8,905: | ||
>>> can_make_word("CONFUSE") |
>>> can_make_word("CONFUSE") |
||
True |
True |
||
</pre> |
|||
=={{header|RPL}}== |
|||
Recursion provides an easy way to solve the task. RPL can manage recursive functions, provided that they don't use local variables. All the data must then be managed in the stack, which makes the code somehow difficult to read: one third of the words used by the program are about stack handling: <code>DUP</code>, <code>DROP(N)</code>, <code>PICK</code>, <code>SWAP</code>, <code>ROLL</code> etc. |
|||
Recursive search is here systematic: the program does check that ABBA can be written with 2 cubes AB and 2 cubes AC, whatever their order. |
|||
{{works with|Halcyon Calc|4.2.7}} |
|||
{| class="wikitable" |
|||
! RPL code |
|||
! Comment |
|||
|- |
|||
| |
|||
≪ SWAP LIST→ → n |
|||
≪ n DUP 2 + ROLL - 1 + ROLL n ROLLD |
|||
n 1 - →LIST SWAP |
|||
≫ ≫ ''''PICKL'''' STO |
|||
≪ 1 1 SUB → cubes letter |
|||
≪ { } 1 cubes SIZE '''FOR''' j |
|||
'''IF''' cubes j GET letter POS |
|||
'''THEN''' j + '''END NEXT''' |
|||
≫ ≫ ''''GetCubeList'''' STO |
|||
≪ |
|||
DUP2 '''GetCubeList''' |
|||
'''IF''' DUP SIZE '''THEN''' |
|||
'''IF''' OVER SIZE 1 == |
|||
'''THEN''' 3 DROPN 1 |
|||
'''ELSE''' |
|||
SWAP 2 OVER SIZE SUB |
|||
0 SWAP ROT DUP SIZE |
|||
'''DO''' |
|||
DUP2 GET |
|||
6 PICK SWAP '''PICKL''' DROP |
|||
4 PICK '''ABC?''' |
|||
5 ROLL OR 4 ROLLD |
|||
1 - |
|||
'''UNTIL''' DUP NOT '''END''' |
|||
3 DROPN SWAP DROP |
|||
'''END''' |
|||
'''ELSE''' 3 DROPN 0 '''END''' |
|||
≫ ''''ABC?'''' STO |
|||
≪ 1 Words SIZE '''FOR''' w |
|||
Words w GET Cubes Words w GET '''ABC?''' |
|||
": true" ": false" IFTE + '''NEXT''' |
|||
≫ ''''TASK'''' STO |
|||
| |
|||
'''PICKL''' ''( { x1..xm..xn } m -- { x1..xn } xm )'' |
|||
put selected item at bottom of stack |
|||
make a new list with the rest of the stack |
|||
'''GetCubeList''' ''( { cubes } "word" -- { match_cubes } )'' |
|||
Scan cubes |
|||
Retain those matching with 1st letter of word |
|||
'''ABC?''' ''( { cubes } "word" -- boolean )'' |
|||
Get the list of cubes matching the 1st letter |
|||
if list not empty |
|||
if word size = 1 letter |
|||
return true |
|||
else |
|||
initialize stack: |
|||
( {cubes} false "ord" { CubeList } index -- ) |
|||
repeat |
|||
get a matching cube index |
|||
remove cube from cube list |
|||
search cubes for "ord" |
|||
update boolean value |
|||
back to previous cube index |
|||
until all matching cubes checked |
|||
clear stack except boolean value |
|||
return false if no matching cube |
|||
|} |
|||
{{in}} |
|||
<pre> |
|||
{ "BO" "XK" "DQ" "CP" "NA" "GT" "RE" "TG" "QD" "FS" "JW" "HU" "VI" "AN" "OB" "ER" "FS" "LY" "PC" "ZM" } 'Cubes' STO |
|||
{ "A" "BARK" "BOOK" "TREAT" "COMMON" "SQUAD" "CONFUSE" } 'Words' STO |
|||
TASK |
|||
{ "AB" "AB" "AC" "AC" } "ABBA" ABC? |
|||
</pre> |
|||
{{out}} |
|||
<pre> |
|||
8: "A: true" |
|||
7: "BARK: true" |
|||
6: "BOOK: false" |
|||
5: TREAT: true" |
|||
4: "COMMON: false" |
|||
3: "SQUAD: true" |
|||
2: "CONFUSE: true" |
|||
1: 1 |
|||
</pre> |
</pre> |
||