I made a 133 bytes Snail function such as :
snail(4) =
[[1, 2, 3, 4],
12, 13, 14, 5],
11, 16, 15, 6],
10, 9, 8, 7]]
(and the same logic for snail(N), with N >= 0)
| s = function(n,a,d,x,y,c,i){ | |
| // a is the result matrix | |
| a = [[]]; | |
| // d is the direction: right, bottom = 1; left, top = -1 | |
| d = 1; | |
| // c is the counter value. | |
| c = 0; | |
| // x and y are the coordinates of the number in the matrix | |
| x = 0; | |
| y = -1; | |
| // for n in [n ... 0] | |
| for(; n; n--){ | |
| // NB: the following two for loops are merged in the minified code | |
| // fill n columns | |
| for(i = 0; i < n; i++){ | |
| y += d; | |
| a[x][y] = ++c; | |
| } | |
| // fill n-1 lines | |
| for(i = 0; i < n - 1; i++){ | |
| x += d; | |
| if(!a[x]){ | |
| a[x] = []; | |
| } | |
| a[x][y] = ++c; | |
| } | |
| // change direction | |
| d = -d; | |
| } | |
| return a; | |
| } | |
| s=function(e,c,d,b,f,h,g){c=[[]];d=1;b=h=0;for(f=-1;e;e--){for(g=1;g<2*e;g++)g>e?b+=d:f+=d,c[b]||(c[b]=[]),c[b][f]=++h;d=-d}return c} |
| DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
| Version 2, December 2004 | |
| Copyright (C) 2011 YOUR_NAME_HERE <YOUR_URL_HERE> | |
| Everyone is permitted to copy and distribute verbatim or modified | |
| copies of this license document, and changing it is allowed as long | |
| as the name is changed. | |
| DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
| TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |
| 0. You just DO WHAT THE FUCK YOU WANT TO. |
| { | |
| "name": "snail", | |
| "description": "generates a snail matrix", | |
| "keywords": [ | |
| "snail", | |
| "matrix" | |
| ] | |
| } |
| <script> | |
| s=function(e,c,d,b,f,h,g){c=[[]];d=1;b=h=0;for(f=-1;e;e--){for(g=1;g<2*e;g++)g>e?b+=d:f+=d,c[b]||(c[b]=[]),c[b][f]=++h;d=-d}return c} | |
| console.log(s(4)); | |
| </script> |
That unfortunately breaks it :/
This one saves 2 bytes by removing brackets (moving d=-d to the last part of the for loop) and moving b=h=0 inside the array definition:
function(e,c,d,b,f,h,g){c=[[b=h=0]];d=1;for(f=-1;e;e--,d=-d)for(g=1;g<2*e;g++)g>e?b+=d:f+=d,c[b]||(c[b]=[]),c[b][f]=++h;return c}
Saving another 2 bytes by changing the check/assignment of c[b]:
function(e,c,d,b,f,h,g){c=[[b=h=0]];d=1;for(f=-1;e;e--,d=-d)for(g=1;g<2*e;g++)g>e?b+=d:f+=d,c[b]=c[b]||[],c[b][f]=++h;return c}
And one more byte (!) by moving to a var-definition instead of placeholder arguments:
function(e){var c=[[]],d=1,b=0,h=0,f,g;for(f=-1;e;e--,d=-d)for(g=1;g<2*e;g++)g>e?b+=d:f+=d,c[b]=c[b]||[],c[b][f]=++h;return c}
-6 bytes:
function(e){for(var c=[[]],d=1,b=0,h=0,f=-1,g;e;e--,d=-d)for(g=1;g<2*e;c[b][f]=++h)g++>e?c[b+=d]=c[b]||[]:f+=d;return c}I want to ask also, is it necessary c to be [[]], not just [].
The only difference is snail(0) would return [] instead of [[]], but as for me, it is even better.
Save one byte by removing the curly brackets: