Wordle comparison: Difference between revisions
Content added Content deleted
(Add Tailspin solution) |
(→{{header|Haskell}}: Added a version in Haskell.) |
||
Line 145: | Line 145: | ||
ROBIN v ROBIN => [2 2 2 2 2] => [green green green green green] |
ROBIN v ROBIN => [2 2 2 2 2] => [green green green green green] |
||
</pre> |
</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}}== |
=={{header|J}}== |