We use cookies to ensure you have the best browsing experience on our website. Please read our cookie policy for more information about how we use cookies.
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 ()
Cookie support is required to access HackerRank
Seems like cookies are disabled on this browser, please enable them to open this website
Functions or Not?
You are viewing a single comment's thread. Return to all 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 ()