Wordle comparison: Difference between revisions

→‎{{header|Haskell}}: Added a version in Haskell.
(Add Tailspin solution)
(→‎{{header|Haskell}}: Added a version in Haskell.)
Line 145:
ROBIN v ROBIN => [2 2 2 2 2] => [green green green green green]
</pre>
 
=={{header|Haskell}}==
<lang haskell>import Data.List (intercalate, mapAccumL)
import qualified Data.Map.Strict as M
import Data.Maybe (fromMaybe)
 
type Tally = M.Map Char Int
 
-------------------- WORDLE COMPARISON -------------------
 
wordleScore :: String -> String -> [Int]
wordleScore target guess =
let (residue, matches) =
mapAccumL green [] (zip target guess)
in snd $
mapAccumL
amber
(charCounts residue)
(zip matches guess)
 
green :: String -> (Char, Char) -> (String, Int)
green residue (t, g)
| t == g = (residue, 2)
| otherwise = (t : residue, 0)
 
amber :: Tally -> (Int, Char) -> (Tally, Int)
amber tally (2, _) = (tally, 2)
amber tally (_, c)
| 0 < fromMaybe 0 (M.lookup c tally) =
(M.adjust pred c tally, 1)
| otherwise = (tally, 0)
 
charCounts :: String -> Tally
charCounts =
foldr
(flip (M.insertWith (+)) 1)
M.empty
 
--------------------------- TEST -------------------------
main :: IO ()
main = do
putStrLn $ intercalate " -> " ["Target", "Guess", "Score"]
putStrLn []
mapM_ (either putStrLn putStrLn) $
uncurry wordleReport
<$> [ ("ALLOW", "LOLLY"),
("CHANT", "LATTE"),
("ROBIN", "ALERT"),
("ROBIN", "SONIC"),
("ROBIN", "ROBIN"),
("BULLY", "LOLLY"),
("ADAPT", "SÅLÅD"),
("Ukraine", "Ukraíne"),
("BBAAB", "BBBBBAA"),
("BBAABBB", "AABBBAA")
]
 
wordleReport :: String -> String -> Either String String
wordleReport target guess
| 5 /= length target =
Left (target <> ": Expected 5 character target.")
| 5 /= length guess =
Left (guess <> ": Expected 5 character guess.")
| otherwise =
Right
( intercalate
" -> "
[ target,
guess,
unwords (color <$> wordleScore target guess)
]
)
 
color 2 = "green"
color 1 = "amber"
color _ = "gray"</lang>
{{Out}}
<pre>Target -> Guess -> Score
 
ALLOW -> LOLLY -> amber amber green gray gray
CHANT -> LATTE -> gray amber amber gray gray
ROBIN -> ALERT -> gray gray gray amber gray
ROBIN -> SONIC -> gray green amber green gray
ROBIN -> ROBIN -> green green green green green
BULLY -> LOLLY -> gray gray green green green
ADAPT -> SÅLÅD -> gray gray gray gray amber
Ukraine: Expected 5 character target.
BBBBBAA: Expected 5 character guess.
BBAABBB: Expected 5 character target.</pre>
 
=={{header|J}}==
9,655

edits