【发布时间】:2014-04-10 11:36:51
【问题描述】:
我有一个函数可以基本上右对齐列表,但也将两个相等的元素合并为一个(列表总是至少有一个元素):
def shift(sequence):
for i in range(len(sequence)-1):
current_value = sequence[i]
next_value = sequence[i+1]
if next_value == 0:
sequence[i], sequence[i+1] = 0, current_value
elif current_value == next_value:
sequence[i], sequence[i+1] = 0, current_value*2
return sequence
这是一些输入和输出示例:
>>> shift([0, 0, 1, 0])
[0, 0, 0, 1]
>>> shift([1, 1, 0, 0])
[0, 0, 0, 2]
>>> shift([2, 0, 1, 0])
[0, 0, 2, 1]
最有效的方法是什么?如果对矩阵中的每一行都这样做,有没有比这样做更有效的方法:
matrix = [shift(row) for row in matrix]
另外,如果我要在其他三个方向(除了右边)移动矩阵,有没有比这三个更有效的方法:
#Left
matrix = [shift(row[::-1])[::-1] for row in matrix]
#Down
matrix = map(list, zip(*[shift(row) for row in map(list, zip(*matrix))]))
#Up
matrix = map(list, zip(*[shift(row[::-1])[::-1] for row in map(list, zip(*matrix))]))
如果重复执行这些移位操作(以及每次更改矩阵中的一个值),我应该跟踪什么以提高效率吗?
编辑
我的功能并不总是有效:
>>> shift([1, 1, 1, 1])
[0, 2, 0, 2]
输出应该是:
[0, 0, 2, 2]
更多预期的输入和输出:
[1, 1, 1] --> [0, 1, 2]
[1, 2, 2, 3, 5, 5, 2] --> [0, 0, 1, 4, 3, 10, 2]
编辑 2
不一定要向右移动,也可以是相反的方向。
【问题讨论】:
-
这像1024游戏吗?
-
@Cyber 我没听说过,所以没有。
-
合并递归吗?或者换句话说,
[1,1,1,1]的结果是什么? -
@NiklasB。
[1, 1, 1, 1] --> [0, 0, 2, 2]。实际上这意味着我的功能不适用于那个...... -
你应该提到2048,因为这样每个了解游戏的人都可以更容易理解这个问题。此外,您的方法似乎已经渐近最优
标签: python algorithm optimization python-3.x