My soln:
snail = function(array) {
if(array.length===0) return [];
let rowMin=0;
let rowMax=array.length-1;
let colMin=0;
let colMax=array[0].length?array[0].length-1:0;
let snailArr=[];
while(rowMax>=rowMin ||colMax>=colMin ){
snailArr.push(...array[rowMin].slice(colMin,colMax+1));
++rowMin;
for(let i=rowMin;i<=rowMax;++i){
snailArr.push(array[i][colMax]);
}
--colMax;
snailArr.push(...array[rowMax].slice(colMin,colMax+1).reverse());
--rowMax;
for(let i=rowMax;i>=rowMin;--i){
snailArr.push(array[i][colMin]);
}
++colMin;
}
return snailArr;
}snail = arr =>
arr.length > 1
? [
...arr.shift(),
...arr.map(e => e.pop()),
...arr.pop().reverse(),
...arr.reverse().map(e => e.shift())
].concat(arr.length ? snail(arr.reverse()) : [])
: arr[0];def snail(arr):
return arr[0] if len(arr) == 1 else [*arr.pop(0), *[elem.pop() for elem in arr], *arr.pop()[::-1], *[elem.pop(0) for elem in arr[::-1]]] + snail(arr) if len(arr) else []Best practice~Spencer Whitehead Soln:
snail = function(array) {
var result;
while (array.length) {
// Steal the first row.
result = (result ? result.concat(array.shift()) : array.shift());
// Steal the right items.
for (var i = 0; i < array.length; i++)
result.push(array[i].pop());
// Steal the bottom row.
result = result.concat((array.pop() || []).reverse());
// Steal the left items.
for (var i = array.length - 1; i >= 0; i--)
result.push(array[i].shift());
}
return result;
}A Clever Soln:
function snail(array) {
var vector = [];
while (array.length) {
vector.push(...array.shift());
array.map(row => vector.push(row.pop()));
array.reverse().map(row => row.reverse());
}
return vector;
}