Solve day 4 part 1

This commit is contained in:
George Thomas 2025-12-04 12:23:48 +00:00
parent dea25e3359
commit 9137e7cd66
2 changed files with 60 additions and 3 deletions

View File

@ -1,14 +1,70 @@
module Puzzles.Day4 (puzzle) where module Puzzles.Day4 (puzzle) where
import Control.Applicative
import Control.Monad
import Data.Bifunctor
import Data.Functor
import Data.List.Extra
import Data.Sequence qualified as Seq
import Data.Text qualified as T
import Linear
import Puzzle import Puzzle
import Text.Megaparsec hiding (some)
import Text.Megaparsec.Char
puzzle :: Puzzle puzzle :: Puzzle
puzzle = puzzle =
Puzzle Puzzle
{ number = 4 { number = 4
, parser = pure () , parser = flip sepEndBy newline $ some $ asum $ enumerate <&> \t -> char (inToChar t) $> t
, parts = , parts =
[ \() -> [ \input ->
"TODO" let inputWithCoords = zipWith (map . first . V2) [0 ..] $ map (zip [0 ..]) input
inputSeq = Seq.fromList $ map Seq.fromList input
in T.show
. length
. concatMap (filter (== OutAccessible))
$ inputWithCoords <<&>> \(v, t) -> case t of
InEmpty -> OutEmpty
InRoll ->
if length (filter (== Just InRoll) neighbours) < 4
then OutAccessible
else OutRoll
where
neighbours = do
x <- [-1 .. 1]
y <- [-1 .. 1]
guard $ not (x == 0 && y == 0)
let V2 x' y' = v + V2 x y
pure $ Seq.lookup x' inputSeq >>= Seq.lookup y'
] ]
} }
data InTile
= InEmpty
| InRoll
deriving (Eq, Ord, Show, Enum, Bounded)
inToChar :: InTile -> Char
inToChar = \case
InEmpty -> '.'
InRoll -> '@'
drawGridIn :: [[InTile]] -> String
drawGridIn = unlines . map (map inToChar)
data OutTile
= OutEmpty
| OutRoll
| OutAccessible
deriving (Eq, Ord, Show, Enum, Bounded)
outToChar :: OutTile -> Char
outToChar = \case
OutEmpty -> '.'
OutRoll -> '@'
OutAccessible -> 'x'
drawGridOut :: [[OutTile]] -> String
drawGridOut = unlines . map (map outToChar)
(<<$>>) :: (Functor f1, Functor f2) => (a -> b) -> f1 (f2 a) -> f1 (f2 b)
(<<$>>) = fmap . fmap
(<<&>>) :: (Functor f1, Functor f2) => f1 (f2 a) -> (a -> b) -> f1 (f2 b)
(<<&>>) = flip (<<$>>)

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

@ -0,0 +1 @@
1437