Codewars Snail

JavaScript performance comparison

Revision 14 of this test case created by Stef

Preparation code

 
<script>
Benchmark.prototype.setup = function() {
    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 = 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(a) {
      var r = [],
        b = 0,
        e = a.length - 1,
        i;
      while (b < e) {
        for (i = b; i < e; i++) r.push(a[b][i]);
        for (i = b; i < e; i++) r.push(a[i][e]);
        for (i = e; i > b; i--) r.push(a[e][i]);
        for (i = e; i > b; i--) r.push(a[i][b]);
        b++;
        e--;
      }
      if (b == e) r.push(a[b][b]);
      return r;
    }
   
    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 x1 = 0;
      var y1 = 0;
   
      var x2 = _array.length - 1;
      var y2 = 0;
   
      var x3 = _array.length - 1;
      var y3 = _array.length - 1;
   
      var x4 = 0;
      var y4 = _array.length - 1;
   
      if (_array.length == 1) {
        resultArray.push(_array[0]);
      } else {
        while (true) {
          for (var i = x1; i < x2; i++) {
            resultArray.push(_array[y1][i]);
          }
          for (var i = y2; i < y3; i++) {
            resultArray.push(_array[i][x2]);
          }
          for (var i = x3; i > x4; i--) {
            resultArray.push(_array[y3][i]);
          }
          for (var i = y4; i > y1; i--) {
            resultArray.push(_array[i][x4]);
          }
   
          x1++;
          y1++;
   
          if (_array.length % 2 == 0 && y1 == y3) {
            break;
          }
   
          x2--;
          y2++;
          x3--;
          y3--;
          x4++;
          y4--;
   
          if (_array.length % 2 != 0 && y1 == y3) {
            resultArray.push(_array[y1][x1]);
            break;
          }
        }
      }
      return resultArray;
    }
   
    function rotate(a) {
      return Object.keys(a[0]).map(function(c) {
        return a.map(function(r) { return r[c]; });
      }).reverse();
    };
   
    function vas3a(grid) {
      return grid.length > 1 ? grid[0].concat(vas3a( rotate(grid.slice(1)) )) : grid[0];
    };
   
    stef = function(_array) {
      if (_array[0] && _array[0].length <= 1) return _array[0];
      var o = [];
   
      while(_array.length > 0)
      {
        if (_array.length === 1 && _array[0].length === 1){
          o = o.concat(_array[0]);
          break;
        }
        o = o.concat( _array.shift() );
        _array.forEach(function(v){
          o.push( v.pop() );
        });
        o = o.concat(_array.pop().reverse());
        _array.reverse().forEach(function(v){
          o.push( v.shift() );
        });
        _array.reverse();
      }
      return o;
    }
   
   
    madbook= function(array) {
      var res = []
     
      while (array.length) {
        res.push(array.shift())
        array.forEach(function (elem) {
          res.push(elem.pop())
          elem.reverse()
        })
        array.reverse()
      }
     
      return Array.prototype.concat.apply([], res)
    }
};
</script>

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
stevenbarragan
stevenbarragan(x);
pending…
haan
haan(x);
pending…
weizuo
weizuo(x);
pending…
jerryimba
jerryimba(x);
pending…
52liangbo
liangbo(x);
pending…
real_liangbo
real_liangbo(x);
pending…
vas3a
vas3a(x);
pending…
stef
stef(x);
pending…
madbook
madbook(x)
pending…

Compare results of other browsers

Revisions

You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:

0 comments

Add a comment