下班沒事,出去享受下北京的夜生活。路過一個擺攤算卦的,招牌寫的“不開口算出您的姓氏”。看起來有點意思,索性看看怎麼個算法。
剛坐到攤位前的木椅上,攤主便開口說道:人生善惡非命定,爲善作惡各自招。不知陰功算命理,術士空口也無憑。小夥子,要算什麼?
我這一聽,定場詩說的不錯,我也不能輸了氣勢:八月中秋白露,路上行人淒涼。小橋明月桂花香,日夜千思萬想。心中萬般寧靜,青春好讀文章。十年苦讀在書房,方見才學益廣。先生,您算算我的姓氏。
老先生一愣,這是遇到硬茬了,唬不住,直接見真章吧。“小夥子,我這裏有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,關鍵是斷句。
不說了,地攤文化興起,我準備去擺攤算姓氏了。