Skip to content

Instantly share code, notes, and snippets.

@martin-mok
Last active June 16, 2020 14:42
Show Gist options
  • Select an option

  • Save martin-mok/76fbab6cbcaaadd55add00a843420806 to your computer and use it in GitHub Desktop.

Select an option

Save martin-mok/76fbab6cbcaaadd55add00a843420806 to your computer and use it in GitHub Desktop.
Snail Sort from codewars

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;
}

La blatte's Soln

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];

Solution in Python

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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment