開源學村

使用 Linux 命令行解決Wordle 問題

使用 Linux 的 grep 命令和 fgrep 命令解開你喜歡的單詞猜謎遊戲。

我最近有點迷上了一個在線文字遊戲,在這個遊戲中,你有六次機會來猜一個隨機的五個字母的單詞。這個詞每天都在變化,而且你每天只能玩一次。每次猜測後,你猜測中的每個字母都會被高亮顯示:灰色表示該字母沒有出現在神秘的單詞中,黃色表示該字母出現在單詞中,但不在那個位置,綠色表示該字母出現在該單詞的正確位置。

以下是教你如何使用 Linux 命令行來幫助你玩猜謎遊戲,如 Wordle。我用這個方法幫助我解決了1月6日的謎題:

第一次嘗試

Linux 系統在 /usr/share/dict/words 文件中保存了一個單詞詞典。這是一個很長的純文本文件。我系統的 words 文件有超過479800個條目。該文件既包含純文字,也包含專有名詞(名字、地點等等)。

為了開始我的第一個猜測,我只想要一個正好是五個字母長度的純文字列表。要做到這點,我使用了 grep 命令:

$ grep '^[a-z][a-z][a-z][a-z][a-z]$' /usr/share/dict/words > myguess

grep 命令使用正則表達式進行搜索。你可以用正則表達式做很多事情,但為了幫助我解決 Wordle 問題,我只需要一些基礎的知識點: ^ 表示行的開始, $ 表示行的結束。在這兩者之間,我指定了5個 [a-z] 的實例,表示從 a 到 z 的任何小寫字母。

我還可以使用 wc 命令看到可能的單詞列表中「只有」15000個單詞:

$ wc -l myguess
15034 myguess

從該列表中,我隨機挑選了一個五個字母的單詞: acres。 a 被設置為黃色,意味著該字母存在於神秘單詞的某個位置,但不在第一位置。其他字母是灰色的,所以我知道它們不存在於今天的單詞中。

第二次嘗試

對於我的下一個猜測,我想得到一個包含 a,但不是在第一位置的所有單詞的列表。我的列表也不應該包括字母 c, r, e 或 s。讓我們把它分解為幾個步驟:

為了得到所有帶 a 的單詞的列表,我使用 fgrep(fixed strings grep) 命令。 fgrep 命令也像 grep 一樣搜索文本,但不使用正則表達式:

$ fgrep a myguess > myguess2

這使我下一個可能的猜測列表從15000字降為6600字:

$ wc -l myguess myguess2
 15034 myguess
  6634 myguess2
 21668 total

但這個單詞列表也包括了第一個位置的字母a,這是我不想要的。遊戲已經表明字母 a 存在於其他位置。我可以用 grep 修改我的命令,尋找在第一個位置含有其他字母的詞。這樣我就把可能的猜測縮小到5500個單詞:

$ fgrep a myguess | grep '^[b-z]' > myguess2
$ wc -l myguess myguess2
 15034 myguess
  5566 myguess2
 20600 total

但我知道這個神秘的詞也不包括字母 c、 r、 e 和 s,所以我可以用另一個 grep 命令從搜索中省略這些字母:

$ fgrep a myguess | grep '^[b-z]' | grep -v '[cres]' > myguess2
$ wc -l myguess myguess2
15034 myguess
 1257 myguess2
16291 total

-v 選項表示反轉搜索,因此 grep 將只返回不符合正則表達式 [cres] 或單列字母 c、 r、 e 或 s 的行。通過這個額外的 grep 命令,我已經將下一個猜測的範圍大大縮小到只有1200個可能的單詞,這些單詞在某處有 a,但不在第一位置,並且不包含 c、 r、 e 或 s。

查看列表後,我決定嘗試 balmy 這個詞。

第三次嘗試

這一次,字母 b 和 a 被高亮為綠色,這意味著我把這些字母放在了正確的位置。字母 l 是黃色的,所以這個字母存在於單詞的其他地方,但不是在那個位置。字母 m 和 y 是灰色的,所以我可以在我的下一次猜測中排除這些。

為了確定我下一個可能的單詞列表,我可以使用另一組 grep 命令。我知道這個詞以 ba 開頭,所以我可以從這裡開始搜索:

$ grep '^ba' myguess2 > myguess3
$ wc -l myguess3
77 myguess3

這隻有77個字!我可以通過尋找除第三位外還含有字母 l 的詞來進一步縮小範圍:

$ grep '^ba[^l]' myguess2 > myguess3
$ wc -l myguess3
61 myguess3

方括弧[^l] 內的 ^ 意味著不是這個字母列表,所以不是字母 l。這使我的可能單詞列降到61個,但並非所有單詞都包含字母 l,我可以使用另一個 grep 搜索來消除字母 l:

$ grep '^ba[^l]' myguess2 | fgrep l > myguess3
$ wc -l myguess3
10 myguess3

其中一些單詞可能含有字母 m 和 y,而這些字母並不在今天的神秘詞中。我可以再進行一次倒置的 grep 搜索,把它們從我的猜測列表中刪除:

$ grep '^ba[^l]' myguess2 | fgrep l | grep -v '[my]' > myguess3
$ wc -l myguess3
7 myguess3

我的可能辭彙清單現在很短,只有7個詞!

$ cat myguess3
babul
bailo
bakal
bakli
banal
bauld
baulk

我將選擇 banal 作為我下一個猜測的單詞,而這恰好是正確的。

正則表達式的力量

Linux 命令行提供了強大的工具來幫助您完成實際工作。 grep 和 fgrep 命令在掃描單詞列表時提供了極大的靈活性。對於一個基於單詞的猜謎遊戲, grep 幫助確定了一個當天包含15000個可能的單詞的列表。在猜測並知道哪些字母在神秘的單詞中出現和沒有出現之後, grep 和 fgrep 幫助將選項縮小到1200個單詞,然後只剩下7個單詞。這就是命令行的威力。


翻譯:starstary
參考資料:Solve Wordle using the Linux command line

對這篇文章感覺如何?

太棒了
2
不錯
0
愛死了
0
不太好
0
感覺很糟
0

You may also like

Leave a reply

您的電子郵箱地址不會被公開。 必填項已用 * 標註

此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

More in:開源學村

開源學村

SoCal Linux博覽會回歸20周年

現在已經是支持和推廣FOSS社區的第20個年頭了,SCaLE 20x - 南加州Linux博覽會將於2023年3月9日至12日在帕薩迪納會議中心舉行。 這個為期4天的年度活動彙集了充滿活力的開源用戶社 […]
開源學村

如何在Linux上殺死殭屍進程

消滅殭屍進程! 也稱為「defunct」或「dead」進程 - 簡單來說,殭屍進程是指已經結束,但仍存在於系統進程表中的進程。理想情況下,一旦進程完成其工作/執行,它應該從進程表中清除。但由於某些原因 […]
開源學村

2022年,從學習Rust開始

Rust作為一個新語言,已經連續五年(2016,2017,2018,2019,2020)在Stack Overflow開發者調查的「最受喜愛編程語言」。Rust是一個值得學習的編程語言,它對安全的專註,會幫助你許多。學習Rust 從這本小小的Rust Cheat Sheet出發,了解Rust語言的基本操作。
開源學村

如何殺死 Linux 中的殭屍進程

在使用操作系統工作時,要時刻注意保持對系統中進程的掌控。一旦殭屍進程佔滿了你的資源,就只能依靠重新啟動來挽回一切了。所以快來學慣用 kill 指令來殺滅殭屍進程吧!