Elementary cellular automaton: Difference between revisions

Content added Content deleted
(Added 11l)
(Added solution for Action!)
Line 70: Line 70:
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
</pre>
</pre>

=={{header|Action!}}==
<lang Action!>DEFINE ROW_LEN="320"
DEFINE MAX_COL="319"
DEFINE MAX_ROW="191"

PROC GenerateMask(BYTE rule BYTE ARRAY mask)
BYTE i

FOR i=0 TO 7
DO
mask(i)=rule&1
rule==RSH 1
OD
RETURN

PROC InitRow(BYTE ARRAY row)
INT c
FOR c=0 TO MAX_COL
DO
row(c)=0
OD
row(ROW_LEN RSH 1)=1
RETURN

PROC DrawRow(BYTE ARRAY row BYTE y)
INT c

FOR c=0 TO MAX_COL
DO
Color=row(c)
Plot(c,y)
OD
RETURN

PROC CalcNextRow(BYTE ARRAY currRow,nextRow,mask)
INT c
BYTE v

v=currRow(MAX_COL) LSH 2
v==%currRow(0) LSH 1
v==%currRow(1)
nextRow(0)=mask(v)
FOR c=1 TO MAX_COL-1
DO
v==&3
v==LSH 1
v==%currRow(c+1)
nextRow(c)=mask(v)
OD
v==&3
v==LSH 1
v==%currRow(0)
nextRow(MAX_COL)=mask(v)
RETURN

PROC DrawRule(BYTE rule)
BYTE ARRAY row1(ROW_LEN),row2(ROW_LEN),mask(8)
BYTE ARRAY currRow,nextRow,tmp
BYTE y

GenerateMask(rule,mask)
currRow=row1
nextRow=row2
InitRow(currRow)
y=0
WHILE y<=MAX_ROW
DO
DrawRow(currRow,y)
CalcNextRow(currRow,nextRow,mask)
tmp=currRow currRow=nextRow nextRow=tmp
y==+1
OD
RETURN

PROC Main()
BYTE CH=$02FC,COLOR1=$02C5,COLOR2=$02C6

Graphics(8+16)
Color=1
COLOR1=$0C
COLOR2=$02

DrawRule(30)

DO UNTIL CH#$FF OD
CH=$FF
RETURN</lang>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Elementary_cellular_automaton.png Screenshot from Atari 8-bit computer]


=={{header|Ada}}==
=={{header|Ada}}==