• + 0 comments

    My ugly haskell code...

    getIntOnLine :: IO Int getIntOnLine = getLine >>= (\s -> return (read s :: Int))

    getEntryAmount :: IO Int getEntryAmount = getIntOnLine

    getTupleAmount :: Int -> IO [(Int, Int)] getTupleAmount x | x == 0 = return [] | x > 0 = getIntOnLine >>= (getTuples x) >>= (printResult x) >>= getTupleAmount

    checkSingleItem :: [(Int, Int)] -> [(Int, Int)] -> Bool checkSingleItem part whole = case part of [] -> True ((a,_):rest) -> (areAllTuplesEqual $ filter ((== a) .fst) whole) && (checkSingleItem rest whole)

    containsSingleElem :: [(Int, Int)] -> Bool containsSingleElem x = do let result = checkSingleItem x x result

    areAllTuplesEqual :: Eq a => [(a, a)] -> Bool areAllTuplesEqual [] = True -- An empty list trivially has all tuples "equal" areAllTuplesEqual (x:xs) = all (== x) xs

    printResult :: Int -> [(Int, Int)] -> IO Int printResult x y = do let z = (containsSingleElem y) if z then putStrLn "YES" else putStrLn "NO" return (x - 1)

    getTuples :: Int -> Int -> IO [(Int, Int)] getTuples x y | y > 0 = do z <- getLine let v = (map (\m -> read m :: Int) (words z)) let b = (case v of [u, i] -> (u, i) _ -> (-1, -1)) let s = (do r <- (getTuples x (y - 1)) return ([b] ++ r)) s | y == 0 = return []

    main :: IO () main = do getEntryAmount >>= getTupleAmount return ()