42 lines
1.3 KiB
Haskell
42 lines
1.3 KiB
Haskell
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
|