我可以算出你的姓氏

下班沒事,出去享受下北京的夜生活。路過一個擺攤算卦的,招牌寫的“不開口算出您的姓氏”。看起來有點意思,索性看看怎麼個算法。

剛坐到攤位前的木椅上,攤主便開口說道:人生善惡非命定,爲善作惡各自招。不知陰功算命理,術士空口也無憑。小夥子,要算什麼?

我這一聽,定場詩說的不錯,我也不能輸了氣勢:八月中秋白露,路上行人淒涼。小橋明月桂花香,日夜千思萬想。心中萬般寧靜,青春好讀文章。十年苦讀在書房,方見才學益廣。先生,您算算我的姓氏。

老先生一愣,這是遇到硬茬了,唬不住,直接見真章吧。“小夥子,我這裏有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,關鍵是斷句。

不說了,地攤文化興起,我準備去擺攤算姓氏了。

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