《programming for the puzzled》第三章
本章涉及的内容:从用户获取输入,流程控制,编码和解码信息。
问题描述:你是一个魔术师和会读心术的特异功能者。你在屋外时,五位观众从52张一副的扑克里每人选了一张,你的助手收集了这五张牌。助手向所有观众展示其中的4张牌,每次一张。展示每张牌的时候,助手让观众关注在牌上,而你尝试读取他们心里所想的。过几秒后,助手向你展示这张牌。四张牌都展示完后,你离开屋子。助手向所有人展示第五张牌,并藏起来。你回来,并准确说出第五张牌是什么。原因是助手展示四张牌的顺序向你透露了第五张牌是什么。助手(而不是观众)决定展示哪四张牌,藏哪一张牌。
一个例子:假设观众选择了红心10,方块9,红心3,黑桃Q,方块J。
助手先把符号相同的两张牌检出来,五张牌至少有两张是符号相同的。在这个例子中是红心3和红心10.
助手把这两张牌放在如图所示的位置上。
任意两张牌之间顺时针的距离在1-6之间。
展示其中一张牌,另一张仍被隐藏。被展示的那张牌是顺时针能在6步或更少的步数到达另一张牌的那张牌。在这个例子里,红心10到红心3顺时针需要5步,因此红心10先被展示。
未被展示的那张牌与第一个被展示的那张牌是一个符号。其位置与第一个被展示的牌的顺时针距离在1-6之间。
所有剩下的牌被赋予一个1-6的数值。魔术师和助手事先确认桌上的牌按不同花色从小到大排列。(梅花A方块A红心A黑桃A梅花2方块2红心2黑桃2…梅花K方块K红心K黑桃K)
根据最后三张牌来赋值,规则为:
(小、中、大) = 1
(小、大、中) = 2
(中、小、大) = 3
(中、大、小) = 4
(大、小、中) = 5
(大、中、小) = 6
助手想传达的数值是6,于是助手展示剩下三张牌的顺序是黑桃Q、方块J、方块9(大中小)。于是魔术师知道从红心10开始,顺时针走六张牌,就是隐藏的红心3了。
总结一下,就是随机摸5张牌,花色相同的两张展示一张,隐藏另一张。就知道隐藏的牌的花色,再用另外三张进行排列,传递花色相同的两张牌的位置信息,就可以确定隐藏的那张牌了。
还是我自己先写,写了好长时间,主要是调试,总有bug。
1 | # coding:utf-8 |
终于对了。但是很繁琐,有200多行。再看看作者写的,思路跟我差不多,也是将近200行。就不搬过来了。这种程序,算法不难,调试了好长时间,很多地方都是加一减一的错误。
一个更难的问题,只选四张牌能不能玩这个游戏?因为可能四张牌符号都不同,一个解决方法是把52张牌都放到那个圈里,一定有两张牌小于等于13。具体不再实现了。
练习也pass了,实在不喜欢这个题目。视频课程里现场玩了这个游戏。
本章代码: https://github.com/zwdnet/MyQuant/blob/master/44/03
我发文章的三个地方,欢迎大家在朋友圈等地方分享,欢迎点“在看”。
我的个人博客地址:https://zwdnet.github.io
我的知乎文章地址: https://www.zhihu.com/people/zhao-you-min/posts
我的微信个人订阅号:赵瑜敏的口腔医学学习园地