复原小时候见过的数学魔术

今年我为北京世纪坛的数学益智游戏展贡献了不少内容。我打算在这里记录一些自己的创作、发现、收获和心得。顺便结合一下这几年的经历。这是该系列的第一篇。

有一个经典的数学小魔术。把 0 到 63 之间的数写在 6 张纸条上,其中第 1 张纸条上写着二进制表达中右起第 1 位数字为 1 的数,第 2 张纸条上写着二进制表达中右起第 2 位数字为 1 的数,第 3 张纸条上写着二进制表达中右起第 3 位数字为 1 的数,等等。给人展示 6 张纸条,问他“你的年龄出现在了哪些纸条里”。对方给出的答案就相当于告诉了你,他的年龄的二进制表达中各个地方是 0 还是 1。你就能报出他的年龄了。

今年的展会有一个主题就是过年。我们打算设计一个类似的小魔术,只不过把年龄改成生肖。由于生肖有 12 个,因此 4 张纸条就可以做到这一点。

Read more…

在 2048 里能够得到的最大的数是多少?

Michael Brand 在 Using your Head is Permitted 趣题站 2014 年 4 月的谜题中提出了一个这样的问题:在最近非常流行的小游戏 2048 中,你能得到的最大的数是多少?

在这里,我们简单描述一下游戏的规则。游戏在一个 4 × 4 的棋盘上进行,棋盘里填有一个个的“数块”,每个数块上都写有某个形如 2n 的正整数。每一步,你需要从上、下、左、右四个方向中选取一个方向,按下对应的方向键之后,所有的数块都会“落”到这个方向;若有两个同种的数块在此过程中发生碰撞,则它们的值会相加起来,并合成一个新的数块。然后,系统会在棋盘中随机选择一个空白位置,并在此生出一个新的数块,上面写有数字 2 或者数字 4 (两种情况之比为 9 : 1)。游戏开始时,棋盘上会自动生成两个随机的数块,你的目标就是通过有限步的操作,得出一个写有 2048 的数块。当然,即使得到了 2048 这个数块,游戏也不会自动结束,你还可以向更大的数发起挑战。于是就有了我们刚才的问题:理论上,这个游戏当中能够得到的最大的数是多少?

Read more…

Thue-Morse 序列与免平方字符串

字符串 hello 当中连续出现了两个 l 。字符串 prototype 当中连续出现了两个 ot 。字符串 nonsense 当中连续出现了两个 nse 。如果某个字符串中连续出现了两个相同的片段,换句话说这个字符串里面含有形如 XX 的模式(其中 X 代表一个子串),我们就说这个字符串中含有一个“平方”(square)。如果某个字符串中没有平方出现,我们就说这个字符串是“免平方”的(square-free)。

如果只使用两种字符,比方说字符 0 和字符 1 的话,我们只能构造出一些长度非常有限的免平方字符串。事实上,我们只能构造出以下 6 个免平方字符串: 0 、 1 、 01 、 10 、 010 、 101 。然而,如果允许使用三种字符,比方说字符 0 、 1 、 2 的话,我们不但能够构造出任意长的免平方字符串,还能构造出无限长的免平方字符串。在继续阅读下去之前,你不妨先自己试试看。

Read more…

趣题:只允许加倍操作的水桶倒水问题

    今天的题目来自这里。有三个水桶,它们里面分别装了 a 升的水、 b 升的水和 c 升的水(其中 a 、 b 、 c 都是正整数,桶本身没有容量限制)。你可以把水从一个桶倒进另一个桶,但必须保证让后者的水量刚好变成原来的两倍。证明,不管 a 、 b 、 c 是多少,你总能让其中某一个水桶变空。

    例如,假设初始时 (a, b, c) = (3, 2, 1) ,那么你可以先把 (3, 2, 1) 变成 (1, 4, 1) ,再把它变成 (2, 4, 0) ,从而把第三个水桶变空。

Read more…

趣题:老鼠与毒药问题的推广

    今天的趣题来源于 IBM Ponder This 三月份的谜题

    大家应该都听说过这个老题目:有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?

    这个问题的答案也堪称经典:把瓶子从 0 到 999 依次编号,然后全部转换为 10 位二进制数。让第一只老鼠喝掉所有二进制数右起第一位是 1 的瓶子,让第二只老鼠喝掉所有二进制数右起第二位是 1 的瓶子,等等。一星期后,如果第一只老鼠死了,就知道毒药瓶子的二进制编号中,右起第一位是 1 ;如果第二只老鼠没死,就知道毒药瓶子的二进制编号中,右起第二位是 0 ⋯⋯每只老鼠的死活都能确定出 10 位二进制数的其中一位,由此便可知道毒药瓶子的编号了。

    现在,有意思的问题来了:如果你有两个星期的时间(换句话说你可以做两轮实验),为了从 1000 个瓶子中找出毒药,你最少需要几只老鼠?注意,在第一轮实验中死掉的老鼠,就无法继续参与第二次实验了。

Read more…