2016-09-11 62 views
-1

爲俄羅斯輪盤賭遊戲建模,其中參賽者站在一個圓圈內。 - 每個第7名選手都輸了,直到2人還活着。從列表中刪除每個第n個元素,直到兩個元素保留在python3中

contestants = list(range(1, 51)) 
dead_men = [] 
dead_man = 6 

while len(contestants) > 2: 
    if dead_man > len(contestants): 
     dead_man = dead_man - len(contestants) 
    loser = contestants.pop(dead_man) 
    dead_men.append(loser) 
    dead_man += 6 

這給了我一個指數誤差的9索引的時候我的名單長度爲8

+0

凡定義的士兵?你是指選手嗎? –

+0

您可能會考慮閱讀有關[約瑟夫問題](https://en.wikipedia.org/wiki/Josephus_problem),直到只有一個人離開 - 使用相同的規則。 – elias

回答

0

我假設你的意思contestants,而不是到處soldiers

如果是這樣,那麼我認爲你只需要:

while dead_man >= len(contestants): 

while而不是if的情況下,你需要減去多次,並且>=而不僅僅是>因爲索引總是需要小於列表的長度)

您也可以使用dead_man %= len(contestants)。這使用模塊算術。

我最喜歡的方式做這樣的事情有模招:

contestants = list(range(1, 51)) 
dead_men = [] 
dead_man = 6 % len(contestants) 

while len(contestants) > 2: 
    loser = contestants.pop(dead_man) 
    dead_men.append(loser) 
    dead_man = (dead_man + 6) % len(contestants) 
+0

這肯定有助於遍歷列表更長。但是現在我得到的索引錯誤爲6,而列表爲4. –

+0

對不起,關於這個,請參閱我的編輯!使用'while'或者只使用模算術。 – smarx

+0

我修正了變量混淆。我正在閱讀一個朋友版本(協作小項目),我混合了他的變量。 –

相關問題