Nonoblock: Difference between revisions
Content added Content deleted
(Added solution for Action!) |
|||
Line 153: | Line 153: | ||
|_|_|A|A|_|B|B|B|_|C|C|_|D|D|D| |
|_|_|A|A|_|B|B|B|_|C|C|_|D|D|D| |
||
A total of 15 Possible configurations. |
A total of 15 Possible configurations. |
||
</pre> |
|||
=={{header|Action!}}== |
|||
<lang Action!>DEFINE MAX_BLOCKS="10" |
|||
DEFINE NOT_FOUND="255" |
|||
BYTE FUNC GetBlockAtPos(BYTE p BYTE ARRAY blocks,pos INT count) |
|||
INT i |
|||
FOR i=0 TO count-1 |
|||
DO |
|||
IF p>=pos(i) AND p<pos(i)+blocks(i) THEN |
|||
RETURN (i) |
|||
FI |
|||
OD |
|||
RETURN (NOT_FOUND) |
|||
PROC PrintResult(BYTE cells BYTE ARRAY blocks,pos INT count) |
|||
BYTE i,b |
|||
Print("[") |
|||
FOR i=0 TO cells-1 |
|||
DO |
|||
b=GetBlockAtPos(i,blocks,pos,count) |
|||
IF b=NOT_FOUND THEN |
|||
Put('.) |
|||
ELSE |
|||
Put(b+'A) |
|||
FI |
|||
OD |
|||
PrintE("]") |
|||
RETURN |
|||
BYTE FUNC LeftMostPos(BYTE cells BYTE ARRAY blocks,pos INT count,startFrom) |
|||
INT i |
|||
FOR i=startFrom TO count-1 |
|||
DO |
|||
pos(i)=pos(i-1)+blocks(i-1)+1 |
|||
IF pos(i)+blocks(i)>cells THEN |
|||
RETURN (0) |
|||
FI |
|||
OD |
|||
RETURN (1) |
|||
BYTE FUNC MoveToRight(BYTE cells BYTE ARRAY blocks,pos INT count,startFrom) |
|||
pos(startFrom)==+1 |
|||
IF pos(startFrom)+blocks(startFrom)>cells THEN |
|||
RETURN (0) |
|||
FI |
|||
RETURN (LeftMostPos(cells,blocks,pos,count,startFrom+1)) |
|||
PROC Process(BYTE cells BYTE ARRAY blocks INT count) |
|||
BYTE ARRAY pos(MAX_BLOCKS) |
|||
BYTE success |
|||
INT current |
|||
IF count=0 THEN |
|||
PrintResult(cells,blocks,pos,count) |
|||
RETURN |
|||
FI |
|||
pos(0)=0 |
|||
success=LeftMostPos(cells,blocks,pos,count,1) |
|||
IF success=0 THEN |
|||
PrintE("No solutions") |
|||
RETURN |
|||
FI |
|||
current=count-1 |
|||
WHILE success |
|||
DO |
|||
PrintResult(cells,blocks,pos,count) |
|||
DO |
|||
success=MoveToRight(cells,blocks,pos,count,current) |
|||
IF success THEN |
|||
current=count-1 |
|||
ELSE |
|||
current==-1 |
|||
IF current<0 THEN |
|||
EXIT |
|||
FI |
|||
FI |
|||
UNTIL success |
|||
OD |
|||
OD |
|||
RETURN |
|||
PROC Test(BYTE cells BYTE ARRAY blocks INT count) |
|||
BYTE CH=$02FC ;Internal hardware value for last key pressed |
|||
INT i |
|||
PrintB(cells) Print(" cells [") |
|||
FOR i=0 TO count-1 |
|||
DO |
|||
PrintB(blocks(i)) |
|||
IF i<count-1 THEN |
|||
Put(32) |
|||
FI |
|||
OD |
|||
PrintE("]") |
|||
Process(cells,blocks,count) |
|||
PutE() |
|||
PrintE("Press any key to continue...") |
|||
DO UNTIL CH#$FF OD |
|||
CH=$FF |
|||
PutE() |
|||
RETURN |
|||
PROC Main() |
|||
BYTE ARRAY t1=[2 1],t2=[],t3=[8],t4=[2 3 2 3],t5=[2 3] |
|||
Test(5,t1,2) |
|||
Test(5,t2,0) |
|||
Test(10,t3,1) |
|||
Test(15,t4,4) |
|||
Test(5,t5,2) |
|||
RETURN</lang> |
|||
{{out}} |
|||
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Nonoblock.png Screenshot from Atari 8-bit computer] |
|||
<pre> |
|||
5 cells [2 1] |
|||
[AA.B.] |
|||
[AA..B] |
|||
[.AA.B] |
|||
Press any key to continue... |
|||
5 cells [] |
|||
[.....] |
|||
Press any key to continue... |
|||
10 cells [8] |
|||
[AAAAAAAA..] |
|||
[.AAAAAAAA.] |
|||
[..AAAAAAAA] |
|||
Press any key to continue... |
|||
15 cells [2 3 2 3] |
|||
[AA.BBB.CC.DDD..] |
|||
[AA.BBB.CC..DDD.] |
|||
[AA.BBB.CC...DDD] |
|||
[AA.BBB..CC.DDD.] |
|||
[AA.BBB..CC..DDD] |
|||
[AA.BBB...CC.DDD] |
|||
[AA..BBB.CC.DDD.] |
|||
[AA..BBB.CC..DDD] |
|||
[AA..BBB..CC.DDD] |
|||
[AA...BBB.CC.DDD] |
|||
[.AA.BBB.CC.DDD.] |
|||
[.AA.BBB.CC..DDD] |
|||
[.AA.BBB..CC.DDD] |
|||
[.AA..BBB.CC.DDD] |
|||
[..AA.BBB.CC.DDD] |
|||
Press any key to continue... |
|||
5 cells [2 3] |
|||
No solutions |
|||
Press any key to continue... |
|||
</pre> |
</pre> |
||