我一直在研究 Wordle 應用程序,在我看來它非常容易複製。我正在自學 shell 腳本編程,所以想知道是否有一種方法可以在 Linux 中為命令行創建一個 wordle?
Wordle 從第一個版本開始就非常智能,至少其一是易上手難精通。由於它每天只有一個單詞拼圖,因此它也是一款完美的休閒遊戲,適合移動設備在上學、工作的路上,甚至躺在床上慢慢醒來。六種猜測。五個字母。它會顯示您是否在正確的位置猜測了一個字母,一個在單詞中但不在第一個位置的字母,以及您猜測的單詞中缺少的任何字母。
真正起作用的另一個方面好吧,在社交媒體上與朋友分享您的結果真的很容易。當然,不玩 Wordle 的朋友不會有興趣,但是嘿,那些會玩的朋友可以很容易地將他們的猜數與你的猜數進行比較,而你只需猜幾下就能猜出單詞的日子真好!由於沒有線索,這肯定很難,因為英語詞典中有成千上萬的 5 個字母的單詞。
不過,如果您可以對其進行編碼,您也可以將其編碼為 shell 腳本,儘管它可能不是最高效或優雅的(特別是與簡單有效的相比移動應用程序的設計)。讓我們深入了解如何將 Wordle 重新創建為 Linux 和 MacOS shell 腳本。
第 1 步:從字典中選擇一個單詞
各種 Linux 發行版都包含字典,但它們通常包括數百個非常晦澀的單詞,這些單詞甚至不會出現在標準英語詞典中。如果提示您輸入從未聽說過的單詞,遊戲就沒有樂趣,對嗎?幸運的是,Web 出現了,並且有一個很好的文本文件,其中包含大約 5,000 個 5 個字母的英語單詞,您可以直接從網上獲取
https://www-cs-faculty.stanford.edu/~knuth/sgb-words.txt
抓取並保存為“5-letter-words.txt”。然後定義一個變量,以便我們將來可以將其稱為“dict”:
dict=”5-letter-words.txt”。
現在讓我們進入第一個有趣的編碼部分:選擇一個來自文本文件的隨機詞。這可以通過計算文件中的行數來完成,然後使用 shell 中的內置 $RANDOM 變量生成一個隨機的 2**32 整數,向下修改為 0 到行數 – 1 之間:
# 1. 從列表中選擇一個詞 lines=”$(wc-l < $dict)"randomchoice="$(( $RANDOM % $lines ))"word="$(head-n $randomchoice $dict | tail-1)"
希望你已經清楚了,使用 $randomchoice 記住我們想要的那一行,然後 head|tail 從字典中取出那一行。結果是 $word 是要猜測的詞。
現在,既然有了它,讓我們把它分成五個單字母變量。有很多方法可以做到這一點,但我將在子 shell 方法中使用一個簡單的 cut:
w1=”$(echo $word | cut-c1)”; w2=”$(echo $word | cut-c2)”w3=”$(echo $word | cut-c3)”; w4=”$(echo $word | cut-c4)”w5=”$(echo $word | cut-c5)”
一步到位。 $word 包含要猜測的單詞,$w1 到 $w5 包含構成該單詞的五個字母。
第 2 步:提示用戶猜測
第二步是創建一個循環,並在其中提示用戶進行猜測。輕鬆完成:
直到 [ 0-eq 1 ] ; do echo”\nGuess: \c”read answer more code will go here done
我們的其餘代碼(除了稍後會出現的函數)將隱藏在“read answer”之後但之前’完畢’。在處理猜測的同時,讓我們也將其分解為五個連續變量:
a1=”$(echo $answer | cut-c1)”; a2=”$(echo $answer | cut-c2)”a3=”$(echo $answer | cut-c3)”; a4=”$(echo $answer | cut-c4)”a5=”$(echo $answer | cut-c5)”
你總是可以用 ${varname:x:y} 符號對變量進行切片,但是為了清楚起見,我更喜歡單獨的變量。
第 3 步:根據字典檢查猜測
由於 Wordle 規則之一是您的猜測必須是正確的英語單詞,我們需要也要檢查一下。事實證明這非常簡單……
if [“$(grep-E”^$answer\$”$dict)”=””] ; then # 答案在字典裡嗎?沒有的話就不評價了? echo”你的猜測不在我的字典裡。”else
我將其格式化為條件,因為它是我們將應用的眾多測試之一……
第 4 步:將每個字母與目標進行比較
下一步,也是迄今為止最複雜的,是不僅針對目標詞中的相同字母槽,而且針對該詞中的所有字母來測試用戶猜測的每個字母。為了實現這一點,我將創建一個 shell 函數:
lettercheck() { # answer-letter lettercount # 所有的答案字母都已經在 w1 w2 etc # returns value in”$returnchar”if [“$1″=”$(eval echo \$w$2)”] ;然後 # 字母在正確的位置猜對了! returnchar=”$(echo $1 | tr”[:lower:]””[:upper:]”)”elif [“$(echo $word | grep”$1″)”!=””] ; then # 字母存在,錯誤點(需要細化) returnchar=”$1″else # 單詞中不存在字母 returnchar=”-“fi }
由於您可以將變量傳遞給 shell 中的函數,它將被調用第一個參數是猜到的字母,第二個參數是序數槽(換句話說,如果我猜到“carom”,那麼字母 3 將是“r”,這將是我猜中的第 3 個字母。
因為我不能改變猜出的字母的顏色,所以我使用的符號是用音譯為大寫的字母回顯猜測意味著它是正確位置的正確字母,如果它是小寫那麼它就是正確的字母錯誤的地方,如果它只是一個“-”,那麼它就是一個不存在的字母。你能看到上面的代碼是如何顯示的嗎?
第 5 步:使用 LETTERCHECK 評估猜測
函數編寫完成後,就該使用它了,下面是我的做法:
echo”Result of your guess: \c”lettercheck”$a1″1 ; echo”$retur nchar \c”字母檢查”$a2″2 ; echo”$returnchar \c”lettercheck”$a3″3 ; echo”$returnchar \c”lettercheck”$a4″4 ; echo”$returnchar \c”lettercheck”$a5″5 ; echo”$returnchar”
我利用 echo 中的 \c 表示法使其不包含回車符,從而允許腳本逐個字母地構建輸出行。方便!
將所有內容放在一起
在我向您展示所有帶有循環的代碼之前,讓我們看一下輸出,一個快速的 SHWORDLE 遊戲:
$ sh shwordle.sh 猜:鳥 你猜的結果:—-S 猜:鯉魚 你的猜結果:-a–S猜測:reels 您的猜測結果:-E e L S 猜測:zeals 您猜對了:ZEALS!幹得好。
我作弊是因為我事先知道這個詞,但你可以看到這很難,但是當你記住大寫字母表示正確的字母、正確的槽位,小寫字母表示正確的字母、錯誤的槽位時,它就完美地工作了。好吧,不完全是,但我會回到那個。
現在,這是整個腳本,逐行,包括註釋:
#!/bin/sh # SHWORDLE-複製 Dave Taylor 編寫的 Wordle 猜詞遊戲的功能。仍然有一些錯誤需要解決。 dict=”/Users/taylor/bin/5-letter-words.txt”lettercheck() { # answer-letter lettercount # 所有答案字母已經在 w1 w2 etc # 返回值在”$returnchar”if [“$1″=”$(eval echo \$w$2)”] ;然後 # 字母在正確的位置猜對了! returnchar=”$(echo $1 | tr”[:lower:]””[:upper:]”)”elif [“$(echo $word | grep”$1″)”!=””] ; then # 字母存在,錯誤的地方(需要細化) returnchar=”$1″else # 單詞中不存在字母 returnchar=”-“fi } # 1. 從列表中選擇一個單詞 lines=”$(wc-l < $dict )"randomchoice="$(( $RANDOM % $lines ))"word="$(head-n $randomchoice $dict | tail-1)"w1="$(echo $word | cut-c1)"; w2="$(echo $word | cut-c2)"w3="$(echo $word | cut-c3)"; w4="$(echo $word | cut-c4)"w5="$(echo $word | cut-c5)"# 這是一個作弊: echo"--$word--$w1 $w2 $w3 $w4 $ w5"# 2. 循環提示用戶猜測。直到 [ 0-eq 1 ] ; do echo"\nGuess: \c"read answer #3. break guessed word into letters a1="$(echo $answer | cut-c1)"; a2="$(echo $answer | cut-c2)"a3="$(echo $answer | cut-c3)"; a4="$(echo $answer | cut-c4)"a5="$(echo $answer | cut-c5)"if ["$answer"="$word"] ;然後#明白了!幹得好 echo “你猜對了:$(echo $word | tr'[:lower:]''[:upper:]')!幹得好。”退出 0 elif ["$answer"="quit"-o"$answer"=""] ; then # escape the infinite loop echo"The word was $(echo $word | tr'[:lower:]''[:upper:]'). 下次見。"exit 0 else # 評估猜測 if ["$(grep-E"^$answer\$"$dict)"=""] ;然後 # 4. 答案在字典裡嗎?沒有的話就不評價了? echo"你的猜測不在我的字典裡。"else # 5. 評估並輸出結果: echo"Result of your guess: \c"lettercheck"$a1"1 ; echo"$returnchar \c"lettercheck"$a2"2 ; echo"$returnchar \c"lettercheck"$a3"3 ; echo"$returnchar \c"lettercheck"$a4"4 ; echo"$returnchar \c"lettercheck"$a5"5 ; echo"$returnchar"fi fi done exit 0
那麼哪裡不對勁呢?當您在一個單詞中有重複的字母時,就會出現主要的功能問題。如果您仔細查看 lettercheck 代碼,您會發現如果單詞是 zeals 並且我猜是 bossy,那麼兩個“s”字母都將顯示為匹配最後一個單詞中的一個字母,即使只有第一個應該匹配。然而,這個錯誤,我會留給你解決,並記住它可能發生在猜測或目標單詞中的重複字母。否則,這應該會讓您在為 Linux 命令行創建 Wordle 方面搶占先機。玩得開心!
專業提示:自操作系統出現以來,我一直在撰寫有關 Linux 的文章,在此之前是 Unix。請在訪問時查看我的廣泛的 Linux 幫助區域和 Linux shell 腳本編程區域,以獲取許多其他教程內容。謝謝!
wordle for linux,wordle程序