-
Notifications
You must be signed in to change notification settings - Fork 0
/
day06.hs
25 lines (21 loc) · 831 Bytes
/
day06.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
data Race = Race {time :: Int, distance :: Int} deriving (Show)
main :: IO ()
main = do
[_ : time', _ : distance'] <- map words . lines <$> readFile "day06.in"
let races = zipWith (\t d -> Race {time = read t, distance = read d}) time' distance'
let bigRace = Race {time = read $ concat time', distance = read $ concat distance'}
putStr "Q1: "
print . product . map race $ races
putStr "Q2: "
print $ race bigRace
-- we need (T - a) * a > D or a^2 - T*a + D < 0 i.e, a quadratic inequality
race :: Race -> Int
race Race {time, distance} =
let (x, y) = roots
in ceiling (x - 1) - floor (y + 1) + 1
where
-- roots
roots :: (Double, Double)
roots =
let disc = fromIntegral $ time * time - 4 * distance
in ((fromIntegral time + sqrt disc) / 2, (fromIntegral time - sqrt disc) / 2)