撲克牌原始順序問題
已知有 A-K 的十三張撲克牌,順序未知,進行如下操作:
1)從牌堆底拿一張牌翻開放在桌子上; 3)重復1、2的操作,直到十三張牌全部翻出為止。
如果要求翻開的牌是從 A-K 順序的,求開始牌堆的順序。
比如:原始序列為 2 3 1,經過上述操作后變為 1 2 3。
假設已知原始序列 2 3 1,操作過程為:
- 堆底拿一張翻開:(開)1,(堆)2 3- 堆底拿一張放在堆頂:(開)1,(堆)3 2- 堆底拿一張翻開:(開)1 2,(堆)3- 堆底拿一張放在堆頂:(開)1 2,(堆)3- 堆底拿一張翻開:(開)1 2 3,(堆)空 而現在需要從已知的最終順序 1 2 3 反推原始序列 2 3 1,可以直接做和上面相反的操作:
- 從翻開的牌面末尾拿一張放回堆底:(堆)3,(開)1 2- 堆頂拿一張放回堆底:(堆)3,(開)1 2- 從翻開的牌面末尾拿一張放回堆底:(堆)3 2,(開)1- 堆頂拿一張放回堆底:(堆)2 3,(開)1- 從翻開的牌面末尾拿一張放回堆底:(堆)2 3 1 在本題里,要求目標序列為
['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
,求原本的撲克牌順序,操作也是一樣的,每次從目標序列末尾取一個放回堆,然后將堆頂移到堆底即可。
def func(arr):
n = len(arr)
res= []
for i in range(n):
res.append(arr[n-1]) # 放回堆
n -= 1
top = res[0]
del res[0] # 刪除堆頂
res.append(top) # 堆頂添加到堆底
return res
if __name__ == '__main__':
n = 5
arr = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
print(func(arr))