Codewars Snail (v8)

Revision 8 of this benchmark created by real_liangbo on


Setup

stevenbarragan = function(array) {
      return array.length == 0 || array.length == 1 ? array : [].concat(
        array.shift(),
        array.map(function(_, i) {
          return array[i].pop();
        }),
        array.pop().reverse(),
        array.map(function(_, i) {
          return array[i].shift();
        }).reverse(),
        stevenbarragan(array)
      );
    }
    
    haan = function(n) {
      var i_snail = function(n, x, y) {
        var result = [];
        for (var i = x; i <= y; i++) {
          result.push(n[x][i]);
        }
        for (var i = x + 1; i <= y; i++) {
          result.push(n[i][y]);
        }
        for (var i = y - 1; i >= x; i--) {
          result.push(n[y][i]);
        }
        for (var i = y - 1; i >= x + 1; i--) {
          result.push(n[i][x]);
        }
        if (x < y) {
          return result.concat(i_snail(n, x + 1, y - 1));
        } else {
          return result;
        }
      }
      return i_snail(n, 0, n[0].length - 1);
    }
    
    weizuo = function(arrayList) {
      var result = [];
      var point = {
        'x': 0,
        'y': 0
      };
      var index = 0;
      var last = arrayList.length * arrayList.length;
      var deep = 0;
      while (last > 0) {
        result.push(arrayList[point.y][point.x]);
        last--;
        var change = turnArray[index](point, arrayList.length, deep);
        if (change) {
          index++;
        }
        if (4 == index) {
          index = 0;
          deep++;
        }
      }
      return result;
    }
    
    function goRight(point, size, deep) {
      point.x++;
      return point.x == size - deep - 1;
    }
    
    function goDown(point, size, deep) {
      point.y++;
    
      return point.y == size - deep - 1;
    }
    
    function goLeft(point, size, deep) {
      point.x--;
      return point.x == deep;
    }
    
    function goUp(point, size, deep) {
      point.y--;
      return point.y == deep + 1;
    }
    
    var turnArray = [goRight, goDown, goLeft, goUp];
    
    jerryimba = function(array) {
      var opt = [];
      for (var i = 0, l = Math.ceil(array.length / 2); i < l; i++) {
        opt = opt.concat(array.shift());
        for (var j = 0; j < array.length - 1; j++) {
          opt.push(array[j].pop());
        }
        array.length > 0 ? opt = opt.concat(array.pop().reverse()) : 0;
        for (var j = array.length - 1; j >= 0; j--) {
          opt.push(array[j].shift());
        }
      }
      return opt;
    }
    
    liangbo = function snail(_array) {
      var resultArray = new Array();
      var index = 0;
    
      function mySnail(_array) {
        // 如果该数组只有一个元素
        if (_array.length == 1) {
          resultArray[index] = _array[0][0];
          index++;
          //console.log(_array[0][0]);
        } else {
          for (var i = 0; i < _array.length; i++) {
            if (i == 0) {
              // 第一行
              for (var j = 0; j < _array[1].length; j++) {
                resultArray[index] = _array[i][j];
                index++;
                //console.log(_array[i][j]);
              }
            } else {
              // 最右列
              resultArray[index] = _array[i][_array[i].length - 1];
              index++;
              //console.log(_array[i][_array[i].length - 1]);
              // 最后一行
              if (i == _array.length - 1) {
                for (var j = _array[_array.length - 1].length - 2; j >= 0; j--) {
                  resultArray[index] = _array[i][j];
                  index++;
                  //console.log(_array[i][j]);
                }
              }
            }
          }
          // 第一列
          for (var i = _array.length - 2; i > 0; i--) {
            resultArray[index] = _array[i][0];
            index++;
            //console.log(_array[i][0]);
          }
    
          // 如果原数组长度大于3
          if (_array.length >= 3) {
            var subArray = new Array(_array.length - 2);
            for (var i = 0; i < subArray.length; i++) {
              subArray[i] = new Array(_array.length - 2);
              for (var j = 0; j < subArray[i].length; j++) {
                subArray[i][j] = _array[i + 1][j + 1];
              }
            }
            mySnail(subArray);
          }
        }
        return resultArray;
      }
      mySnail(_array);
      return resultArray;
    }
    
    real_liangbo = function snail(_array) {
      var resultArray = new Array();
      var m1 = 0;
      var n1 = 0;
      var m2 = 0;
      var n2 = _array.length - 1;
      var m3 = _array.length - 1;
      var n3 = _array.length - 1;
      var m4 = _array.length - 1;
      var n4 = 0;
      while (true) {
        for (var i = n1; i < n2; ++i) {
          resultArray.push(_array[m1][i]);
        }
        for (var i = m2; i < m3; ++i) {
          resultArray.push(_array[i][n2]);
        }
        for (var i = n3; i > n4; --i) {
          resultArray.push(_array[m3][i]);
        }
        for (var i = m4; i > m1; --i) {
          resultArray.push(_array[i][n4]);
        }
        ++m1;
        ++n1;
        if (_array.length % 2 == 0 && m1 == m3) {
          if ((_array.length + 1) % 2 == 0) {
            resultArray
              .push(_array[_array.length / 2 + 1][_array.length / 2 + 1]);
            break;
          }
        }
        ++m2;
        --n2;
        --m3;
        --n3;
        --m4;
        ++n4;
        if (_array.length % 2 != 0 && m1 == m3) {
          resultArray.push(_array[m1][n1]);
          break;
        }
      }
      return resultArray;
    }

Test runner

Ready to run.

Testing in
TestOps/sec
stevenbarragan
var x = [];
for (var i = 0; i < 100; i++) {
  x[i] = [];
  for (var k = 0; k < 100; k++)
    x[i][k] = Math.floor(Math.random() * 10);
}

stevenbarragan(x);
ready
haan
var x = [];
for (var i = 0; i < 100; i++) {
  x[i] = [];
  for (var k = 0; k < 100; k++)
    x[i][k] = Math.floor(Math.random() * 10);
}

haan(x);
ready
weizuo
var x = [];
for (var i = 0; i < 100; i++) {
  x[i] = [];
  for (var k = 0; k < 100; k++)
    x[i][k] = Math.floor(Math.random() * 10);
}

weizuo(x);
ready
jerryimba
var x = [];
for (var i = 0; i < 100; i++) {
  x[i] = [];
  for (var k = 0; k < 100; k++)
    x[i][k] = Math.floor(Math.random() * 10);
}

jerryimba(x);
ready
52liangbo
var x = [];
for (var i = 0; i < 100; i++) {
  x[i] = [];
  for (var k = 0; k < 100; k++)
    x[i][k] = Math.floor(Math.random() * 10);
}

liangbo(x);
ready
real_liangbo
var x = [];
for (var i = 0; i < 100; i++) {
  x[i] = [];
  for (var k = 0; k < 100; k++)
    x[i][k] = Math.floor(Math.random() * 10);
}

real_liangbo(x);
ready
real_liangbo
var x = [];
for (var i = 0; i < 100; i++) {
  x[i] = [];
  for (var k = 0; k < 100; k++)
    x[i][k] = Math.floor(Math.random() * 10);
}

real_liangbo(x);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.