Skip to content

Instantly share code, notes, and snippets.

@QuadFlask
Created April 25, 2016 15:55
Show Gist options
  • Save QuadFlask/e75979f02ff3e537f02093673e8bb143 to your computer and use it in GitHub Desktop.
Save QuadFlask/e75979f02ff3e537f02093673e8bb143 to your computer and use it in GitHub Desktop.
[CodeWars] snail array

달팽이 모양 배열 한줄로 뽑기

http://www.haan.lu/files/2513/8347/2456/snail.png

array = [[1,2,3],
         [8,9,4],
         [7,6,5]]
snail(array) #=> [1,2,3,4,5,6,7,8,9]

MySolution

var snail = function(array) {
	var rotate = function(array) {
		var a = [];
		for (var i=0; i<array.length; i++) 
		for (var j=0; j<array[i].length; j++) {
			var k = array[i].length - 1 - j;
			a[k] = a[k] || [];
			a[k][i] = array[i][j];
		}
		return a;
	};
	
	var r = [];
	while(array.length > 0){
		r = r.concat(array.shift());
		array = rotate(array);
	}
	return r;
};

참고. 배열 회전...을 좀 더 간단하게?

rotateLeft = function(array) {
  var result = [];
  while (array[0].length > 0) {
    result.push(array.map(item=> item.pop()));
  }
  return result;
}

Best Practice

snail = function(array) {
  var res = [];
  while(array.length) {
    res = res.concat(array.shift())
    array = expand(array);
  }
  return res;
}


function expand(matrix){
    return matrix.reduce(function(res, arr, i){
        arr.forEach(function(n, j){
            if (!res[j]) res[j] = [];
            res[j][i] = n;
        })
        return res;
    }, []).reverse();
}
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;
}
@hazardland
Copy link

For fellow viewers ez way:

  1. Pick a frame from array with fors (You ll need them 4 for each side)
  2. Pick a middle array
  3. Call the function for mid array and merge with frame result

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment