import Control.Monad import System.IO import Data.List perms = do n1 <- [0..9] n2 <- [0..9] \\ [n1] n3 <- [0..9] \\ [n1,n2] n4 <- [0..9] \\ [n1,n2,n3] return [n1,n2,n3,n4] next h b (ns@[n1,n2,n3,n4]:ps) = do cand <- ps guard (length (filter id (zipWith (==) ns cand)) == h) guard (length (intersect ns cand) == h+b) return cand main = main' perms where main' ps = do putStrLn (unwords (map show (head ps))) hFlush stdout [h,b] <- map read . words <$> getLine unless (h == 4) (main' (next h b ps))