let‘s play game!

来源:互联网 发布:键帽配色软件 编辑:程序博客网 时间:2024/05/16 19:45


第1题 

  Alice和她的同学Bob通过网上聊天商量明天早晨谁去教室打扫卫生的事,Bob说:“我在桌上放了一枚硬币,你猜一下,是正面朝上还是反面朝上?如果猜对了,我去扫地。如果猜错了,嘿嘿…。”

      Alice显然不会同意,担心自己不论猜正面还是反面,Bob都说她错了。

 

 

 

分析: 

看到这题,我的第一反应是葛优的“分歧终端机”。(╯▽╰)

最关键是要找到一种方法使得Alice给出她的猜测后Bob不能抵赖。一种参考答案如下:

 

1.    Bob与Alice商量选取一个哈希函数hash(),hash()的值域应该尽可能大。

2.    Bob选择一个大随机数x,计算hash(x);通过网络告诉Alice hash(x)的值

3.    Alice告诉Bob对x的奇偶性猜测(偶数表示“正面”;奇数代表“背面”)

4.    Bob告诉Alice x的值

5.    Alice验证hash(x)

 

但是这样也不是100%能够防止Bob作弊的。Bob如果想抵赖,那么他应该事先找出两个大整数,一奇一偶,而且哈希函数值相同。(抵赖的难度就取决于hash函数的选择了)

 

 

 

第2题 

       Alice与Bob相爱了,他们想通过书信来商量私奔的事。暗恋Alice的邮递员Chuck经常利用职权之便偷看他们之间的通信。Alice与Bob各有一把锁和只能打开自己那把锁的钥匙。另外Bob还有一个能够上锁的铁盒子。问如何防止Chunk偷看他们之间的通信?

 

 

 

分析: 

       Bob将情书放进铁盒,用自己的锁给盒子上锁。Alice收到后给盒子加上自己的锁,然后将盒子寄回给Bob。Bob收到后将自己的锁取下,再将盒子寄给Alice。Alice收到盒子后取下自己的锁就可以看信了。

 

 

 

第3题 

某人第一天由 A地去B地,第二天由 B地沿原路返回 A 地。问:在什么条件下,可以保证途中至少存在一地,此人在两天中的同一时间到达该地。

 

 

 

分析: 

假如我们换一种想法,把第二天的返回改变成另一人在同一天由B去A,问题就化为在什么条件下,两人至少在途中相遇一次,这样结论就很容易得出了:只要其中一个人在另外一个人到达之前出发,则两人必会在途中相遇。

 

 

 

第4题 

       一条长度为L的竹竿上分布着N个蚂蚁,已知所有蚂蚁的行进速度都是v,两只蚂蚁碰头后会掉头走,给定初始时刻蚂蚁的行进方向。问如何计算所有蚂蚁离开竹竿要多长时间?

 

 

 

分析: 

       最直接也是最笨的方法就是对每个蚂蚁的行动进行模拟。这样谁都能想到的答案当然不是出题者想要的了。

       换个角度想,2个蚂蚁碰头后掉头走实质上是等价于它们碰头后擦肩而过继续赶路。(如果你将所有蚂蚁都看作一样的话)

       好了,这样一想,过程简单多了。对于每个蚂蚁,都假设竹竿上只有它一个蚂蚁,然后计算出它离开竹竿的时间。所需时间最长的蚂蚁所耗的时间就是题目的答案了。

 

 

 

第5题 

一对情侣一起去买了一块饼

女生吃了3/7块饼

男生吃掉剩下的4/7块饼

 

男生比女生多出了4.5元

请问这块饼多少元?

 

 

 

分析:

  4.5元(有回答31.5的么?举个手?)

 

 

 

参考资料: 

[1]《编程之美》小组.《编程之美》

[2] matrix67. 密码学协议举例(五):两个人能够在电话上打牌吗?

http://www.matrix67.com/blog/archives/1407


密码学协议举例(五):两个人能够在电话上打牌吗?
icon2 Brain Storm | icon4 2009-02-20 14:20| icon339 Comments | 本文内容遵从CC版权协议 转载请注明出自matrix67.com

    密码学的应用范围非常广泛。每一样简单的社交活动里都有很大的学问。考虑这样一个问题,两个人想通过一部电话打牌,但他们都不信任对方。有没有可能仅通过一部电话实现扑克牌协议,并且保证游戏的公正性呢?
    扑克牌的信息隐蔽性带来了很多与密码学协议相关的有趣问题。两个象棋大师可以在洗澡间一边冲澡一边大喊“炮八平五”、“马八进七”,一对围棋情侣可以在床上一边亲热一边呻吟“点三三”、“拆二”。等事情办完了,一盘精彩的棋局或许也就结束了。这些棋类游戏之所以可以“盲下”,就是因为在棋类游戏中,双方的局面信息都是完全公开的。不过,打牌就是另外一码事了。你说你出方片7,我怎么知道你有一个方片7?事先发牌?那谁来负责发牌呢?怎样发牌呢?难道我告诉你“发到你手中的是两张3一张5一张8一张9”?这样一看,两个人“盲打扑克牌”似乎是不可能的了,要么需要借助道具,要么需要第三者的帮助。不过,运用密码学知识,我们可以设计一套扑克牌协议,该协议能够实现随机的、隐蔽的、公平的发牌,并且不需要其它东西的帮助。我们以一手五张牌为例,说明如何实现“两人各摸五张牌”的程序。


    我们首先来看这里面的一个趣题。

    10. A、B两人分别在两座岛上。B生病了,A有B所需要的药。C有一艘小船和一个可以上锁的箱子。C愿意在A和B之间运东西,但东西只能放在箱子里。只要箱子没被上锁,C都会偷走箱子里的东西,不管箱子里有什么。如果A和B各自有一把锁和只能开自己那把锁的钥匙,A应该如何把东西安全递交给B?
    答案:A把药放进箱子,用自己的锁把箱子锁上。B拿到箱子后,再在箱子上加一把自己的锁。箱子运回A后,A取下自己的锁。箱子再运到B手中时,B取下自己的锁,获得药物。

    我们的基本思路就是这样。不妨用数字1到54来表示54张牌。发牌前,A在每个数字前附着一个随机字符串前缀,然后给每个字符串都加上一把锁,把54张加密的扑克牌传给B。B收到了扑克牌一看,傻了,这些牌他一张也不认识,每张牌上面都有A的锁。B从里面挑选5张牌出来。他自己不知道这5张牌是什么,但是他也不能让A知道,于是他在这5张牌上再各加一把锁,传给A。A可以解开自己当初上的那把锁,但牌上还有一把锁,A拿它没办法,只能原封不动地传回去。B把剩下的锁解开,得到自己的5张牌。然后呢,B手上不是还剩了49张牌吗?B从中随便挑5张出来给A,由A解开上面的锁,得到A的5张牌。
    听起来很完美,但实现起来并不简单。上锁开锁和加密解密并不完全相同:两把锁的地位是相同的,但两次加密则有先后的问题。要想把上述协议转换为密码学协议的话,我们需要采用这样一种加密方式:明文首先由A加密,B在这个密文的基础上再进行加密,此时A还能够把里面那一层密码解开,而保持B的那一层密码不动。如果用Ea(x)表示A的加密函数,用Da(x)表示A的解密函数的话,我们需要一种加密系统使得Db(Da(Eb(Ea(x))))=x。有这样的加密系统吗?有!模数相同的RSA算法就满足这样的“交换律”。
    RSA算法之所以起作用,原因就在于你能找到这么一对e和d,使得ed≡1 (mod φ(n))。假如存在两对钥匙(e1, d1)和(e2, d2),容易想到(e1*e2)(d1*d2)=(e1*d1)(e2*d2),它仍然同余于1。因此,计算密文c=m^(e1*e2)之后,再计算c^(d1*d2)一定能恢复明文m,不管你是先算c的d1次方还是d2次方。
    有了RSA算法,我们的协议也就出来了。A、B两人各生成一对RSA公私匙(公钥不必也不能公开,我们这里只用到了RSA的可交换性,没用到RSA的加密钥匙可公开性)。A把54个加了随机字符串前缀的扑克牌分别用公钥加密并发给B,B从中选5张牌并再用自己的公钥加密,然后A用私钥解开B的这5张牌中里面一层的密码,B再用自己的私钥解密以得到自己的一手牌。同时,B在剩余的49张牌中挑选5张发给A,A用自己的私钥解密以获得自己的一手牌。这样下来,每个人都得到了自己的一手牌,而都不知道对方手里捏的是啥牌。以后如果还需要摸牌的话,则可以重复刚才的协议。游戏结束后,双方公开自己的钥匙,你可以验证看对方的钥匙与游戏中的数据是否吻合,以确定对方在游戏过程中没有作弊。这个协议可以轻易扩展到多个人的情况,也可以适用于更复杂的扑克牌游戏



二进制与三进制的那些趣题

Posted on 2010-12-22 12:43 苍梧 阅读(2404) 评论(2) 编辑 收藏 

先来思考几个问题,并不难,各位大牛应能秒杀:


1. 小明是个卖苹果的,小红一次在小明那买N(N<1024)个苹果。小明每次都要数N个苹果给小红,唉,太麻烦了。于是小明想出了一种方法:他把苹果分在10个袋子中,则无论小红来买多少个苹果,则他都可以整袋整袋的拿给小红。问怎样分配苹果到各个袋子?


2. 有16种溶液,其中有且只有一种是有毒的,这种有毒的溶液与另一种试剂A混合会变色,而其他无毒溶液与A混合不会变色。已知一次实验需要1小时,由于一次混合反应需要使用1个试管,问最少使用多少个试管可以在1小时内识别出有毒溶液?


3. 27个小球。其中一个比其他小球都要重一点。给你一个天平,最多称3次,找出这个特殊的小球。


4. 有12个颜色大小一模一样的小球,已知其中只有一只重量有些微差别(提示:但并不知到底是重还是轻哦),现在用一个没有砝码的天平,最多称三次把这个特殊的小球找出来。


5. 小莫有一个40磅的砝码,一次失手掉到地上,结果摔成了4块,心痛啊。但他却意外的发现这4块砝码碎片可以在天平上称1~40间的任意整数重量了,问4块的重量各是多少?


6. 将区间 [0,1] 平均分为3段,挖去中间的一段,即去掉 ( 1/3 , 2/3 ) ,然后将剩下的两段同样各自挖去中间1/3 。这样无限挖下去,问区间中[ 0 , 1 ] 中是否有永远不被挖掉的点?如果有,这些点的坐标有什么规律?


答案在下面,请先思考然后看答案!


解答: 

  发现错误或有更好解决方法的可留言告诉我,谢谢。第1、2题涉及二进制思想,大家平常都比较熟悉了,算是热热身。后面4题需要用到三进制和所谓的“平衡三进制”思想来解决,挺有趣的。

问题1: 

  答案:按1,2,4,8,16,.......,512

  分析

  第一个问题用二进制编码思想可以轻松解决,相信学计算机的各位不会有什么困难。

  按照二进制编码的特点, n位二进制数的各个数位的权重从低到高分别是2^0  ,2^1 , 2^2 ,…… 2^( n – 1 ) 。  n位无符号二进制数可以表示0到(2^n)- 1 ,共n个数。

  而二进制数位只有1和0两种状态,正好对应题目中苹果袋子的“给”与“不给”两种状态。因此只要将各个袋子分别装入 2^0 , 2^1 , 2^2 , …… , 2^9 个苹果即可满足题目要求。例如:需要66个苹果, 因66的二进制是 1000010 ,则小明只要将苹果个数为2^1(2个) 和2^6(64个)的袋子给小红就可以了。

问题2: 

  答案与分析:

  如果没有1小时的时间限制,那么利用二分搜索的思想既可以解决问题。( 第一次取16种溶液中的8种放入一个试管,然后加入试剂A,看有没有反应,根据结果再进行细分 。 这样只需4个试管,但是需要4个小时 )有了这个1小时的时间限制后这种方法就不管用了。一种正确的解答如下:

  首先,将16种溶液编号为0到15 ,编号的二进制形式表示如下:

0001

0010

0011

0100

0101

0110

0111

1000

1001

1010

1011

1100

1101

1110

1111

  然后,取4个试管,第一个试管加入编号二进制形式中第一位(指最低位)是1的溶液,第二个试管加入编号第二位是1的溶液,其他2个试管分别加入编号第3,4位为1 的溶液。然后再将试剂A加入4个试管中,看那些试管发生了反应,就可以知道有毒溶液的编号了。例如:第1、2、4号试管内发生了反应,则我们知道是第7号溶液是有毒的。原因是7的二进制编码是1011,因此7号溶液是唯一加入了1、2、4号试管,而没有加入3号试管的溶液。

问题3: 

  答案与分析:

  第3个问题可以使用三进制的原理来解决。先说说三进制,与二进制类似,三进制各个数位的权重分别为3^0 ,3^1 , 3^2 ,……., 3^n 。三进制用0 , 1 , 2 这3个数码表示数 ,因此每个三进制数位有3种状态。

对于每一次天平称量的结果有3种:左边较重、右边较重、平衡。我们可以将左边较重编号为1,右边较重编号为2,平衡编号为0 。

  首先将27个小球按照0到26编号,编号的三进制的形式如下:

000

001

002

010

011

012

020

021

022

100

101

102

110

111

112

120

121

122

200

201

202

210

211

212

220

221

222

  第一称量将编号的三进制第1位为1的小球(9个)放在左边,编号第1位为2的小球(9个)放在右边,编号第1位为0的不放。

  第二次称量将编号的三进制第2位为1的小球(9个)放在左边,编号第2位为2的小球(9个)放在右边,编号第2位为0的不放。

  第三次称量将编号的三进制第3位为1的小球(9个)放在左边,编号第3位为2的小球(9个)放在右边,编号第3位为0的不放。

  好了,根据3次称量的结果,我们就可以知道较重的那个小球的编号了。假设3次称量结果的编号分别为0,1,2 ,那么我们可以知道较重的是21号小球。因为21的三进制是( 210 ) ,因此只有21号小球在第一次称量时没放,第二次放在左边,第三次放在右边。

问题4: 

     答案与分析:

   问题4算是问题3的升级版本吧。

  如果知道异样小球比其他小球轻或重,那么就好办了,只要将12个小球分为4,4,4三堆,称3次是可以找到异样小球的,方法很简单,就啰嗦了。

  但是题目说明不知道异样小球究竟是偏轻还是偏重,上面的方法就不灵了。一种可行的解法如下:

  假设异样小球比正常小球要重,从12个中抽取N个小球出来,包含异常小球的组合总是比不包含异常小球的组合要重。

  将12个小球按编号为3进制的(000)至(102),如下:

000

001

002

010

011

012

020

021

022

100

101

102

  为了方便下面的讨论,先假设异常小球的编号是XYZ,那我们的目标就转化为如何称3次来确定X,Y,Z的值。我们找出异样小球的思路就是,通过称量来不断的缩小范围,最终推理出异常小球的编号。

  注意到编号中最低位为0,为1和2的各有4个。因此将最低位为1与2的分别放在天平两边称一次。根据第一次称的结果分为下面两种情况:

  (1)若第一次称量时天平不平衡,则异样小球必然在编号最低位为1或2的小球中,即Z等于1或2 。

  最低位为1或2的编号有下面8个:

001

002

011

012

021

022

101

102

  于是我们就将搜索范围缩小到上面的8个小球中了。

  注意到在这8个数中第二位为1和2的各有2个。就是下面这4个:

011

012

021

022

  因此第二次称量时,将上面列出的五个数中第二位为1和2的分别放天平两边。

  根据第二次称量的结果,可分为下面两种情况:

  <1>第二次称量时天平不平衡,那么我们可以肯定异样小球必然在第二位编号为1或2的小球中,Y等于1或2 。

    不妨假设小球 011 + 012 >  021 + 022

    假设第一次称量结果是最低位为1的小球比最低位是2的要重,那么我们可以肯定011号小球偏重或022号小球偏轻。

    那么第三次称量只需将011号或022号中任意一个与其他任意一个小球称量,若平衡则是正常小球,否则就是异常小球了。

  <2>第二次称量时天平平衡,则我们可以肯定异常小球编号第二位必然是0 。然后你可以仿照上面的做法通过编号的最高位来找出异常小球的编号。

(2)若第一次称量时天平平衡,则异样小球编号的最低位必然是0 。同样你可以参考上面的思路通过编号的第2,3位来找到异样小球,这里就不啰嗦了。

  另有这个问题的另一种解法供参考:http://blog.sina.com.cn/s/blog_49d0731a010007i0.html。




问题5: 

  答案:1,3,9,27

  分析:

  第5个问题就是所谓“德•梅齐里亚克的砝码问题”(The Weight Problem of Bachet de Meziriac)  。

  这里涉及到所谓“平衡三进制”的问题。平衡三进制,也叫对称三进制,是一种以3为基数,各个三进制位权重为3^0,3^1,3^2…….,3^n ,以 -1,0,1为基本数码的三进制计数体系。n位三进制数表示的范围是 -((3^n) -1)/2 ~ ((3^n) -1)/2 。

  需要明白的是,一个砝码可以放在要称量的物品的同侧,也可以放在对侧,当然也可以不放。砝码的三种状态可以表示为:不放 ( 0 )、放在物品对侧( +1 )、放在物品同侧 ( -1 ) 。

  因此各个砝码碎片的重量就是各个平衡三进制数位的权重( 3^0 , 3^1 , 3^2 , 3^3 ),即 1 , 3 , 9 , 27 。

  总结一下,上面1,2题利用二进制原理解决,而3,4,5题利用三进制原理解决。总的来说原理是一样的,核心的区别在于二进制数位有2种状态,三进制数位有3种状态。 (废话!)

问题6: 

  答案:康拓三分集

  分析

  首先用三进制数表示[0,1]间的小数,并将其画在数轴上。你会发现第一次其实是挖掉了所有小数点后第1位为1的所有数,而第二次则是挖掉了小数点后第2位为1的所有数,按此类推。

  实质上就是挖去了三进制表示法中所有含有数位1的数。因此剩余的数就是[0,1]区间上三进制表示法中不包含1的所有数的集合。这个集合就是所谓的康拓三分集。

  有趣的是:康拓三分集中元素的个数实质上是跟区间[0,1]上的实数个数是一样多的(严格的表述应该是“等势”)!

  若集合A与集合B的元素可以建立一种“一一对应”关系,则我们说A与B“等势”。例如:偶数集E跟自然数集N是等势的,因为对于偶数集中的任何一个数a,都可以在自然数集中找到一个数a/2与之相对应,反之也成立。

  下面来简单证明康拓三分集跟[0,1]区间是等势的。

  首先用二进制表示法来表示[0,1]区间中的小数。

  然后将数位中所有“1”变为“2”,这样在数位上就跟康拓三分集中的一个数完全一致了。反过来,将康拓三分集中的任一个数(二进制表示)中的全部“2”变为“1”,就唯一的对应[0,1]区间的一个二进制小数。因此,康拓三分集与 [0,1]可以建立一一对应关系,因而是等势的。

  整体= 部分。 很神奇吧?一旦到了无穷的领域就会出现很多有趣的东西,例如,你可以证明一小段线段跟一条直线上的点是等势的,完全平方数集合跟自然集是等势的,等等。

 最佳答案
分三组:每组四个,第一组编号1-4,第二组5-8,第三组9-12.
第一次称:天平左边放第一组,右边放第二组。

A 第一种可能:平衡。则不同的在第三组。
接下来可以在左边放第9、10、11号,右边放1、2、3号三个正常的。
a.如果平衡,则12号是不同的;
b.如果左重右轻,则不同的在9、10、11号中,而且比正常球重。再称一次:9放左边,10放右边,如果平衡,则11号是不同的;如果左重右轻,则9号是不同的,如果右重左轻,则10号是不同的。
c.如果左轻右重,道理同b

B 第二种可能:左重右轻,则不同的在1-8号中,但不知比正常的轻还是重。
第二次称:左边放1、2、5号,右边放6、9、3号。
a.如果平衡。则不同的在4、7、8中。可以称第三次:左边放4、7,右边放9、10。如果平衡,则8是不同;如果左重右轻,则4是不同;如果左轻右重,则7是不同。
b.仍然左重右轻。则不同的在位置没有改变的1、2、6中。可以称第三次:左边放1、6,右边放9、10。如果平衡,则2是不同; 如果左重右轻,则1是不同;如果左轻右重,则6是不同。
c:左轻右重。则不同的在5、3、中,因为只有它们改变了原来的位置。可以称第三次:左放5,3,右放9,10。如果左轻右重,则5是不同,如果左重右轻,则3是不同。

C 第三种可能:左轻右重,道理同B

至此,不论发生任何情况,称三次都可以找出不同,而且知道比正常的轻了还是重了。


原创粉丝点击