Solve day 7 part 1
This commit is contained in:
parent
5539a4bd05
commit
f6f0fc171f
@ -21,6 +21,7 @@ module Pre (
|
|||||||
module Data.Stream.Infinite,
|
module Data.Stream.Infinite,
|
||||||
module Data.Text,
|
module Data.Text,
|
||||||
module Data.Text.Encoding,
|
module Data.Text.Encoding,
|
||||||
|
module Data.Traversable,
|
||||||
module Data.Void,
|
module Data.Void,
|
||||||
module Data.Word,
|
module Data.Word,
|
||||||
module Linear,
|
module Linear,
|
||||||
@ -66,6 +67,7 @@ import Data.Stream.Infinite (Stream ((:>)))
|
|||||||
import Data.Text (Text)
|
import Data.Text (Text)
|
||||||
import Data.Text.Encoding (encodeUtf8)
|
import Data.Text.Encoding (encodeUtf8)
|
||||||
import Data.Text.Lazy qualified as TL
|
import Data.Text.Lazy qualified as TL
|
||||||
|
import Data.Traversable
|
||||||
import Data.Void
|
import Data.Void
|
||||||
import Data.Word
|
import Data.Word
|
||||||
import Linear (V2 (..))
|
import Linear (V2 (..))
|
||||||
|
|||||||
@ -2,14 +2,32 @@ module Puzzles.Day7 (puzzle) where
|
|||||||
|
|
||||||
import Pre
|
import Pre
|
||||||
|
|
||||||
|
import Data.IntSet qualified as IS
|
||||||
|
import Data.Text.Lazy qualified as TL
|
||||||
|
|
||||||
puzzle :: Puzzle
|
puzzle :: Puzzle
|
||||||
puzzle =
|
puzzle =
|
||||||
Puzzle
|
Puzzle
|
||||||
{ number = 7
|
{ number = 7
|
||||||
, parser = pure ()
|
, parser = do
|
||||||
|
line1 <- some $ (single '.' $> False) <|> (single 'S' $> True)
|
||||||
|
start <- maybe (fail "start not found") (pure . fst) $ find snd $ zip [0 ..] line1
|
||||||
|
void newline
|
||||||
|
rows <- (some $ (single '.' $> False) <|> (single '^' $> True)) `sepEndBy1` newline
|
||||||
|
let splitters = map (IS.fromList . map fst . filter snd . zip [0 ..]) rows
|
||||||
|
pure (start, splitters)
|
||||||
, parts =
|
, parts =
|
||||||
[ \() ->
|
[ uncurry \start ->
|
||||||
"TODO"
|
TL.show
|
||||||
|
. flip execState (0 :: Int)
|
||||||
|
. foldlM
|
||||||
|
( \beams splitters ->
|
||||||
|
IS.fromList . concat <$> for (IS.toList beams) \x -> do
|
||||||
|
let hit = x `IS.member` splitters
|
||||||
|
when hit $ modify succ
|
||||||
|
pure if hit then [x - 1, x + 1] else [x]
|
||||||
|
)
|
||||||
|
(IS.singleton start)
|
||||||
]
|
]
|
||||||
, extraTests = mempty
|
, extraTests = mempty
|
||||||
}
|
}
|
||||||
|
|||||||
1
outputs/real/7/1
Normal file
1
outputs/real/7/1
Normal file
@ -0,0 +1 @@
|
|||||||
|
1537
|
||||||
Loading…
x
Reference in New Issue
Block a user