Sierpinski curve: Difference between revisions

Content added Content deleted
(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}}==