我可以算出你的姓氏

下班没事,出去享受下北京的夜生活。路过一个摆摊算卦的,招牌写的“不开口算出您的姓氏”。看起来有点意思,索性看看怎么个算法。

刚坐到摊位前的木椅上,摊主便开口说道:人生善恶非命定,为善作恶各自招。不知阴功算命理,术士空口也无凭。小伙子,要算什么?

我这一听,定场诗说的不错,我也不能输了气势:八月中秋白露,路上行人凄凉。小桥明月桂花香,日夜千思万想。心中万般宁静,青春好读文章。十年苦读在书房,方见才学益广。先生,您算算我的姓氏。

老先生一愣,这是遇到硬茬了,唬不住,直接见真章吧。“小伙子,我这里有7张卡片,我依次拿给你看,你只需要告诉我你的姓氏是否在卡片中,回答我yes or no,我就可以知道你的姓氏”。

这么神奇吗?那就开始吧。老先生依次给我看了七张卡片,我也诚实的回答了7次yes or no。老先生闭目掐指,嘴里念念有词:“异灵灵,异灵灵,灵”。

我心想这还真有点道行,没准真遇到高人了,真是大隐隐于世啊。老先生伸手一指,你是不是姓这个!

我这心里“咯噔”一下,绝了。刚要起身附拜,一不小心工卡从上衣兜掉了出来,正掉在老先生算卦的桌子上。

老先生一把按住我的工卡,急切问到:你是程序员?低级工程师?

我心想,难道老先生要点拨我什么吗?连忙回到:正是正是,说来惭愧,混迹程序员近四年,依旧是个低级。

老先生也起身伏在我耳畔,低声耳语:五年前,我也是程序员,架构师。同行不为难同行,送你三个字,你可凭这三个字与我一样,混一口饭吃,你且回家去吧。

我一脸懵的回了家,躺在床上,一直回想老先生对我说的“二进制”这三个字到底什么意思。

不知想到了几点,迷迷糊糊的就睡着了。梦里又回到了老先生的摊位前,又看到了当时的我前去算姓氏。我想这回我离老先生近一些,可要听清楚他当时的口诀,可能是解密的关键。

当“我”说完最后一个no的时候,老先生又闭目掐指,嘴里喃喃有词:“异灵灵,异灵灵,灵”。这时我注意到老先生的另一只手在纸上计算的什么,我凑过去一看,只见纸上写着“1001000=2^3+2^6=8+64=72”,然后老先生伸手一指,指向了编号为72的姓氏。突然,老先生扭过头,对着我的方向说到:开源!

我心中一紧,醒了过来。

原来如此,原来如此。起身恭敬地对着正北方向拜了三拜,严肃地说道:多谢先生指点。定完成您的嘱托。

原来秘密还真是“二进制”三个字。

我们假设有m张卡片,首先按顺序把常见的姓氏进行编号,从1开始到n,n=2^m-1。这样每个姓氏都可以转换为一个唯一的二进制来表示,我们只需要找到二进制表示中为1的位置,在对应的卡片中写下该姓氏。比如编号72,就可以表示为1001000,那么我们就只需要在卡片7和卡片4上写编号为72的姓氏,其他卡片都不写。这样,当我们按顺序看每张卡片时,根据姓氏是否在卡片中,即可恢复出一个唯一的二进制序列,我们把该二进制恢复为十进制后,即可以得到该姓氏的编号。

我们给一个简单的例子,比如我们有八个姓氏:赵钱孙李、周吴郑王。

我们对其进行编号:赵-1,钱-2,孙-3,李-4,周-5,吴-6,郑-7,王-8

转换为二进制之后为:赵-0001,钱-0010,孙-0011,李-0100,周-0101,吴-0110,郑-0111,王-1000。

因为有四位,所以我们需要四张卡片,分别记为:0-1-2-3。我们按照前面的规则,二进制表示的姓氏中找到为1的位置,把该姓氏放到对应卡片中。

即:赵:0号

钱:1号

孙:0号、1号

李:2号

周:0号、2号

吴:1号、2号

郑:0号、1号、2号

王:3号

那么每张卡片最终写入的姓氏为:

0号卡:赵、孙、周、郑

1号卡:钱、孙、吴、郑

2号卡:李、周、吴、郑

3号卡:王

当然,为了整齐,可以给3号卡补充三个不可能成为姓氏的字,比如:鲲、屯、烫。

那么我们的卡片就制作成功了,比如你姓李,从三号开始依次给你看四张卡片,你的回答一定是:no、yes、no、no。

转换为二进制就是:0100,再转换为十进制就是:4,4号姓氏对应:李。

按照这个做法,我们可以把常见的姓氏都列出来,排序编号,转换二进制,写到卡片中,再给每个卡片补充一定量的罕见字,让每张卡片字数一样多,然后我们就可以出去摆摊混一口饭吃了。

当然了,还得背几句定场诗,先把人唬住。然后再学一点结印手势,转移注意力,另一只手好快速进行二进制到十进制的转换。最后,记住关键口诀:异灵灵,异灵灵,灵。也就是1001000,关键是断句。

不说了,地摊文化兴起,我准备去摆摊算姓氏了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章