Wordleコマンド作成

Wordle Command

2022.05.26

自作コマンドを作ってみたい。 ということでwordleコマンドを作ってみた。

少し前に流行ったwordleですが毎回結構な時間を費やしてしまうので(そこが醍醐味なのですが)wordle用のコマンドを作ったので紹介します。

wordleのルール

ご存知の方も多いと思いますがwordleは1日1回更新される5文字の英単語を当てるゲームです。 チャンスは6回で文字が黄色になるとその文字が正解の単語に含まれており、緑だと文字と場所が正解の単語と同じであることを示しています。

作りたいコマンド

wordle example1

例えば上のような写真で"YOUNG"と入力した後、正解の単語にはyが含まれており、2文字目が"O"であることがわかります。 そこで

undefined
$ wordle -y y -2 o -e ung

とすると候補となる、yが含まれていて2文字目がOの5文字の単語がリストアップされるwordleコマンドを作ります。yはyellowの略、-2は2文字目, -eはexcludeのを表しています。

手順

OS: MacOS コマンドを作る前に単語を推測する過程を見ていきます。

  1. ~/../../usr/share/dict/words に単語リストがあるのでここから検索します。wordleの出題範囲と完全に一致するわけではないのですが、ここに載っていない単語から出題されることはほとんどありません。(といっても実際に出題されることは割とあります。その時は諦めましょう。) wordleのソースコードをdev toolで確認すると出題範囲のリストが見えるのでそれをコピペしてファイルを作ってもいいのですが、面倒だったのでやっていません。

  2. 単語リストから5文字の単語を抜き出す

undefined
$ cat ~/../../usr/share/dict/words | grep ^.....$

grepでは正規表現も扱えるので簡単に5文字の単語を抜き出すことができます。 '^'が文字列の始まり、'$'が文字列の終わり、'.'が1文字のワイルドカードを表します。

  1. grep -v

grepでは-vオプションで除外指定が出来ます。上の例ではUNGが正解の単語に含まれていないことがわかっているのでこれまでの操作をあわせて

undefined
$ cat ~/../../usr/share/dict/words | grep ^.....$ | grep y |\
 grep ^.o...$ | grep -v u | grep -v n | grep -v g

とすると候補の単語がリストアップされます。

以上の手順をまとめると以下のようになります。

undefined
#!/bin/sh

DICT=$(cat -e $HOME/../../usr/share/dict/words | grep ^.....\\$ | sed -e 's/\$/\$\\n/g')

function firstChar() {
  DICT=$(echo ${DICT} | grep $1....\\$ | sed -e 's/\$/\$\\n/g')
}

function secondChar() {
  DICT=$(echo ${DICT} | grep $1...\\$ | sed -e 's/\$/\$\\n/g')
}

function thirdChar() {
  DICT=$(echo ${DICT} | grep $1..\\$ | sed -e 's/\$/\$\\n/g')
}

function fourthChar() {
  DICT=$(echo ${DICT} | grep $1.\\$ | sed -e 's/\$/\$\\n/g')
}

function fifthChar() {
  DICT=$(echo ${DICT} | grep $1\\$ | sed -e 's/\$/\$\\n/g')
}

function yellowChars() {
  for (( i=0; i<${#1}; i++ )); do
    yellowChar ${1:$i:1}
  done
}

function yellowChar() {
  DICT=$(echo ${DICT} | grep $1 | sed -e 's/\$/\$\\n/g')
}

function excludeChar() {
  DICT=$(echo ${DICT} | grep -v $1 | sed -e 's/\$/\$\\n/g')
}

function excludeChars() {
  for (( i=0; i<${#1}; i++ )); do
    excludeChar ${1:$i:1}
  done
}

while getopts "1:2:3:4:5:y:e:" optKey; do
  case "$optKey" in
    1)
      firstChar ${OPTARG}
      ;;
    2)
      secondChar ${OPTARG}
      ;;
    3)
      thirdChar ${OPTARG}
      ;;
    4)
      fourthChar ${OPTARG}
      ;;
    5)
      fifthChar ${OPTARG}
      ;;
    y)
      yellowChars ${OPTARG}
      ;;
    e)
      excludeChars ${OPTARG}
      ;;
  esac
done

echo ${DICT} | sed -e 's/\$//g'

このファイルを~/command/wordleに保存

undefined
export PATH = $HOME/command:$PATH

でpathを通し

undefined
$chmod 777 ~/command/wordle

とするとwordleコマンドが使えるようになります。

普段習慣的に行う処理をコマンド化していくと効率が上がるかもしれませんね。