私は最近、ランダムな5文字の単語を6回推測するオンラインワードパズルゲームに少し夢中になっています。言葉は毎日変わり、1日1回しかプレイできません。各推測の後、推測の各文字が強調表示されます。灰色は文字が謎の単語に表示されないことを意味し、黄色は文字が単語に表示されるがその位置には表示されないことを意味し、緑色は文字が単語に表示されることを意味します。その正しい位置。
その他のLinuxリソース
- Linuxコマンドのチートシート
- 高度なLinuxコマンドのチートシート
- 無料のオンラインコース:RHELの技術概要
- Linuxネットワーキングのチートシート
- SELinuxチートシート
- Linuxの一般的なコマンドのチートシート
- Linuxコンテナとは何ですか?
- 最新のLinux記事
Linuxコマンドラインを使用して、Wordleのような推測ゲームをプレイする方法は次のとおりです。この方法を使用して、1月6日のパズルを解きました:
最初の試行
Linuxシステムは、単語の辞書を/usr/share/dict/words
に保持します。 ファイル。これは非常に長いプレーンテキストファイルです。私のシステムの単語ファイルには、479,800を超えるエントリが含まれています。このファイルには、わかりやすい単語と適切な名詞(名前、場所など)の両方が含まれています。
私の最初の推測を始めるために、私はちょうど5文字の長さの普通の単語のリストが欲しいだけです。そのために、このgrep
を使用します コマンド:
$ grep '^[a-z][a-z][a-z][a-z][a-z]$' /usr/share/dict/words > myguess
grep
コマンドは正規表現を使用して検索を実行します。正規表現で多くのことができますが、Wordleを解決するために必要なのは、基本的な^
だけです。 行の先頭を意味し、$
行の終わりを意味します。その間に、[a-z]
の5つのインスタンスを指定しました 、aからzまでの小文字を示します。
wc
も使用できます 可能な単語のリストを表示するコマンドは「たった」15,000語です:
$ wc -l myguess
15034 myguess
そのリストから、ランダムな5文字の単語を選びました:エーカー 。 a は黄色に設定されました。これは、文字が謎の単語のどこかに存在するが、最初の位置には存在しないことを意味します。他の文字は灰色なので、その日の言葉には存在しないことを私は知っています。
2回目の試行
次の推測では、 aを含むすべての単語のリストを取得したいと思います。 、ただし最初の位置ではありません。私のリストにはcの文字も含めないでください 、 r 、 e 、または s 。これをステップに分けてみましょう:
aが付いたすべての単語のリストを取得するには、fgrep
を使用します。 (固定文字列grep)コマンド。 fgrep
コマンドは、grep
のようなテキストも検索します 、ただし正規表現は使用しません:
$ fgrep a myguess > myguess2
これにより、次の推測のリストが15,000語から6,600語に減ります。
$ wc -l myguess myguess2
15034 myguess
6634 myguess2
21668 total
ただし、その単語のリストには、 aという文字も含まれています。 私が望まない最初の位置に。ゲームはすでにaの文字を示しています 他の位置に存在します。 grep
を使用してコマンドを変更できます 最初の位置に他の文字を含む単語を探す。それは私の可能な推測をたった5,500語に狭めます:
$ 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
コマンド、次の推測をかなり絞り込んで、最初の位置ではなくどこかにある可能性のある1,200語のみに絞り込みました。これには、 cが含まれていません。 、 r 、 e 、または s 。
リストを見た後、 balmyという単語を試してみることにしました。 。
3回目の試行
今回は、 bの文字 およびa 緑色で強調表示されています。これは、これらの文字が正しい位置にあることを意味します。手紙l 黄色だったので、その文字は単語のどこかに存在しますが、その位置には存在しません。文字m およびy 灰色なので、次の推測からそれらを排除できます。
考えられる単語の次のリストを特定するために、別のgrep
のセットを使用できます。 コマンド。単語がbaで始まることを知っています 、そこで検索を開始できます:
$ grep '^ba' myguess2 > myguess3
$ wc -l myguess3
77 myguess3
たった77語です! l という文字も含む単語を探すことで、さらに絞り込むことができます。 3番目の位置以外の場所:
$ grep '^ba[^l]' myguess2 > myguess3
$ wc -l myguess3
61 myguess3
^
角かっこ内 [^l]
この文字のリストではないことを意味するので、 lの文字ではありません 。これで、考えられる単語のリストが61になりますが、すべてに lという文字が含まれているわけではありません。 、別のgrep
を使用して削除できます 検索:
$ grep '^ba[^l]' myguess2 | fgrep l > myguess3
$ wc -l myguess3
10 myguess3
これらの単語の一部には、 mという文字が含まれている場合があります。 およびy 、今日の謎の言葉にはありません。もう1つの反転した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
その日の15,000の可能な単語のリストを特定するのに役立ちました。謎の単語に登場する文字と登場しない文字を推測して知った後、grep
およびfgrep
オプションを1,200語に絞り、次に7語に絞り込むのに役立ちました。それがコマンドラインの力です。