需要用Python编程的谜题?

时间:2016-04-07 22:35:10

标签: python python-2.7 python-3.x wxpython ipython

我是Python的初学者......事实上,我是编程的初学者。 Python是我开始学习的第一种编程语言。

我收到了一个谜题,我喜欢通过写一个程序来解决这个问题(作为一种练习),但我无法解决。

谜题如下:

假设你有100个人,他们站成一个圆圈,每个人都有一个数字,第一个带有数字1,第二个带有数字2,......,等等结束于最后一个携带数字100的人...第一个被给予一把剑来杀死一个数量大于他的人1 ...这意味着他杀了2号...然后他把剑给了下一个3号的剑......而且这个过程一直持续到只剩下一个人活着!那个人是谁?

我试图手动解决它,结果证明答案是73 ...... 73号是活着的人!

但是,你知道如何编程吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

显然你自己解决了......怎么样?你能让Python以同样的方式做到吗?

因为你这样做是为了学习,所以让我们想一些不同的事情

你怎么跟踪谁还活着? 你怎么知道何时停止杀人(这让我发笑)和 你打算如何传球?

为了让你走上正确的轨道,我建议用Google搜索"迭代Python和#34;或者" Python控制结构"

因为另一个答案提供了迭代方法在我的解决方案中,我将使用递归来解决问题,函数调用自身直到达到退出条件。

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)