import Data.List (findIndices) tf :: [[Int] -> Bool] -> [[Int]] tf = traverse (const [1, 0]) wrongness :: [Int] -> [[Int] -> Bool] -> [Int] wrongness ns ps = findIndices id (zipWith (/=) ns (map (fromEnum . ($ ns)) ps)) statements :: [[Int] -> Bool] statements = [ (== 12) . length , 3 ⊂ [length statements - 6 ..] , 2 ⊂ [1,3 ..] , 4 → [4 .. 6] , 0 ⊂ [1 .. 3] , 4 ⊂ [0,2 ..] , 1 ⊂ [1, 2] , 6 → [4 .. 6] , 3 ⊂ [0 .. 5] , 2 ⊂ [10, 11] , 1 ⊂ [6, 7, 8] , 4 ⊂ [0 .. 10] ] where (⊂), (→) :: Int -> [Int] -> [Int] -> Bool (s ⊂ x) b = s == (sum . map (b !!) . takeWhile (< length b)) x (a → x) b = (b !! a == 0) || all ((== 1) . (b !!)) x testall :: [[Int] -> Bool] -> Int -> [([Int], [Int])] testall s n = [ (b, w) | b <- tf s , w <- [wrongness b s] , length w == n ] main :: IO () main = let t = testall statements in do putStrLn "Answer" mapM_ print $ t 0 putStrLn "Near misses" mapM_ print $ t 1