RosettaCodeData/Task/Spiral-matrix/Icon/spiral-matrix.icon
2023-07-01 13:44:08 -04:00

28 lines
1.1 KiB
Text

procedure main(A) # spiral matrix
N := 0 < integer(\A[1]|5) # N=1... (dfeault 5)
WriteMatrix(SpiralMatrix(N))
end
procedure WriteMatrix(M) #: write the matrix
every x := M[r := 1 to *M, c := 1 to *M[r]] do
writes(right(\x|"-", 3), if c = *M[r] then "\n" else "")
return
end
procedure SpiralMatrix(N) #: create spiral matrix
every (!(M := list(N))):= list(N) # build empty matrix NxN
# setup before starting first turn
corner := 0 # . corner we're at
i := -1 # . cell contents
r:= 1 ; c :=0 # . row & col
cincr := integer(sin(0)) # . column incr
until i > N^2 do {
rincr := cincr # row incr follows col
cincr := integer(sin(&pi/2*(corner+:=1))) # col incr at each corner
if (run := N-corner/2) = 0 then break # shorten run to 0 at U/R & L/L
every run to 1 by -1 do
M[r +:= rincr,c +:= cincr] := i +:= 1 # move, count, and fill
}
return M
end