advent-of-code/aoc.hs
2024-12-03 04:45:27 +11:00

40 lines
1.1 KiB
Haskell

module Aoc where
aocMain' :: (Show p, Show a) => ([String] -> p) -> (p -> (a, c)) -> (p -> c -> a) -> IO ()
aocMain' parseFile part1 part2 = do
contents <- readFile "input.txt"
let input = parseFile $ lines contents
let (part1Answer, data') = part1 input
putStrLn $ "Part 1: " ++ show part1Answer
let part2Answer = part2 input data'
putStrLn $ "Part 2: " ++ show part2Answer
passthrough :: a -> (a, a)
passthrough a = (a, a)
aocMain :: Show p => ([String] -> p) -> (p -> Int) -> (p -> Int) -> IO ()
aocMain parseFile part1 part2 = aocMain' parseFile ((,()) . part1) (const' part2)
const' :: (a -> b) -> a -> c -> b
const' f a _ = f a
enumerate :: [a] -> [(Int, a)]
enumerate xs = zip [0..length xs] xs
unimplemented :: Show p => p -> Int
unimplemented = error . show
pair :: [a] -> (a, a)
pair as = let [a1, a2] = as in (a1, a2)
triplet :: [a] -> (a, a, a)
triplet as = let [a1, a2, a3] = as in (a1, a2, a3)
single :: [a] -> a
single as = let [a] = as in a
both :: (a -> b) -> (a, a) -> (b, b)
both f (a, b) = (f a, f b)
lastSplit :: Int -> [a] -> ([a], [a])
lastSplit n as = splitAt (length as - n) as