Add 2024 Days 01/02 in Haskell
This commit is contained in:
parent
f7e6dd05df
commit
3933ed1e60
18
2024/day01/day01.hs
Normal file
18
2024/day01/day01.hs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import Data.List ( sort, group )
|
||||||
|
import Data.Maybe ( fromMaybe )
|
||||||
|
import Aoc ( aocMain )
|
||||||
|
|
||||||
|
parseFile :: [String] -> ([Int], [Int])
|
||||||
|
parseFile lines = unzip [(a, b) | line <- lines, let [a, b] = map read $ words line]
|
||||||
|
|
||||||
|
part1 :: ([Int], [Int]) -> Int
|
||||||
|
part1 (list1, list2) = sum $ zipWith (curry (abs . uncurry (-))) (sort list1) (sort list2)
|
||||||
|
|
||||||
|
part2 :: ([Int], [Int]) -> Int
|
||||||
|
part2 (list1, list2) = sum $ map score list1
|
||||||
|
where
|
||||||
|
score n = n * fromMaybe 0 (lookup n count)
|
||||||
|
count = map (\xs -> (head xs, length xs)) $ group $ sort list2
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = aocMain parseFile part1 part2
|
23
2024/day02/day02.hs
Normal file
23
2024/day02/day02.hs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import Aoc ( aocMain )
|
||||||
|
|
||||||
|
parseFile :: [String] -> [[Int]]
|
||||||
|
parseFile = map (map read . words)
|
||||||
|
|
||||||
|
part1 :: [[Int]] -> Int
|
||||||
|
part1 reports =
|
||||||
|
length $ filter isSafe $ map differences reports
|
||||||
|
where
|
||||||
|
differences xs = zipWith (-) xs (tail xs)
|
||||||
|
isGradual dx = 1 <= abs dx && abs dx <= 3
|
||||||
|
isSafe dxs = all isGradual dxs && (all (<0) dxs || all (>0) dxs)
|
||||||
|
|
||||||
|
part2 :: [[Int]] -> Int
|
||||||
|
part2 reports =
|
||||||
|
length $ filter isSafe $ map remove1 reports
|
||||||
|
where
|
||||||
|
remove n xs = let (front, back) = splitAt n xs in front ++ tail back
|
||||||
|
remove1 report = map (`remove` report) [0..length report-1]
|
||||||
|
isSafe = (>0) . part1
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = aocMain parseFile part1 part2
|
12
aoc.hs
Normal file
12
aoc.hs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
module Aoc where
|
||||||
|
|
||||||
|
aocMain :: Show p => ([String] -> p) -> (p -> Int) -> (p -> Int) -> IO ()
|
||||||
|
aocMain parseFile part1 part2 = do
|
||||||
|
contents <- readFile "input.txt"
|
||||||
|
let input = parseFile $ lines contents
|
||||||
|
-- print $ "Input: " ++ show input
|
||||||
|
print $ "Part 1: " ++ show (part1 input)
|
||||||
|
print $ "Part 2: " ++ show (part2 input)
|
||||||
|
|
||||||
|
enumerate :: [a] -> [(Int, a)]
|
||||||
|
enumerate xs = zip [0..length xs] xs
|
Loading…
Reference in New Issue
Block a user