aboutsummaryrefslogtreecommitdiff
path: root/execs/Day09.hs
diff options
context:
space:
mode:
Diffstat (limited to 'execs/Day09.hs')
-rw-r--r--execs/Day09.hs35
1 files changed, 35 insertions, 0 deletions
diff --git a/execs/Day09.hs b/execs/Day09.hs
new file mode 100644
index 0000000..e2e5fd4
--- /dev/null
+++ b/execs/Day09.hs
@@ -0,0 +1,35 @@
1
2module Main where
3
4import Utils
5import Data.List (inits, tails, find)
6import Data.Bifunctor
7
8parseLine :: String -> Int
9parseLine = read
10
11doCheck :: [Int] -> Int -> Bool
12doCheck preamble target = target `elem` p
13 where p = [x + y | x <- preamble, y <- preamble, x /= y]
14
15checkAll :: [Int] -> [Int] -> [(Int, Bool)]
16checkAll preamble [x] = [(x, doCheck preamble x)]
17checkAll preamble@(p:ps) (x:xs) = (x, doCheck preamble x) : checkAll (ps++[x]) xs
18
19
20findWeakness :: [[Int]] -> Int -> Int
21findWeakness subs target = mn + mx
22 where Just t = find ((== target) . sum) subs
23 mn = minimum t
24 mx = maximum t
25
26main :: IO ()
27main = do
28 n <- map parseLine . lines <$> readFile "input/09"
29 let preambleLen = 25
30 Just (target, _) = find (not . snd)
31 $ uncurry checkAll
32 $ bimap (take preambleLen) (drop preambleLen)
33 $ (,) n n
34 print target
35 print $ findWeakness (sublists n) target