From f5eb3e1a98d7ec0aea08bc640ec341178d4750e6 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Mon, 20 Mar 2023 00:35:17 +0100 Subject: 2020-10 in haskell --- 2020/10-Adapter_Array/#second.hs# | 36 ++++++++++++++++ 2020/10-Adapter_Array/example | 11 +++++ 2020/10-Adapter_Array/example2 | 31 ++++++++++++++ 2020/10-Adapter_Array/first.hs | 31 ++++++++++++++ 2020/10-Adapter_Array/input | 89 +++++++++++++++++++++++++++++++++++++++ 2020/10-Adapter_Array/second.hs | 29 +++++++++++++ 6 files changed, 227 insertions(+) create mode 100644 2020/10-Adapter_Array/#second.hs# create mode 100644 2020/10-Adapter_Array/example create mode 100644 2020/10-Adapter_Array/example2 create mode 100644 2020/10-Adapter_Array/first.hs create mode 100644 2020/10-Adapter_Array/input create mode 100644 2020/10-Adapter_Array/second.hs diff --git a/2020/10-Adapter_Array/#second.hs# b/2020/10-Adapter_Array/#second.hs# new file mode 100644 index 0000000..8e581a0 --- /dev/null +++ b/2020/10-Adapter_Array/#second.hs# @@ -0,0 +1,36 @@ +module Main (main) where +import Control.Monad (when) +import Data.List (group, sort) +import System.Exit (die) + +exampleExpectedOutput = 8 +exampleExpectedOutput2 = 19208 + +parseInput :: String -> IO [Int] +parseInput filename = do + input <- readFile filename + return $ map read $ lines input + +compute :: [Int] -> Int +compute jolts = product $ map (([1, 1, 2, 4, 7, 13, 24] !!) . length) $ filter ((==) 1 . head) $ group $ zipWith (-) s (0 : s) --snd . head $ foldl compute' [(0, 1)] $ sort jolts + where + s = sort jolts + --compute' (prev, n) x = + --compute' (x:xs) = (length $ takeWhile (\i -> i <= x + 3) xs) * compute' xs + +main :: IO () +main = do + example <- parseInput "example" + let s = sort example + print s + print $ zipWith (-) s (0 : s) + print $ group $ zipWith (-) s (0 : s) + print $ filter ((==) 1 . head) $ group $ zipWith (-) s (0 : s) + print $ map length $ filter ((==) 1 . head) $ group $ zipWith (-) s (0 : s) + let exampleOutput = compute example + when (exampleOutput /= exampleExpectedOutput) (die $ "example failed: got " ++ show exampleOutput ++ " instead of " ++ show exampleExpectedOutput) + example2 <- parseInput "example2" + let exampleOutput2 = compute example2 + when (exampleOutput2 /= exampleExpectedOutput2) (die $ "example2 failed: got " ++ show exampleOutput2 ++ " instead of " ++ show exampleExpectedOutput2) + input <- parseInput "input" + print $ compute input diff --git a/2020/10-Adapter_Array/example b/2020/10-Adapter_Array/example new file mode 100644 index 0000000..ec4a03f --- /dev/null +++ b/2020/10-Adapter_Array/example @@ -0,0 +1,11 @@ +16 +10 +15 +5 +1 +11 +7 +19 +6 +12 +4 diff --git a/2020/10-Adapter_Array/example2 b/2020/10-Adapter_Array/example2 new file mode 100644 index 0000000..e6376dc --- /dev/null +++ b/2020/10-Adapter_Array/example2 @@ -0,0 +1,31 @@ +28 +33 +18 +42 +31 +14 +46 +20 +48 +47 +24 +23 +49 +45 +19 +38 +39 +11 +1 +32 +25 +35 +8 +17 +7 +9 +4 +2 +34 +10 +3 diff --git a/2020/10-Adapter_Array/first.hs b/2020/10-Adapter_Array/first.hs new file mode 100644 index 0000000..0157a3b --- /dev/null +++ b/2020/10-Adapter_Array/first.hs @@ -0,0 +1,31 @@ +module Main (main) where +import Control.Monad (when) +import Data.List (foldl', sort) +import System.Exit (die) + +exampleExpectedOutput = 35 +exampleExpectedOutput2 = 220 + +parseInput :: String -> IO [Int] +parseInput filename = do + input <- readFile filename + return $ map read $ lines input + +compute :: [Int] -> Int +compute jolts = result $ foldl' compute' (0, 0, 0) $ sort jolts + where + compute' (prev, ones, threes) jolt + | jolt - prev == 1 = (jolt, ones + 1, threes) + | jolt - prev == 3 = (jolt, ones, threes + 1) + result (_, ones, threes) = ones * (threes + 1) + +main :: IO () +main = do + example <- parseInput "example" + let exampleOutput = compute example + when (exampleOutput /= exampleExpectedOutput) (die $ "example failed: got " ++ show exampleOutput ++ " instead of " ++ show exampleExpectedOutput) + example2 <- parseInput "example2" + let exampleOutput2 = compute example2 + when (exampleOutput2 /= exampleExpectedOutput2) (die $ "example2 failed: got " ++ show exampleOutput2 ++ " instead of " ++ show exampleExpectedOutput2) + input <- parseInput "input" + print $ compute input diff --git a/2020/10-Adapter_Array/input b/2020/10-Adapter_Array/input new file mode 100644 index 0000000..2ef0266 --- /dev/null +++ b/2020/10-Adapter_Array/input @@ -0,0 +1,89 @@ +67 +118 +90 +41 +105 +24 +137 +129 +124 +15 +59 +91 +94 +60 +108 +63 +112 +48 +62 +125 +68 +126 +131 +4 +1 +44 +77 +115 +75 +89 +7 +3 +82 +28 +97 +130 +104 +54 +40 +80 +76 +19 +136 +31 +98 +110 +133 +84 +2 +51 +18 +70 +12 +120 +47 +66 +27 +39 +109 +61 +34 +121 +38 +96 +30 +83 +69 +13 +81 +37 +119 +55 +20 +87 +95 +29 +88 +111 +45 +46 +14 +11 +8 +74 +101 +73 +56 +132 +23 diff --git a/2020/10-Adapter_Array/second.hs b/2020/10-Adapter_Array/second.hs new file mode 100644 index 0000000..cb99e9a --- /dev/null +++ b/2020/10-Adapter_Array/second.hs @@ -0,0 +1,29 @@ +module Main (main) where +import Control.Monad (when) +import Data.List (group, sort) +import System.Exit (die) + +exampleExpectedOutput = 8 +exampleExpectedOutput2 = 19208 + +parseInput :: String -> IO [Int] +parseInput filename = do + input <- readFile filename + return $ map read $ lines input + +compute :: [Int] -> Int +compute jolts = product $ map (([0, 1, 2, 4, 7] !!) . length) $ filter ((==) 1 . head) $ group $ zipWith (-) s (0 : s) + where + s = sort jolts + +main :: IO () +main = do + example <- parseInput "example" + let s = sort example + let exampleOutput = compute example + when (exampleOutput /= exampleExpectedOutput) (die $ "example failed: got " ++ show exampleOutput ++ " instead of " ++ show exampleExpectedOutput) + example2 <- parseInput "example2" + let exampleOutput2 = compute example2 + when (exampleOutput2 /= exampleExpectedOutput2) (die $ "example2 failed: got " ++ show exampleOutput2 ++ " instead of " ++ show exampleExpectedOutput2) + input <- parseInput "input" + print $ compute input -- cgit v1.2.3