2016-04-07 1 views
0

Я новичок в Python ... На самом деле, я начинаю программировать. Python - это первый язык программирования, который я начал изучать.Пазл, который нужно запрограммировать с помощью Python?

Я получил головоломку, которую мне нравилось решать, написав программу, чтобы сделать это (как практика), но я не мог.

Загадка была следующая:

Скажем, у вас есть 100 человек, стоя, как они делают круг, каждый из них имеет номер, первый один несет номер 1, второй носит номер 2 , ... и так далее, заканчивая последним, у которого есть номер 100 ... Первому был дан меч, чтобы убить того, у кого больше, чем у него с 1 ... Это означает, что он убивает номер 2 ... И затем он дает меч следующему, который является номером 3 ... И процесс продолжается, пока только один не останется в живых! ... Кто это?

Я попытался решить проблему вручную, и оказалось, что ответ был 73 ... Номер 73 - тот, кто остается жив!

Но, вы знаете, как его запрограммировать?

Спасибо за помощь!

+0

Пожалуйста, включают код, который вы попробовали. – MarkyPython

+0

, но кто убивает номер 100, когда вы добираетесь до него? – Keatinge

+0

У меня есть программа, чтобы сделать большую часть этого, но в итоге я получаю: '[97, 1, 9, 17, 25, 33, 41, 49, 57, 65, 73, 81, 89]. Номер 97 не может убить никого здесь. Что вы хотите, когда мечу вручают на номер 97. ** РЕДАКТИРОВАТЬ ** Я искал головоломку, похоже, что она не работает, убивая того, кто имеет число больше вас, тот, у кого меч, убивает кого угодно следующий в строке – Keatinge

ответ

0

Хорошо, это забавная проблема, и, на мой взгляд, это отличный повод для использования функции pythons .pop.

circle = list(range(1,101)) 
#100 people numbered 1-100 


while len(circle) > 1: #run this code as long as the circle has more than one person 
    print(str(circle[0]) + " kills " + str(circle[1])) 
    survivor = circle[0] #save the survivor to a variable 
    circle.pop(1) #remove the person killed from the list 
    circle.pop(0) #remove the person who survives from the list 
    #now the new start of the list is whoever is next in line 

    circle.append(survivor) #re-add the survivor to the list at the end 

print(str(circle[0]) + "is the winner") #print out the survivor 

Это работает, потому что «старт» круг всегда круг [0], когда два человека дерется, как победитель и проигравший, удаляются из списка, делая круг [0] тот, кто находится рядом в строке , Тогда победитель вновь добавляется в конец списка, помещая его в спину

Я добавил пару строк для печати из полной эволюции круга и загрузив его на Pastebin http://pastebin.com/raw/z6ghuqE3

+0

Это было потрясающе! :-) Большое спасибо ... Я постараюсь изучить и понять вашу программу! Где вы изучали Python? –

+0

Я начал пару недель назад с googles python class (все доступные на youtube): https://www.youtube.com/watch?v=tKTZoB2Vjuk, но у меня много фона на других языках, поэтому было легко подобрать – Keatinge

+0

Ты гений! :-) .... Я проверю вашу ссылку ... И спасибо за все! –

-1

Очевидно, вы решили это самостоятельно ... Как? Можете ли вы сделать Python так же?

Потому что вы делаете это в качестве учебного упражнения давайте думать о несколько разных вещах

Как вы собираетесь отслеживать, кто жив Как вы будете знать, когда прекратить убивать людей (что сделано меня смеяться) и Как вы собираетесь передать мечу

чтобы вы на правильном пути, я хотел бы предложить прибегая к помощи что-то вроде «итерации в Python» или «структуры управления Python»

Потому что другой ответ предоставило Итеративный подход В моих soluti на Я буду использовать рекурсию для решения проблемы, когда функция вызывает себя, пока не достигнет условия выхода.

numPeople = 100 
theCircle = list(range(1, numPeople + 1)) 

#Solve with recursion 
def massacreRecursion(theCircle): 
    #Exit condition 
    if len(theCircle) == 2: 
     theCircle.pop(1) #kill the last victim so len(theCircle) == 1 is True 
     print(theCircle[0]) #Print the survivor 
    else: 
     theCircle.pop(1) #kill some poor pleb 
     theCircle.append(theCircle.pop(0)) #rotate the circle left 1 effectively passing the sword right 
     massacreRecursion(theCircle) #do it again and again and again... 

#enter the recursion 
massacreRecursion(theCircle) 
+0

Я сделаю это! :-) .... И большое спасибо! .... Как вы думаете, для меня лучше всего изучить Python? –