Add argument to parser for disambiguating real data versus examples
This breaks less code than adding it to the solution functions, and is more elegant in a way.
This commit is contained in:
parent
43918c70fa
commit
d0488726a0
@ -35,7 +35,7 @@ main =
|
|||||||
pt = show number
|
pt = show number
|
||||||
parseFile fp =
|
parseFile fp =
|
||||||
either (fail . ("parse failure: " <>) . errorBundlePretty) pure
|
either (fail . ("parse failure: " <>) . errorBundlePretty) pure
|
||||||
. runParser (parser <* eof) fp
|
. runParser (parser isRealData <* eof) fp
|
||||||
=<< T.readFile fp
|
=<< T.readFile fp
|
||||||
in
|
in
|
||||||
withResource (parseFile $ "../inputs/" <> t <> "/" <> pt) mempty \input ->
|
withResource (parseFile $ "../inputs/" <> t <> "/" <> pt) mempty \input ->
|
||||||
|
|||||||
@ -82,7 +82,7 @@ import Text.Megaparsec.Char.Lexer (decimal)
|
|||||||
|
|
||||||
data Puzzle = forall input. Puzzle
|
data Puzzle = forall input. Puzzle
|
||||||
{ number :: Word
|
{ number :: Word
|
||||||
, parser :: Parsec Void Text input
|
, parser :: Bool -> Parsec Void Text input
|
||||||
, parts :: [input -> TL.Text]
|
, parts :: [input -> TL.Text]
|
||||||
, extraTests :: Bool -> FilePath -> IO input -> [TestTree]
|
, extraTests :: Bool -> FilePath -> IO input -> [TestTree]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,7 @@ puzzle :: Puzzle
|
|||||||
puzzle =
|
puzzle =
|
||||||
Puzzle
|
Puzzle
|
||||||
{ number = 1
|
{ number = 1
|
||||||
, parser = flip sepEndBy newline $ (,) <$> ((char 'L' $> L) <|> (char 'R' $> R)) <*> (Inc <$> decimal)
|
, parser = const $ flip sepEndBy newline $ (,) <$> ((char 'L' $> L) <|> (char 'R' $> R)) <*> (Inc <$> decimal)
|
||||||
, parts =
|
, parts =
|
||||||
[ TL.show
|
[ TL.show
|
||||||
. sum
|
. sum
|
||||||
|
|||||||
@ -9,7 +9,7 @@ puzzle :: Puzzle
|
|||||||
puzzle =
|
puzzle =
|
||||||
Puzzle
|
Puzzle
|
||||||
{ number = 2
|
{ number = 2
|
||||||
, parser = (<* newline) $ flip sepBy (char ',') $ (,) <$> (decimal <* char '-') <*> decimal
|
, parser = const $ (<* newline) $ flip sepBy (char ',') $ (,) <$> (decimal <* char '-') <*> decimal
|
||||||
, parts =
|
, parts =
|
||||||
[ TL.show
|
[ TL.show
|
||||||
. sum
|
. sum
|
||||||
|
|||||||
@ -9,7 +9,7 @@ puzzle :: Puzzle
|
|||||||
puzzle =
|
puzzle =
|
||||||
Puzzle
|
Puzzle
|
||||||
{ number = 3
|
{ number = 3
|
||||||
, parser = flip sepEndBy newline $ Bank . fmap (fromIntegral . digitToInt) <$> some1 digitChar
|
, parser = const $ flip sepEndBy newline $ Bank . fmap (fromIntegral . digitToInt) <$> some1 digitChar
|
||||||
, parts =
|
, parts =
|
||||||
[ TL.show
|
[ TL.show
|
||||||
. sum
|
. sum
|
||||||
|
|||||||
@ -12,7 +12,7 @@ puzzle :: Puzzle
|
|||||||
puzzle =
|
puzzle =
|
||||||
Puzzle
|
Puzzle
|
||||||
{ number = 4
|
{ number = 4
|
||||||
, parser = flip sepEndBy newline $ some $ asum $ enumerate <&> \t -> char (inToChar t) $> t
|
, parser = const $ flip sepEndBy newline $ some $ asum $ enumerate <&> \t -> char (inToChar t) $> t
|
||||||
, parts =
|
, parts =
|
||||||
[ TL.show
|
[ TL.show
|
||||||
. (\g -> countRolls g - countRolls (removeAccessibleRolls $ findAccessible g))
|
. (\g -> countRolls g - countRolls (removeAccessibleRolls $ findAccessible g))
|
||||||
|
|||||||
@ -8,7 +8,7 @@ puzzle :: Puzzle
|
|||||||
puzzle =
|
puzzle =
|
||||||
Puzzle
|
Puzzle
|
||||||
{ number = 5
|
{ number = 5
|
||||||
, parser = do
|
, parser = const do
|
||||||
ranges <- flip sepEndBy newline $ Range <$> decimal <* single '-' <*> decimal
|
ranges <- flip sepEndBy newline $ Range <$> decimal <* single '-' <*> decimal
|
||||||
void newline
|
void newline
|
||||||
vals <- sepEndBy decimal newline
|
vals <- sepEndBy decimal newline
|
||||||
|
|||||||
@ -8,7 +8,7 @@ puzzle :: Puzzle
|
|||||||
puzzle =
|
puzzle =
|
||||||
Puzzle
|
Puzzle
|
||||||
{ number = 6
|
{ number = 6
|
||||||
, parser = do
|
, parser = const do
|
||||||
ints <- (hspace *> (decimal `sepBy1` hspace1)) `sepEndBy1` newline
|
ints <- (hspace *> (decimal `sepBy1` hspace1)) `sepEndBy1` newline
|
||||||
ops <- ((single '*' $> Multiply) <|> (single '+' $> Add)) `sepEndBy` hspace1
|
ops <- ((single '*' $> Multiply) <|> (single '+' $> Add)) `sepEndBy` hspace1
|
||||||
void newline
|
void newline
|
||||||
|
|||||||
@ -10,7 +10,7 @@ puzzle :: Puzzle
|
|||||||
puzzle =
|
puzzle =
|
||||||
Puzzle
|
Puzzle
|
||||||
{ number = 7
|
{ number = 7
|
||||||
, parser = do
|
, parser = const do
|
||||||
line1 <- some $ (single '.' $> False) <|> (single 'S' $> True)
|
line1 <- some $ (single '.' $> False) <|> (single 'S' $> True)
|
||||||
start <- maybe (fail "start not found") (pure . fst) $ find snd $ zip [0 ..] line1
|
start <- maybe (fail "start not found") (pure . fst) $ find snd $ zip [0 ..] line1
|
||||||
void newline
|
void newline
|
||||||
|
|||||||
@ -11,20 +11,18 @@ puzzle :: Puzzle
|
|||||||
puzzle =
|
puzzle =
|
||||||
Puzzle
|
Puzzle
|
||||||
{ number = 8
|
{ number = 8
|
||||||
, parser = (V3 <$> decimal <* single ',' <*> decimal <* single ',' <*> decimal) `sepEndBy` newline
|
, parser = \isRealData -> (if isRealData then 1000 else 10,) <$> (V3 <$> decimal <* single ',' <*> decimal <* single ',' <*> decimal) `sepEndBy` newline
|
||||||
, parts =
|
, parts =
|
||||||
[ TL.show
|
[ uncurry \n -> TL.show
|
||||||
. product
|
. product
|
||||||
. take 3
|
. take 3
|
||||||
. sortOn Down
|
. sortOn Down
|
||||||
. map length
|
. map length
|
||||||
. DS.toLists
|
. DS.toLists
|
||||||
. snd
|
. snd
|
||||||
. \boxes ->
|
. (!! n)
|
||||||
-- TODO more principled way of distinguishing example and real
|
. connectBoxes
|
||||||
(!! ((if length boxes == 20 then 10 else if length boxes == 1000 then 1000 else undefined))) $
|
, uncurry . const $ TL.show
|
||||||
connectBoxes boxes
|
|
||||||
, TL.show
|
|
||||||
. maybe (error "sets never unified") (\((V3 x1 _ _, V3 x2 _ _), _) -> x1 * x2)
|
. maybe (error "sets never unified") (\((V3 x1 _ _, V3 x2 _ _), _) -> x1 * x2)
|
||||||
. lastMay
|
. lastMay
|
||||||
. takeWhile ((> 1) . DS.sets . snd)
|
. takeWhile ((> 1) . DS.sets . snd)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user