main(){ List a = [ 0,2,0,2, 0,0,4,4, 2,0,4,0, 2,4,0,2 ]; List temp = right(a); //change to others later, List result = [[],[],[],[]]; for(int i=0; i<16; i++){ result[i%4].add(temp[i]); } for(int i=0; i<result.length; i++){ print(result[i]); } } right(List x){ x = x.reversed.toList(); x = left(x); x = x.reversed.toList(); List temp = [[],[],[],[]]; for(int i=0; i<x.length; i++){ temp[i%4].add(x[i]); } return x; } left(List x){ List temp = [[],[],[],[]]; for(int i=0; i<16; i++){ temp[i~/4].add(x[i]); } x = []; for(int i=0; i<temp.length; i++){ x.addAll(merge(temp[i])); } temp = [[],[],[],[]]; for(int i=0; i<16; i++){ temp[i%4].add(x[i]); } x = []; for(int i=0; i<temp.length; i++){ x.addAll(temp[i]); } return x; } up(List x){ List temp = [[],[],[],[]]; for(int i=0; i<16; i++){ temp[i%4].add(x[i]); } x = []; for(int i=0; i<temp.length; i++){ x.addAll(merge(temp[i])); } return x; } down(List x){ x = x.reversed.toList(); x = up(x); return x.reversed.toList(); } merge(List arr){ var i, nextI, len, m; len = arr.length; for(i=0; i<len; i++){ nextI = -1; for(m=i+1; m<len; m++){ if(arr[m]!=0){ nextI = m; break; } } if(nextI!=-1){ if(arr[i]==0){ arr[i] = arr[nextI]; arr[nextI] = 0; i -= 1; }else if(arr[i]==arr[nextI]){ arr[i] = arr[i] * 2; arr[nextI] = 0; } } } return arr; }