day9
This commit is contained in:
parent
23e44f9515
commit
643296c382
40
day9.hs
Normal file
40
day9.hs
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
raw <- readFile "day9.txt"
|
||||||
|
let nums = (map read $ lines raw) :: [Int]
|
||||||
|
ansA = solveA nums
|
||||||
|
ansB = solveB ansA nums
|
||||||
|
in do
|
||||||
|
putStrLn $ "day9a: " ++ (show ansA)
|
||||||
|
putStrLn $ "day9b: " ++ (show ansB)
|
||||||
|
|
||||||
|
solveA :: [Int] -> Int
|
||||||
|
solveA nums = runWindow' (take 25 nums) (drop 25 nums)
|
||||||
|
|
||||||
|
solveB :: Int -> [Int] -> Int
|
||||||
|
solveB t nums = (maximum ans) + (minimum ans)
|
||||||
|
where
|
||||||
|
ans = testRuns t nums
|
||||||
|
|
||||||
|
runWindow' :: [Int] -> [Int] -> Int
|
||||||
|
runWindow' _ [] = error "reached end of stream"
|
||||||
|
runWindow' win (n:ns) =
|
||||||
|
if n `elem` ws
|
||||||
|
then runWindow' ((tail win) ++ [n]) ns
|
||||||
|
else n
|
||||||
|
where
|
||||||
|
ws = [ x+y | x <- ls, y <- ls, x /= y ]
|
||||||
|
ls = filter (<= (n - (minimum win))) win
|
||||||
|
|
||||||
|
findRun :: Int -> [Int] -> Int -> [Int] -> Maybe [Int]
|
||||||
|
findRun _ _ _ [] = Nothing
|
||||||
|
findRun t a r (l:ls)
|
||||||
|
| r + l == t = Just (l:a)
|
||||||
|
| r + l > t = Nothing
|
||||||
|
| otherwise = findRun t (l:a) (r + l) ls
|
||||||
|
|
||||||
|
testRuns :: Int -> [Int] -> [Int]
|
||||||
|
testRuns _ [] = error "no answer"
|
||||||
|
testRuns t ls = case (findRun t [] 0 ls) of
|
||||||
|
Nothing -> testRuns t (tail ls)
|
||||||
|
Just x -> x
|
Loading…
Reference in a new issue