Solve day 10 part 1

This commit is contained in:
George Thomas 2025-12-11 11:34:36 +00:00
parent 4b45590f37
commit cdc54a27aa
3 changed files with 40 additions and 4 deletions

View File

@ -70,7 +70,7 @@ import Data.Foldable1
import Data.Function import Data.Function
import Data.Functor import Data.Functor
import Data.List (sortOn, transpose) import Data.List (sortOn, transpose)
import Data.List.Extra (dropEnd, enumerate, notNull, splitOn) import Data.List.Extra (dropEnd, enumerate, firstJust, notNull, splitOn)
import Data.List.NonEmpty (NonEmpty ((:|)), nonEmpty, some1, tail, tails) import Data.List.NonEmpty (NonEmpty ((:|)), nonEmpty, some1, tail, tails)
import Data.Maybe import Data.Maybe
import Data.Ord import Data.Ord

View File

@ -2,14 +2,49 @@ module Puzzles.Day10 (puzzle) where
import Pre import Pre
import Data.IntMap qualified as IM
puzzle :: Puzzle puzzle :: Puzzle
puzzle = puzzle =
Puzzle Puzzle
{ number = 10 { number = 10
, parser = mempty , parser = const $ flip sepEndBy newline do
void $ single '['
lights <- some $ (single '.' $> Off) <|> (single '#' $> On)
void $ single ']'
void space1
switches <- flip sepEndBy space1 do
void $ single '('
r <- Switch <$> decimal `sepBy` single ','
void $ single ')'
pure r
void $ single '{'
void $ decimal @_ @_ @_ @Int `sepBy` single ','
void $ single '}'
pure (Lights $ IM.fromList $ zip [0 ..] lights, switches)
, parts = , parts =
[ \() -> [ sum . map \(lights, switches) ->
() maybe (error "no solution") length
. firstJust (firstJust (\(s, ls) -> guard (allOff ls) $> s))
$ flip iterate [([], lights)] \ls ->
concatMap (\s -> map (\(ss, l) -> (s : ss, applySwitch s l)) ls) switches
] ]
, extraTests = mempty , extraTests = mempty
} }
data Light = On | Off
deriving (Eq, Ord, Show)
flipLight :: Light -> Light
flipLight = \case
On -> Off
Off -> On
newtype Lights = Lights (IM.IntMap Light)
deriving (Eq, Ord, Show)
allOff :: Lights -> Bool
allOff (Lights ls) = all (== Off) $ map snd $ IM.toList ls
newtype Switch = Switch [Int]
deriving (Eq, Ord, Show)
applySwitch :: Switch -> Lights -> Lights
applySwitch (Switch ss) (Lights ls) = Lights $ foldl' (flip $ IM.adjust flipLight) ls ss

1
outputs/real/10/1 Normal file
View File

@ -0,0 +1 @@
473