"Josephus-problem" использование списка в python

Я хотел знать, можно ли решить проблему Иосифа, используя list в python.

в простых терминах проблема Иосифа Флавия заключается в поиске позиции в круговом расположении, которое было бы безопасным, если бы казни были обработаны с использованием параметра пропуска, который известен заранее.

например: учитывая круговое расположение, такое как [1,2,3,4,5,6,7] и параметр пропуска 3, Люди будут выполнены в порядке 3,6,2,7,5,1 и позицию 4 будет Сейф.

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

 a=[x for x in range(1,11)]
 skip=2
 step=2
 while (len(a)!=1):
   value=a[step-1]
   a.remove(value)
   n=len(a)
   step=step+skip
   large=max(a)
   if step>=n:        
      diff=abs(large-value)
      step=diff%skip
   print a

Обновлено вопрос с фрагментом кода, но я не думаю, что моя логика правильная.

4 ответов


все очень просто, вы можете использовать list.pop(i) чтобы удалить каждую жертву (и получить его идентификатор) в цикле. Тогда нам остается только беспокоиться об обертывании индексов, что вы можете сделать, просто взяв пропущенный индекс mod количество оставшихся заключенных.

Итак, решение вопроса становится

def josephus(ls, skip):
    skip -= 1 # pop automatically skips the dead guy
    idx = skip
    while len(ls) > 1:
        print ls.pop(idx) # kill prisoner at idx
        idx = (idx + skip) % len(ls)
    print 'survivor: ', ls[0]

проверить выход:

>>> josephus([1,2,3,4,5,6,7], 3)
3
6
2
7
5
1
survivor:  4

In [96]: def josephus(ls, skip):
    ...:     from collections import deque
    ...:     d = deque(ls)
    ...:     while len(d)>1:
    ...:         d.rotate(-skip)
    ...:         print(d.pop())
    ...:     print('survivor:' , d.pop())
    ...:     

In [97]: josephus([1,2,3,4,5,6,7], 3)
3
6
2
7
5
1
survivor: 4

Если вы не хотите вычислять индекс, вы можете использовать deque структуры данных.


Это мое решение вашего вопроса:

# simple queue implementation<ADT>
class Queue:
    def __init__(self):
        self.q = []
    def enqueue(self,data):
        self.q.insert(0,data)
    def dequeue(self):
        self.q.pop()
    def sizeQ(self):
        return len(self.q)
    def printQ(self):
        return self.q


lists = ["Josephus","Mark","Gladiator","Coward"]
to_die = 3
Q = Queue()
# inserting element into Q
for i in lists:
    Q.enqueue(i)
# for size > 1 
while Q.sizeP() > 1:
    for j in range(1,3): 
# every third element to be eliminated
         Q.enqueue(Q.dequeue())
    Q.dequeue()
print(Q.printQ())

def Last_Person(n):
    person = [x for x in range(1,n+1)]
    x = 0
    c = 1
    while len(person) > 1:
        if x == len(person) - 1:
            print("Round ", c, "- Here's who is left: ", person, "Person ", person[x], "killed person", person[0])
            person.pop(0)
            x = 0
            c = c+1
        elif x == len(person) - 2:
            print("Round ", c, "- Here's who is left: ", person, "Person ", person[x], "killed person", person[x + 1])
            person.pop(x+1)
            x = 0
            c = c + 1
        else:
            print("Round ", c, "- Here's who is left: ", person, "Person ", person[x], "killed person", person[x + 1])
            person.pop(x + 1)
            x = x + 1
            c = c + 1
    print("Person", person[x], "is the winner")

Last_Person(50)