RosettaCodeData/Task/Spiral-matrix/Maxima/spiral-matrix.maxima
Ingy döt Net 68f8f3e56b all tasks
2013-04-11 01:07:29 -07:00

40 lines
796 B
Text

spiral(n) := block([a, i, j, k, p, di, dj, vi, vj, imin, imax, jmin, jmax],
a: zeromatrix(n, n),
vi: [1, 0, -1, 0],
vj: [0, 1, 0, -1],
imin: 0,
imax: n,
jmin: 1,
jmax: n + 1,
p: 1,
di: vi[p],
dj: vj[p],
i: 1,
j: 1,
for k from 1 thru n*n do (
a[j, i]: k,
i: i + di,
j: j + dj,
if i < imin or i > imax or j < jmin or j > jmax then (
i: i - di,
j: j - dj,
p: mod(p, 4) + 1,
di: vi[p],
dj: vj[p],
i: i + di,
j: j + dj,
if p = 1 then imax: imax - 1
elseif p = 2 then jmax: jmax - 1
elseif p = 3 then imin: imin + 1
else jmin: jmin + 1
)
),
a
)$
spiral(5);
/* matrix([ 1, 2, 3, 4, 5],
[16, 17, 18, 19, 6],
[15, 24, 25, 20, 7],
[14, 23, 22, 21, 8],
[13, 12, 11, 10, 9]) */