Я пытаюсь выполнить задание, где 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))