Возвращение списка упорядоченных элементов с условием в структуре while l oop - PullRequest
1 голос
/ 16 января 2020

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

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

    while turneon !=[]:

Ответы [ 3 ]

2 голосов
/ 16 января 2020

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

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]
1 голос
/ 16 января 2020

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

>>> 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]
>>>
1 голос
/ 16 января 2020

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

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...