Sierpinski curve: Difference between revisions
Content added Content deleted
(→{{header|Quackery}}: Added image) |
(Added solution for Action!) |
||
Line 4: | Line 4: | ||
Produce a graphical or ASCII-art representation of a [[wp:Sierpiński_curve|Sierpinski curve]] of at least order 3. |
Produce a graphical or ASCII-art representation of a [[wp:Sierpiński_curve|Sierpinski curve]] of at least order 3. |
||
=={{header|Action!}}== |
|||
Action! language does not support recursion. Therefore an iterative approach with a stack has been proposed. |
|||
<lang Action!>DEFINE C_="10+" |
|||
DEFINE N_="20+" |
|||
DEFINE E_="30+" |
|||
DEFINE S_="40+" |
|||
DEFINE W_="50+" |
|||
DEFINE SafePlot="BYTE inside inside=InsideScreen() IF inside THEN Plot(x,y) FI" |
|||
DEFINE SafeDrawTo="IF inside=1 AND InsideScreen()=1 THEN DrawTo(x,y) FI" |
|||
DEFINE Next="Push(state+1,level)" |
|||
DEFINE DrawN="Push(21,level-1)" |
|||
DEFINE DrawE="Push(31,level-1)" |
|||
DEFINE DrawS="Push(41,level-1)" |
|||
DEFINE DrawW="Push(51,level-1)" |
|||
INT x,y,stackSize |
|||
DEFINE MAX_COUNT="100" |
|||
BYTE ARRAY stack(MAX_COUNT) |
|||
PROC InitStack() |
|||
stackSize=0 |
|||
RETURN |
|||
BYTE FUNC IsEmpty() |
|||
IF stackSize=0 THEN |
|||
RETURN (1) |
|||
FI |
|||
RETURN (0) |
|||
PROC Push(BYTE state,level) |
|||
stack(stackSize)=state stackSize==+1 |
|||
stack(stackSize)=level stackSize==+1 |
|||
RETURN |
|||
PROC Pop(BYTE POINTER state,level) |
|||
stackSize==-1 level^=stack(stackSize) |
|||
stackSize==-1 state^=stack(stackSize) |
|||
RETURN |
|||
BYTE FUNC InsideScreen() |
|||
IF x<0 OR y<0 OR x>319 OR y>191 THEN |
|||
RETURN (0) |
|||
FI |
|||
RETURN (1) |
|||
PROC LineN() |
|||
SafePlot y==-4 SafeDrawTo |
|||
RETURN |
|||
PROC LineNE() |
|||
SafePlot x==+2 y==-2 SafeDrawTo |
|||
RETURN |
|||
PROC LineE() |
|||
SafePlot x==+4 SafeDrawTo |
|||
RETURN |
|||
PROC LineSE() |
|||
SafePlot x==+2 y==+2 SafeDrawTo |
|||
RETURN |
|||
PROC LineS() |
|||
SafePlot y==+4 SafeDrawTo |
|||
RETURN |
|||
PROC LineSW() |
|||
SafePlot x==-2 y==+2 SafeDrawTo |
|||
RETURN |
|||
PROC LineW() |
|||
SafePlot x==-4 SafeDrawTo |
|||
RETURN |
|||
PROC LineNW() |
|||
SafePlot x==-2 y==-2 SafeDrawTo |
|||
RETURN |
|||
PROC SierpinskiCurve(BYTE level) |
|||
BYTE state |
|||
InitStack() |
|||
Push(C_ 1,level+1) |
|||
WHILE IsEmpty()=0 |
|||
DO |
|||
Pop(@state,@level) |
|||
IF state=C_ 1 THEN |
|||
Next DrawN |
|||
ELSEIF state=C_ 2 THEN |
|||
LineNE() Next DrawE |
|||
ELSEIF state=C_ 3 THEN |
|||
LineSE() Next DrawS |
|||
ELSEIF state=C_ 4 THEN |
|||
LineSW() Next DrawW |
|||
ELSEIF state=C_ 5 THEN |
|||
LineNW() |
|||
ELSEIF state=N_ 1 THEN |
|||
IF level=1 THEN |
|||
LineNE() LineN() LineNW() |
|||
ELSE |
|||
Next DrawN |
|||
FI |
|||
ELSEIF state=N_ 2 THEN |
|||
LineNE() Next DrawE |
|||
ELSEIF state=N_ 3 THEN |
|||
LineN() Next DrawW |
|||
ELSEIF state=N_ 4 THEN |
|||
LineNW() |
|||
DrawN |
|||
ELSEIF state=E_ 1 THEN |
|||
IF level=1 THEN |
|||
LineSE() LineE() LineNE() |
|||
ELSE |
|||
Next DrawE |
|||
FI |
|||
ELSEIF state=E_ 2 THEN |
|||
LineSE() Next DrawS |
|||
ELSEIF state=E_ 3 THEN |
|||
LineE() Next DrawN |
|||
ELSEIF state=E_ 4 THEN |
|||
LineNE() DrawE |
|||
ELSEIF state=S_ 1 THEN |
|||
IF level=1 THEN |
|||
LineSW() LineS() LineSE() |
|||
ELSE |
|||
Next DrawS |
|||
FI |
|||
ELSEIF state=S_ 2 THEN |
|||
LineSW() Next DrawW |
|||
ELSEIF state=S_ 3 THEN |
|||
LineS() Next DrawE |
|||
ELSEIF state=S_ 4 THEN |
|||
LineSE() DrawS |
|||
ELSEIF state=W_ 1 THEN |
|||
IF level=1 THEN |
|||
LineNW() LineW() LineSW() |
|||
ELSE |
|||
Next DrawW |
|||
FI |
|||
ELSEIF state=W_ 2 THEN |
|||
LineNW() Next DrawN |
|||
ELSEIF state=W_ 3 THEN |
|||
LineW() Next DrawS |
|||
ELSEIF state=W_ 4 THEN |
|||
LineSW() DrawW |
|||
ELSE |
|||
Break() |
|||
FI |
|||
OD |
|||
RETURN |
|||
PROC Main() |
|||
BYTE CH=$02FC,COLOR1=$02C5,COLOR2=$02C6 |
|||
Graphics(8+16) |
|||
Color=1 |
|||
COLOR1=$0C |
|||
COLOR2=$02 |
|||
x=1 y=187 |
|||
SierpinskiCurve(6) |
|||
DO UNTIL CH#$FF OD |
|||
CH=$FF |
|||
RETURN</lang> |
|||
{{out}} |
|||
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Sierpinski_curve.png Screenshot from Atari 8-bit computer] |
|||
=={{header|AutoHotkey}}== |
=={{header|AutoHotkey}}== |