Возвращение списка упорядоченных элементов с условием в структуре цикла while

Я пытаюсь выполнить задание, где 13 источников света, и начиная с 1, свет выключается при каждом 5-м свете, когда счет достигает 13, снова начинайте с 1-го пункта. Функция должна возвращать порядок выключенных источников света. В этом случае для списка из 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] и пустой list, называемый orderoff и добавлять к нему каждый раз, когда в списке turnedon . Таким образом, пока turnedon не пуст, выполните итерацию по списку turnedon добавьте выключенный свет и удалите этот выключенный свет из списка turnedon , если это имеет смысл. Я не могу понять, что должно войти в цикл while. Любая идея будет по достоинству оценена.

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

    while turneon !=[]:

Всего 3 ответа


Эта проблема эквивалентна известной проблеме Иосифа Флавия , в которой n заключенных стоят в кругу, и их убивают в такой последовательности, в которой каждый раз следующий человек, которого нужно убить, - это k шагов по кругу от предыдущего человека; шаги учитываются только для остальных заключенных. Пример решения на Python можно найти на сайте кода Rosetta , который я немного адаптировал ниже:

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]

Это работает, но результаты отличаются от ваших:

>>> 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]
>>>

Я думаю, что более оптимальным решением было бы использование цикла, добавление смещения каждый раз и использование модулей для поддержания числа в диапазоне

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))

Есть идеи?

10000