在while循环结构中返回带有圆锥运动的有序元素列表

2024-10-01 05:01:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图解决一个任务,其中有13盏灯,从1开始,每5盏灯关闭一次,当计数达到13时,再次从第一项开始。该函数应返回指示灯关闭的顺序。在这种情况下,对于包含13项的列表,返回列表将是[5, 10, 2, 8, 1, 9, 4, 13, 12, 3, 7, 11, 6]。此外,关闭的灯将不再计算

所以我要解决这个问题的方法是有一个名为turnedon的列表,也就是[1,2,3,4,5,6,7,8,9,10,11,12,13]和一个名为orderoff的空列表,每当turnedon列表中的灯关闭时,就附加到这个列表中。因此,尽管turnedon不是空的,但在turnedon列表中迭代,附加关闭的灯光,并从turnedon列表中删除该turnedoff灯光(如果有意义的话)。但是我不知道while循环应该包含什么。任何想法都将不胜感激

def orderoff():
    n=13
    turnedon=[]
    for n in range(1,n+1):
        turnedon.append(n)
    orderoff=[]

    while turneon !=[]:

Tags: 方法函数列表for顺序def情况意义
3条回答

这是可行的,但结果与您的不同:

>>> pos = 0
>>> result = []
>>> while len(result) < 13 :
...     pos += 5
...     pos %= 13
...     if pos not in result :
...         result.append(pos)
... 
>>> result = [i+1 for i in result]  # make it 1-based, not 0-based
>>> result
[6, 11, 3, 8, 13, 5, 10, 2, 7, 12, 4, 9, 1]
>>>

这个问题相当于众所周知的Josephus problem,其中n囚犯站成一个圆圈,他们按顺序被杀害,每一次,下一个被杀害的人从上一个人绕圆圈走k步;台阶只算在剩下的囚犯身上。Python中的一个示例解决方案可以在Rosetta code website上找到,我在下面稍微调整了一下:

def josephus(n, k):
    p = list(range(1, n+1))
    i = 0
    seq = []
    while p:
        i = (i+k-1) % len(p)
        seq.append(p.pop(i))
    return seq

例如:

>>> josephus(13, 5)
[5, 10, 2, 8, 1, 9, 4, 13, 12, 3, 7, 11, 6]

我认为一个更好的解决方案是使用一个循环,每次增加位移,并使用模块将数字保持在范围内

def orderoff(lights_num,step):
    turnd_off=[]
    num =0
    for i in range(max):
        num =((num+step-1)%lights_num)+1
        turnd_off.append(num)
    return turnd_off

print(orderoff(13))

相关问题 更多 >