+--wip: \r
+sign = function(s)\r
+ if s > 0 then\r
+ return 1\r
+ end\r
+ if s < 0 then\r
+ return -1\r
+ end\r
+ return 0\r
+end\r
+\r
+--wip: needs to be faster\r
+function spiral_index(y, x) -- returns the value at (x, y) in a spiral that starts at 1 and goes outwards\r
+ if y == -x and y >= x then\r
+ return (2 * y + 1) ^ 2\r
+ end\r
+ local l = math.max(math.abs(y), math.abs(x))\r
+ local value\r
+ if math.abs(y) == l then\r
+ value = x\r
+ if y < 0 then\r
+ value = -value\r
+ end\r
+ else\r
+ value = y\r
+ if x < 0 then\r
+ value = -value\r
+ end\r
+ end\r
+ t1 = l * 2\r
+ if x + y < 0 then\r
+ t1 = -t1\r
+ end\r
+ t2 = y ^ 2 - x ^ 2\r
+ if t2 < 0 then\r
+ t2 = -t2\r
+ end\r
+ return ((2 * l - 1) ^ 2) + (l * 4) + t1 + (t2 * (l - value))\r
+end\r
+\r
+--wip: needs to be faster\r
+function spiralt(side)\r
+ local spiral = {}\r
+ local start, stop = math.floor((-side+1)/2), math.floor((side-1)/2)\r
+ for i = 1, side do\r
+ spiral[i] = {}\r
+ for j = 1, side do\r
+ spiral[i][j] = side ^ 2 - spiral_index(stop - i + 1,start + j - 1) --moves the coordinates so (0,0) is at the center of the spiral\r
+ end\r
+ end\r
+ return spiral\r
+end\r
+\r