我被赋予了创建代码的任务.任务如下:
你是一艘帆船的船长,你和你的船员被海盗俘虏了.海盗船长让你们所有人在他的船甲板上站成一圈,试图决定你应该走哪条木板.最终他决定采用以下方法:
(a)海盗船长要你挑一个号码N.
(b)第一个走板的人是第N人(从你开始).
(c)然后船长将继续围绕圆圈,迫使每个第N个人走板.
(d)一旦只剩下一人,该人将获得自由.
例如:剧组包括:Andrew,Brenda,Craig,Deidre,Edward,Felicity,Greg和Harriet.安德鲁选择N = 2.船员将按顺序走板:Brenda,Deidre,Felicity,Harriet,Craig,Greg,Edward.安德鲁将获得自由.
我到目前为止的代码是:
def survivor(names, step):
names = ["Andrew", "Brenda", "Craig", "Deidre", "Edward", "Felicity", "Greg", "Harriet"]
Next = step - 1
names.pop(Next)
print names
Run Code Online (Sandbox Code Playgroud)
这将从列表中删除第一个第n个人,但我不知道如何循环列表以继续删除第n个人.
我需要它,所以让我们假设步骤= 3,然后我需要它去除克雷格然后从克雷格开始计算并删除下一个第三个元素,这是幸福等等,直到有一个人离开.
我怎样才能做到这一点?
这似乎有效:
from collections import deque
def survivor(names, step):
circle = deque(names)
while len(circle) > 1:
circle.rotate(1-step)
print circle.popleft()
return circle[0]
Run Code Online (Sandbox Code Playgroud)
它打印了海盗受害者的名字并返回幸存者的名字:
In [17]: crew = ["Andrew", "Brenda", "Craig", "Deidre",
....: "Edward", "Felicity", "Greg", "Harriet"]
In [18]: survivor(crew, 2)
Brenda
Deidre
Felicity
Harriet
Craig
Greg
Edward
Out[18]: 'Andrew'
In [19]: survivor(crew, 3)
Craig
Felicity
Andrew
Edward
Brenda
Harriet
Deidre
Out[19]: 'Greg'
Run Code Online (Sandbox Code Playgroud)