讀古今文學網 > 算法神探:一部谷歌首席工程師寫的CS小說 > 4 字符串及隱藏的信息 >

4 字符串及隱藏的信息

Frank甩掉Notation警官後從農場後門離開,那裡有一塊很大的指示牌正朝著馬路。多年來,Crannock夫婦一直使用這個指示牌來傳播各種加了密的非法活動的消息。這些天,對於前來此處的罪犯而言,它堪稱一個旅遊景點——在這裡,惡棍領著年輕的門徒,聚在一起追憶那些以「想當年……」開頭的故事。

指示牌是一個AnyText模型。它可容納三排字符數組,每排有12個空位,每個字母、空格或標點符號都需要佔用一個空位。這意味著指示牌可以容下36個字符——足以顯示一個完整的非法活動通知。每週一早晨,Crannock夫婦中的一人就會拖著一筐字母到指示牌前,然後逐個將對應的字符放入至數組的每個空位中。

Frank在當警察的第一個星期裡,他的搭檔就帶他出去「檢查指示牌」。當時的消息是「APPLE PICKER WANTED」和「GOT SLUGS?」,對Frank來說,這兩則消息看起來貌似無關緊要。Crannock夫婦是在尋找一名採摘工來幫助採摘蘋果,同時問是否有需要幫忙除去家裡的鼻涕蟲的。當Frank對他的搭檔(一位從業20年的老警察)說這事時,她笑了。

「他們就是希望你這樣理解,」Rossile警探解釋道,「你得看懂其中暗含的意思,搞清楚罪犯想的是什麼。在本案中,招聘蘋果採摘工是指他們在試圖招募一名小偷。其實就是願意從手推車或類似車輛上偷蘋果的人。」

「那鼻涕蟲呢?」Frank問道。

「非法鼻涕蟲賽跑,」她回答道,「他們每隔幾個月都會在這裡舉行比賽。到時候你就會明白的。」

就這樣,Frank學會了每週檢查Crannock夫婦的指示牌,以便瞭解罪犯的世界。開始的幾個月過後,他已經學會解讀大部分密碼了。農夫(farmhand)就是指追隨者,通過增加修飾語可以表達需要什麼樣的追隨者,例如很強壯、很殘酷,或是具體的人數。印刷藝術家(print artist)是指造假者,而聲樂藝術家(vocal artist)則是指騙子,諸如此類。一群小雞(a flock of chickens)這個詞語把Frank難住了好幾天,最後,Rossile警探將此解讀為:需要一群頭腦簡單四肢發達的熱血青年到處亂跑並製造出噪聲,以此來分散人們的注意力。

在當警察第一年快結束的時候,Frank已經成為解讀指示牌的高手了。過去幾年裡,Frank通過指示牌解讀罪犯消息時,唯一一次感到棘手的是他的王國都遭遇了巫師Exponentious發出的攻擊那次。巫師Exponentious對王國中所有用數組設計的指示牌上都施了咒語。咒語改變了原有數組的索引方式,這導致Crannock夫人放置的字母位置都是錯的。整整一個星期,Crannock夫婦家的指示牌都被認為是毫無用處的信息。

由於咒語僅僅是將原有的字母順序打亂,而且AnyText模型是利用三個單獨數組實現的,所以Frank可以逐一對每行進行破解。最終他解開了密碼:招募防禦巫師(DEFENSIVE WIZARDWANTED)。

但是,今天的消息顯得太直白了。事實上,這是他在Crannock夫婦家的指示牌上見過的最狡猾的消息。指示牌上面寫著「ARRAYCARTS FORRENT」和「NO QUESTIONS」。

警用算法導論:字符串

節選自Drecker教授講義

數組不僅可以存儲一列數字,它們還可用於存儲由一列字母組成的字符串。許多編程語言也都是利用數組來實現字符串的存儲的,數組中的每一位都可容納一個字符,這個字符可以是字母、數字、符號或空格。與使用其他數據類型的數組一樣,字符串中的某一個字符也可直接通過數組的索引來訪問。

在你的警隊生涯中,你會逐漸掌握使用數組來存儲文字信息的方式。所有的標準警用表格都要求警官能在每頁的頂部用一個32位的數組記錄他們的姓名。通常一個月以後,你就已經用此方法填滿400個這樣的數組了。