数据驱动,成就未来 www.enmotech.com Yangtingkun 的 DBA 工作手记
·46·
利用 SQL 解释一个魔术
一个偶然的机会在电视上看到一个有关扑克牌的魔术,觉得很有意思。这个魔术明显不是靠手快或者做假
来实现的,奥妙在于魔术中包含了数学原理。
首先描述一下这个魔术,有兴趣的话,可以按照这个方法试一试。
从一副扑克牌中随意抽取 21 张牌。让观众从这些牌中随意选择一张,这张牌就是最后通过魔术需要找到
的目标牌。让观众牢记后将其放回到其余 20 张牌中,然后任意洗牌。
下面开始进行发牌的工作,发牌和普通扑克的发牌规则一样。将牌发成 3 叠,每叠 7 张。将每叠牌依次展
示给观众,要求观众确认目标牌在 3 叠的哪一叠中即可。
之后将 3 叠牌合在一起,将包含目标牌的一叠放在其他两叠牌中间。注意此时不要打乱每叠牌的顺序。
然后再次发牌,和刚才完全一样,还是将牌发成 3 叠。让对方确认目标牌所在的一叠,将这叠牌放到另外
两叠牌的中间。
最后,再次重复上面的发牌、确认此过程,仍然将包含目标牌的那叠牌,放到另外两叠牌的中间。
下面神奇的时刻到来了:从这叠扑克牌的上面每次拿起一张,每拿起一张牌的同时要说一句话:“你要相信
魔术你的牌是”。说完这句话,下一张牌就是目标牌了。
看上去这个魔术很神奇,而且最神奇的是,这个魔术任何人都可以来表演。这就说明无论这张牌最初在哪
个位置,只要按照这个规则最后都一定会来到这个指定的位置。
看了这个魔术,不禁有点手痒,既然是 DBA 出身,就用 SQL 来演示一下这个魔术的过程吧,见如下代码:
SQL> WITH A AS
2 (SELECT ROWNUM P FROM DUAL CONNECT BY LEVEL <= 21)
3 SELECT
4 7 + CEIL(
5 (7 + CEIL(
6 (7 + CEIL(P/3))
7 /3))
8 /3)
9 FROM A;
7+CEIL((7+CEIL((7+CEIL(P/3))/3))/3)
-----------------------------------
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
评论