短期大学部・総合文化学科 │ 聖徳大学

Wordleパズル

22.03.24

短大オープンキャンパス4/2(土)13時~15時にあります!ご予約はコチラ
———————————————————————————————————————————

Wordleというパズルを知っていますか?

2021年10月に公開されたWebで遊べるパズルです。

6回の推測の間に5文字の英単語を当てるというものです。
推測のたびに正解とどれだけ近いかがタイルの色で示されます。
タイルの色が
– 緑なら、正解のその位置にその文字がある
– 黄(橙)なら、正解のその位置以外の場所にその文字がある
– 黒(暗い灰色)なら、正解にはその文字は含まれていない
ということです。

以下は典型的な例です。

Wordleの典型的なスクリーンショット

Wikipediaによると
作者は2021年12月が、絵文字の正方形をコピーすることでユーザーがその日の結果をTwitterで広く共有できる(ネタバレにならないよう文字の情報はコピーされない)機能追加したことで、広く注目を浴びるようになったようです。
筆者も12月にtwitterのTLで見かけるようになって、ハマったひとりです。また、一日一題しか公開されないので、日付がかわるのをワクワクして待つというのも多くのファンを獲得した要因でしょうね。

ひらがなバージョンとか、四則演算バージョンなど派生ゲームがいくつも公開されています。派生版のなかでも、かなり趣が違っていて楽しいのは、世界の国や地域のシルエットから国名や地域名を当てるWorldleです。こちらはネタが単語よりずっと少いので、遊ぶなら今のうちかもしれません。Google map を見ながら楽しめます。

さて、元々プライベートで遊ぶために作られた本家 Wordle は、2022年1月にはニューヨークタイムズ社が数億円と推測される非公開価格でこのゲームを買収したようです。夢がありますねぇ。いまのところ無料であそべますので、ぜひ辞書片手に遊んでみましょう。

英語のボキャブラリーがないとちょっと辛いので、チートプログラムを作ってみました。もちろん、純粋にパズルを楽しみたい人向きではありません。ちょっとズルをしてでも遊びたい人向きです。

最初に arose と予測して、それに対するWordleの応答が、黒黄黒黄緑 だったら

>>> worlde
? arose bybyg
serge
serve
shire
spire
spree
surge
? |

のように次の候補一覧がでるように作ってみました。

module Wordle
    where

import Control.Monad.IO.Class
import Data.Bool
import Data.Char
import System.Console.Haskeline

dict5 :: IO [String]
dict5 = filter (all isAscii) . filter (all isLower)
      . filter ((5 ==) . length) . words  readFile "/usr/share/dict/words"

wordle :: IO ()
wordle = runInputT defaultSettings . loop =< InputT IO ()
        loop ws = do 
            minput  return ()
                Just ":q"  -> return ()
                Just input -> do
                    let ws' = case words input of
                            guess:pat:_ -> buildFilter guess pat ws
                    liftIO $ putStr $ unlines ws'
                    loop ws'

matchPat :: String -> String -> String
matchPat guess str
    = case zipWith phi guess str of
        str1 -> zipWith (psi str1) guess str1
    where
        phi x y = bool y ' ' (x == y)
        psi zs x y
            | y == ' '     = 'g'
            | x `elem` zs  = 'y'
            | otherwise    = 'b'

buildFilter :: String -> String -> [String] -> [String]
buildFilter _     ""  = id
buildFilter guess pat = filter p
    where
        p w = pat == matchPat guess w
PAGE TOP