46 lines
1.4 KiB
Haskell
Raw Normal View History

2025-12-08 13:09:28 +00:00
module Puzzles.Day6 (puzzle) where
import Pre
puzzle :: Puzzle
puzzle =
Puzzle
{ number = 6
, parser = const do
2025-12-08 23:38:48 +00:00
ints <- some ((Just <$> digit) <|> (single ' ' $> Nothing)) `sepEndBy1` newline
2025-12-08 15:52:20 +00:00
ops <- ((single '*' $> Multiply) <|> (single '+' $> Add)) `sepEndBy` hspace1
void newline
2025-12-08 23:38:48 +00:00
pure (ops, ints)
2025-12-08 13:09:28 +00:00
, parts =
( sum
2025-12-08 23:38:48 +00:00
. uncurry (zipWith applyToList)
. second (transpose . map (map (digitsToInt @Int) . filter notNull . groupJusts))
)
/\ ( sum
. uncurry (zipWith applyToList)
. second
( groupJusts
. map (\l -> if all isNothing l then Nothing else Just $ digitsToInt @Int $ catMaybes l)
. transpose
)
)
/\ nil
2025-12-08 13:09:28 +00:00
, extraTests = mempty
}
2025-12-08 15:52:20 +00:00
data Op = Add | Multiply
deriving (Eq, Ord, Show, Enum, Bounded, Generic, NFData)
apply :: (Num a) => Op -> a -> a -> a
2025-12-08 15:52:20 +00:00
apply = \case
Add -> (+)
Multiply -> (*)
unit :: (Num a) => Op -> a
2025-12-08 15:52:20 +00:00
unit = \case
Add -> 0
Multiply -> 1
applyToList :: (Num a) => Op -> [a] -> a
2025-12-08 23:38:48 +00:00
applyToList op = foldl' (apply op) (unit op)
groupJusts :: (Eq a) => [Maybe a] -> [[a]]
groupJusts = map catMaybes . splitOn [Nothing]