aboutsummaryrefslogtreecommitdiff
path: root/2020/09b.hs
diff options
context:
space:
mode:
authorAria <me@aria.rip>2023-01-02 21:58:56 +0000
committerAria <me@aria.rip>2023-01-02 21:58:56 +0000
commit5eb58ad076f2cd435b11b140820da224b60b73d5 (patch)
tree2a67939595fbf993ff04f69b9cd3f0aa20827d96 /2020/09b.hs
initial commit
Diffstat (limited to '2020/09b.hs')
-rw-r--r--2020/09b.hs34
1 files changed, 34 insertions, 0 deletions
diff --git a/2020/09b.hs b/2020/09b.hs
new file mode 100644
index 0000000..a643b29
--- /dev/null
+++ b/2020/09b.hs
@@ -0,0 +1,34 @@
+module Day9B where
+
+import System.Environment (getArgs)
+
+potentialSum :: [Int] -> Int -> [(Int, Int)]
+potentialSum xs t = filter ((== t) . uncurry (+)) [(x, y) | x <- xs, y <- xs, x /= y]
+
+mapSumPrev :: [Int] -> Int -> [[(Int, Int)]]
+mapSumPrev xs l = [potentialSum (take l $ drop (i - l) xs) v | (i, v) <- zip [25..] (drop l xs)]
+
+rangesSummingTo :: [Int] -> Int -> [[Int]]
+rangesSummingTo [] _ = []
+rangesSummingTo xs t = filter ((== t) . sum) $ map (`take` xs) [1..length xs]
+ ++ rangesSummingTo (drop 1 xs) t
+
+numsFromFile :: String -> IO [Int]
+numsFromFile p = do
+ c <- readFile p;
+ return $ map read $ lines c;
+
+main :: IO ()
+main = do
+ args <- getArgs;
+ xs <- numsFromFile $ head args;
+
+ let unob = head $ filter (null . fst) $ zip (mapSumPrev xs 25) [25..];
+ let unob_n = xs !! snd unob;
+ putStrLn $ "No way to sum up to " ++ show unob_n;
+
+ let rs = head $ rangesSummingTo xs unob_n;
+ print rs;
+
+ putStrLn $ "Smallest + Largest = " ++ show (minimum rs + maximum rs);
+ return ();