2016-09-11 1 views
-1

modellieren ein Spiel der russischen Roulette, wo die Kandidaten in einem Kreis stehen. -sehr 7. Kandidat verliert, bis 2 am Leben sind.Entfernen jedes nth Element aus einer Liste, bis zwei Elemente in python3 bleiben

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 

Das gibt mir einen Index Fehler mit einem Index von 9, wenn meine Listenlänge ist 8

+0

Wo ist Soldat definiert? Meinst du Kandidaten? –

+0

Sie könnten über das verwandte [Josephus-Problem] (https://en.wikipedia.org/wiki/Josephus_problem) nachlesen, was so lange dauert, bis nur noch ein Mann übrig ist - mit den gleichen Regeln, die Sie hatten. – elias

Antwort

0

Ich nehme an, Sie contestants statt soldiers überall gemeint?

Wenn ja, dann denke ich, brauchen Sie nur:

while dead_man >= len(contestants): 

(while statt if falls Sie mehrere Male subtrahieren müssen, und >= anstatt nur > da Indizes immer weniger sein müssen als die Länge der Liste)

Sie könnten auch dead_man %= len(contestants) verwenden. Dies verwendet Modularithmetik.

Mein Liebling Weg, um diese Art der Sache mit dem Modulo-Trick zu tun:

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

Das hat sicherlich dazu beigetragen, die Liste noch länger zu durchlaufen. Aber jetzt bekomme ich den Indexfehler bei 6, während die Liste 4 ist. –

+0

Tut mir leid, sehe meine Änderungen! Verwenden Sie 'while' oder verwenden Sie einfach die Modulo-Arithmetik. – smarx

+0

Ich habe die Variable verwechselt. Ich las eine Freunde-Version (kollaboratives kleines Projekt) und ich mischte seine Variablen ein. –

Verwandte Themen