module Commons where import Data.List.Utils (split) data Race = Race { time :: Int, distance :: Int } deriving Show parseRaces :: [Int] -> [Int] -> [Race] parseRaces (th: tt) (dh: dt) = Race {time = th, distance = dh}: parseRaces tt dt parseRaces [] [] = [] parseTimes :: [String] -> [Int] parseTimes (('T': _): t) = parseTimes t parseTimes ([]: t) = parseTimes t parseTimes (h: t) = read h: parseTimes t parseTimes [] = [] parseDistances :: [String] -> [Int] parseDistances (('D': _): t) = parseDistances t parseDistances ([]: t) = parseDistances t parseDistances (h: t) = read h: parseDistances t parseDistances [] = [] parse :: IO [Race] parse = do rawTimes <- getLine let times = parseTimes $ split " " rawTimes rawDistances <- getLine let distances = parseDistances $ split " " rawDistances return $ parseRaces times distances getDistance :: Int -> Int -> Int getDistance holdTime totalTime = (totalTime - holdTime) * holdTime getMinimalHoldTime :: Race -> Int -> Int getMinimalHoldTime race holdTime | getDistance holdTime (time race) > distance race = holdTime | otherwise = getMinimalHoldTime race (holdTime + 1) getRaceRange :: Race -> Int getRaceRange race = time race + 1 - 2 * getMinimalHoldTime race 0