Wordleパズル
22.03.24
※短大オープンキャンパスが4/2(土)13時~15時にあります!ご予約はコチラ。
———————————————————————————————————————————
Wordleというパズルを知っていますか?
2021年10月に公開されたWebで遊べるパズルです。
6回の推測の間に5文字の英単語を当てるというものです。
推測のたびに正解とどれだけ近いかがタイルの色で示されます。
タイルの色が
– 緑なら、正解のその位置にその文字がある
– 黄(橙)なら、正解のその位置以外の場所にその文字がある
– 黒(暗い灰色)なら、正解にはその文字は含まれていない
ということです。
以下は典型的な例です。
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