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