Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Speedy category for Behind 2048 by yarmak_vladislav
# migrated from python 2.7
from itertools import groupby, chain
LOSE = [['G', 'A', 'M', 'E'], ['O', 'V', 'E', 'R'], ['G', 'A', 'M', 'E'], ['O', 'V', 'E', 'R']]
WIN = [['U', 'W', 'I', 'N'], ['U', 'W', 'I', 'N'], ['U', 'W', 'I', 'N'], ['U', 'W', 'I', 'N']]
def collide_row(row):
tiles = []
for k,g in groupby(list(filter(bool,row))):
l = len(list(g))
if l % 2:
tiles.append(k)
tiles.extend([k*2]*(l/2))
return [0]*(len(row)-len(tiles))+tiles
def put_last_tile(S):
l = len(S)-1
for i in range(l, -1, -1):
for j in range(l, -1, -1):
if S[i][j] == 0:
S[i][j] = 2
return True
return False
def move2048(state, move):
if move == "right":
new_state = [ collide_row(row) for row in state ]
if move == "left":
new_state = [ collide_row(row[::-1])[::-1] for row in state ]
if move == "down":
new_state = list(map(list,list(zip(*[ collide_row(column) for column in zip(*state) ]))))
if move == "up":
new_state = list(map(list,list(zip(*[ collide_row(column[::-1])[::-1] for column in zip(*state) ]))))
if 2048 in chain.from_iterable(new_state):
return WIN
if put_last_tile(new_state):
return new_state
else:
return LOSE
if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
assert move2048([[0, 2, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 2, 0, 0]], 'up') == [[0, 4, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 2]], "Start. Move Up!"
assert move2048([[4, 0, 0, 0],
[0, 4, 0, 0],
[0, 0, 0, 0],
[0, 0, 8, 8]], 'right') == [[0, 0, 0, 4],
[0, 0, 0, 4],
[0, 0, 0, 0],
[0, 0, 2, 16]], "Simple right"
assert move2048([[2, 0, 2, 2],
[0, 4, 4, 4],
[8, 8, 8, 16],
[0, 0, 0, 0]], 'right') == [[0, 0, 2, 4],
[0, 0, 4, 8],
[0, 8, 16, 16],
[0, 0, 0, 2]], "Three merging"
assert move2048([[256, 0, 256, 4],
[16, 8, 8, 0],
[32, 32, 32, 32],
[4, 4, 2, 2]], 'right') == [[0, 0, 512, 4],
[0, 0, 16, 16],
[0, 0, 64, 64],
[0, 2, 8, 4]], "All right"
assert move2048([[4, 4, 0, 0],
[0, 4, 1024, 0],
[0, 256, 0, 256],
[0, 1024, 1024, 8]], 'down') == [['U', 'W', 'I', 'N'],
['U', 'W', 'I', 'N'],
['U', 'W', 'I', 'N'],
['U', 'W', 'I', 'N']], "We are the champions!"
assert move2048([[2, 4, 8, 16],
[32, 64, 128, 256],
[512, 1024, 2, 4],
[8, 16, 32, 64]], 'left') == [['G', 'A', 'M', 'E'],
['O', 'V', 'E', 'R'],
['G', 'A', 'M', 'E'],
['O', 'V', 'E', 'R']], "Nobody moves!"
June 21, 2014