set-cover-0.1: example/Mastermind/Example.hs
module Mastermind.Example where
import Mastermind.Guess (
countEval,
defaultAssignFlags,
AssignFlag(UniqueSymbol),
AssignFlags,
EvalSumm(EvalSumm),
)
import qualified Control.Monad.Trans.State as MS
import qualified Data.EnumSet as EnumSet
import Data.Tuple.HT (mapSnd)
data T a =
Cons {
flags_ :: AssignFlags,
width_ :: Int,
alphabet_ :: [a],
guesses_ :: [([a], EvalSumm)]
}
consDup, consUnique :: [a] -> [([a], EvalSumm)] -> T a
consDup set guesses =
let width = maximum $ map (length . fst) guesses
in Cons defaultAssignFlags width set guesses
consUnique set guesses =
case consDup set guesses of
ex -> ex {flags_ = EnumSet.insert UniqueSymbol $ flags_ ex}
apply ::
(AssignFlags -> Int -> [a] -> [([a], EvalSumm)] -> b) -> T a -> b
apply f (Cons flags width set guesses) = f flags width set guesses
cover :: T Char
cover =
consDup ['a'..'z'] $
("prxyt", EvalSumm 0 1) :
("smbjy", EvalSumm 0 0) :
("krpcu", EvalSumm 0 2) :
("ccxlz", EvalSumm 1 0) :
("rltxk", EvalSumm 0 1) :
("epakz", EvalSumm 0 1) :
("acivr", EvalSumm 1 2) :
("cqqar", EvalSumm 2 0) :
("cfver", EvalSumm 4 0) :
("wnhgd", EvalSumm 0 0) :
[]
coverContra :: T Char
coverContra =
cover{
guesses_ = ("ocver", EvalSumm 3 0) : guesses_ cover
}
cafe :: T Char
cafe =
consUnique ['a'..'f'] $
("cbad", EvalSumm 1 1) :
("fbec", EvalSumm 0 3) :
("beaf", EvalSumm 0 3) :
[]
master :: T Char
master =
consDup ['a'..'z'] $
map (mapSnd (MS.evalState countEval)) $
("aaaayw", "x") :
("bbbdcw", "") :
("eefeym", "oo") :
("iuzamf", "oo") :
("gvarfe", "ooo") :
("paqfes", "xxo") :
("vamsej", "ooxx") :
("amgses", "ooox") :
("majgep", "xxx") :
[]
haskell :: T Char
haskell =
consDup ['a'..'z'] $
map (mapSnd (MS.evalState countEval)) $
("dkryqnx", "o") :
("dcyuyjj", "") :
("bxfbrsf", "o") :
("hgqmihi", "x") :
("itkwkkm", "o") :
("ixzrlkk", "oo") :
("kgslggl", "xxoo") :
("ggglvxw", "o") :
("llskehl", "xxxxoo") :
[]
no00, no01, no02, no03, no04 :: T Char
no00 =
consDup ['a'..'f'] $
("adab", EvalSumm 0 0) :
[]
no01 =
consDup ['a'..'c'] $
("aaab", EvalSumm 1 1) :
[]
no02 =
consDup ['a'..'f'] $
("ffce", EvalSumm 1 2) :
("dade", EvalSumm 2 0) :
("dcfe", EvalSumm 2 1) :
[]
no03 = consDup ['a'..'c'] [("ab", EvalSumm 1 0)]
no04 = consDup ['a'..'c'] [("ab", EvalSumm 1 1)]