#JavaScript (ES6) 177 <!-- begin snippet: js hide: false --> <!-- language: lang-js --> // Golfed f=(h,w,y,x)=>{ for(g=[],n=0;n<h*w;n)g[[n%w+1,(n/w|0)+1]]=++n; for(o=[g[[x,y]]],l=d=1,e=0;l<n;) g[[x,y]]=0, g[[x+e,y-d]]!=0&&([d,e]=[e,-d]), x+=d,y+=e, (k=g[[x,y]])?o[l++]=k:0 return o } // Not golfed u=(h,w,y,x)=>{ var i,j,dx,dy,kx,ky,o,n, g={} // simulate a 2dimensional array using a hashtable with keys in the form 'x,y' for(n=i=0; i++<h;) // fill grid (probably better done in a single loop) for(j=0; j++<w;) g[[j,i]] = ++n; o=[g[[x,y]]] // starting point in output dx=1, dy=0 // start headed right for(; !o[w*h-1]; ) // loop until all w*h position are put in output { g[[x, y]] = 0 // mark current position to avoid reusing kx=dy, ky=-dx // try turning left if(g[[x+kx, y+ky]] != 0) // check if position marked { // found a valid position dx=kx, dy=ky // change direction } x+=dx, y+=dy // move k=g[[x, y]] // get current value if (k) o.push(k) // put in output list if not 'undefined' (outside grid) } return o } // TEST - In FireFox out=x=>O.innerHTML+=x+'\n'; [ [[5,5,3,3],'13 8 7 12 17 18 19 14 9 4 3 2 1 6 11 16 21 22 23 24 25 20 15 10 5'], [[2,4,1,2],'2 1 5 6 7 3 8 4'] ].forEach(t=>out(t[0] + '\n Result: ' + f(...t[0])+'\n Check: ' + t[1])) test=()=> { var r, i=I.value.match(/\d+/g), h=i[0]|0, w=i[1]|0, y=i[2]|0, x=i[3]|0 if (y>h||x>w) r = 'Invalid input' else r = f(h,w,y,x) out(i+'\n Reault: ' +r) } <!-- language: lang-html --> <pre id=O></pre> Your test:<input id=I><button onclick="test()">-></button> <!-- end snippet -->