Commit caf11616 by Stuart Kurtz

Day 18

parent 0f0acb31
[[2,[2,[4,0]]],[6,1]]
[[3,[4,[2,4]]],[[6,9],[6,1]]]
[7,[8,[8,[0,8]]]]
[[[[2,9],5],5],[[[0,1],8],[[7,9],5]]]
[[[[3,0],[7,0]],[[9,6],[1,9]]],4]
[[[0,[4,8]],8],[[[2,1],9],6]]
[[[5,[7,7]],[[9,6],2]],[[[5,8],8],0]]
[[0,3],[[8,2],[6,[2,2]]]]
[[[9,0],[4,[4,7]]],[7,[[9,1],9]]]
[0,[7,[1,1]]]
[[[4,[0,1]],[[1,0],8]],[[[3,9],[0,1]],[[9,1],[8,8]]]]
[[[6,0],3],2]
[[[[4,1],[2,7]],[9,[8,9]]],[[3,0],0]]
[[[[2,4],[8,7]],[9,[9,7]]],[[[2,5],6],9]]
[[7,6],[[4,[2,4]],[3,8]]]
[[7,2],[[8,8],7]]
[[[[6,0],4],[[4,7],4]],[[6,[2,7]],[[6,5],3]]]
[[[[8,8],[7,6]],4],5]
[[0,[[6,9],[7,9]]],[9,5]]
[9,[[[0,4],6],[[7,0],0]]]
[[[[4,4],0],[3,[3,9]]],[[7,5],[5,[7,2]]]]
[[[8,3],[[8,5],[4,4]]],[0,[0,3]]]
[[9,[3,[6,7]]],[[7,0],[[9,2],7]]]
[[[3,7],[[3,6],9]],7]
[[2,[2,[5,7]]],[[[6,4],5],[4,7]]]
[[[[9,0],2],[[4,4],6]],[[[3,2],[5,5]],[[5,9],7]]]
[[[[2,5],4],[8,5]],6]
[[[3,2],[[1,7],5]],[[8,1],[1,[1,2]]]]
[8,[[3,[5,4]],5]]
[[[2,[5,9]],[1,3]],[[[2,3],[8,3]],[[5,1],[8,9]]]]
[[[2,0],[[3,3],[4,7]]],[[[8,7],[7,4]],1]]
[[[[7,4],9],[3,[4,1]]],[[[8,4],5],7]]
[[[[0,2],9],3],[9,[5,3]]]
[3,4]
[[[1,[0,2]],[[9,9],[8,2]]],6]
[[[[2,9],[3,5]],9],[[9,3],[3,[6,7]]]]
[[0,[[4,6],4]],[2,[5,2]]]
[9,[[9,[6,8]],8]]
[3,[[[1,2],[0,9]],[[4,9],1]]]
[[[[8,7],[1,7]],[[2,6],[8,5]]],[3,[[8,0],[6,9]]]]
[[8,[[4,9],7]],[3,[9,4]]]
[[0,[[3,2],[2,2]]],0]
[[[2,7],[[5,7],4]],[[[6,0],[2,1]],[[4,1],[1,6]]]]
[[[[9,6],[0,3]],[[0,6],[0,4]]],[[[3,7],[6,7]],7]]
[[[[1,1],6],[[5,6],4]],[[5,[0,7]],1]]
[[[3,9],[[7,3],[1,5]]],[[[1,2],3],[0,[5,6]]]]
[[[[4,4],[0,5]],6],[[7,[2,0]],6]]
[[[[2,2],6],9],[[[9,1],2],[[8,6],8]]]
[[[[5,0],8],[[5,7],7]],[6,[5,3]]]
[[[[8,2],[8,4]],1],[[1,[7,3]],8]]
[[[[3,2],2],[[4,9],[5,4]]],[[[9,2],4],[5,[6,0]]]]
[[1,[[0,6],0]],[[[1,5],2],[[6,0],[3,7]]]]
[4,[7,[6,[3,3]]]]
[[[0,[2,5]],2],5]
[[[0,[5,7]],9],[[[2,3],[3,4]],[[0,4],9]]]
[[3,1],[[[4,1],9],[[0,5],[8,6]]]]
[[9,[2,0]],[[0,[1,7]],[9,[6,4]]]]
[[[[6,5],5],5],[5,8]]
[[[[2,8],[1,3]],[[5,4],2]],[[[0,8],[5,1]],[9,[5,6]]]]
[[[[6,9],7],[9,7]],2]
[[[[1,7],8],[8,7]],[[[3,5],4],8]]
[[[[1,8],[1,0]],0],[[7,1],5]]
[[[9,[6,8]],3],[[5,1],[4,[8,2]]]]
[[[0,[2,1]],1],[3,[9,[5,5]]]]
[[2,5],[2,5]]
[[[[1,1],[8,3]],[[1,9],[4,9]]],[[5,[4,8]],[[5,0],0]]]
[[[0,7],[[3,4],1]],[[[1,2],[2,9]],[[2,0],9]]]
[3,2]
[[[9,[8,2]],[7,3]],7]
[[[[6,9],9],[3,2]],0]
[[3,[[6,1],8]],6]
[[[[5,9],9],[[4,4],7]],[7,5]]
[1,[[2,8],0]]
[[2,[0,6]],[[[3,3],[0,4]],8]]
[[[[4,8],9],[0,[3,0]]],[[0,[3,1]],[8,[7,4]]]]
[[[6,[8,0]],[0,[8,9]]],[3,8]]
[[[[0,8],[9,4]],[1,[2,0]]],1]
[[7,6],[[[0,2],9],3]]
[[[[1,0],3],2],1]
[[[[1,2],8],5],7]
[0,[[3,0],7]]
[[7,[[0,9],[8,4]]],[[2,0],[[2,8],1]]]
[[[1,8],[[8,1],1]],[3,[8,9]]]
[4,[[3,7],[[5,2],9]]]
[[[[3,8],[2,9]],[3,9]],[[[3,7],[6,9]],[[1,7],2]]]
[9,[[[3,7],9],[[4,9],[8,6]]]]
[[7,[3,9]],[0,7]]
[[[1,6],0],[[7,[8,1]],[6,3]]]
[[[[3,9],3],[[2,6],[8,0]]],[[3,3],9]]
[[[1,2],[1,6]],[[1,[4,2]],0]]
[[[0,[3,0]],2],[[7,[9,4]],[6,8]]]
[6,[[[3,1],1],5]]
[[[3,4],[[5,9],[1,1]]],[[2,[0,1]],3]]
[[2,[[1,5],7]],[0,2]]
[[1,[[6,7],7]],4]
[6,[5,[[3,2],[6,8]]]]
[[[3,9],[[4,0],6]],[8,[3,[5,2]]]]
[[5,[[7,3],[2,2]]],[[7,7],7]]
[[[1,2],[[2,4],[6,1]]],[[0,[4,2]],[[5,7],[2,3]]]]
[[[8,7],8],[[7,[3,6]],[[1,0],4]]]
\ No newline at end of file
module Main where
import Control.Monad ( void )
import Data.Char ( isDigit )
import Text.ParserCombinators.ReadP
( (<++), char, munch1, readP_to_S, ReadP )
data SFNumber
= Regular Int
| Pair SFNumber SFNumber
parseInt :: ReadP Int
parseInt = read <$> munch1 isDigit
parseSFNumber :: ReadP SFNumber
parseSFNumber = (Regular <$> parseInt) <++ parsePair where
parsePair = do
void $ char '['
x <- parseSFNumber
void $ char ','
y <- parseSFNumber
void $ char ']'
pure $ Pair x y
instance Read SFNumber where
readsPrec _ = readP_to_S parseSFNumber
instance Show SFNumber where
show (Regular n) = show n
show (Pair x y) = concat ["[",show x,",",show y,"]"]
explode :: SFNumber -> Maybe SFNumber -- result, did a reduction occur
explode sn = case iter 1 sn of
Nothing -> Nothing
Just (result, _, _) -> Just result
where
-- the second coordinate of the result encodes whether a
-- reduction occured, and if so, what numbers might need to
-- be added to the left or right.
iter :: Int -> SFNumber -> Maybe (SFNumber, Maybe Int, Maybe Int)
iter _ (Regular _) = Nothing
iter 5 (Pair (Regular x) (Regular y)) =
Just (Regular 0, (Just x), (Just y))
iter 5 _ = error "explode -- SFN too deeply nested"
iter k (Pair x y) = case iter (k+1) x of
Nothing -> case iter (k+1) y of
Nothing -> Nothing
Just (result,mx,my) ->
Just (Pair (injectLeft x mx) result,Nothing,my)
Just (result,mx,my) -> Just (Pair result (injectRight y my),mx,Nothing)
injectLeft x Nothing = x
injectLeft (Regular x) (Just d) = Regular $ x + d
injectLeft (Pair x y) (Just d) = Pair x (injectLeft y (Just d))
injectRight y Nothing = y
injectRight (Regular y) (Just d) = Regular $ y + d
injectRight (Pair x y) (Just d) = Pair (injectRight x (Just d)) y
split :: SFNumber -> Maybe SFNumber
split (Regular n)
| n >= 10 =
let x = n `div` 2
y = n - x
in Just (Pair (Regular x) (Regular y))
| otherwise = Nothing
split (Pair x y) = case split x of
Nothing -> case split y of
Nothing -> Nothing
Just sy -> Just (Pair x sy)
Just sx -> Just (Pair sx y)
normalize :: SFNumber -> SFNumber
normalize sfn = case explode sfn of
Just result -> normalize result
Nothing -> case split sfn of
Just result -> normalize result
Nothing -> sfn
sfAdd :: SFNumber -> SFNumber -> SFNumber
sfAdd x y = normalize (Pair x y)
magnitude :: SFNumber -> Int
magnitude (Regular n) = n
magnitude (Pair x y) = 3 * magnitude x + 2 * magnitude y
main :: IO ()
main = pure ()
main = do
input <- map (read @SFNumber) . lines <$> readFile "data/snailfish.txt"
let result = foldl1 sfAdd input
print result
print . magnitude $ result
module Main where
import Control.Monad ( void )
import Data.Char ( isDigit )
import Text.ParserCombinators.ReadP
( (<++), char, munch1, readP_to_S, ReadP )
data SFNumber
= Regular Int
| Pair SFNumber SFNumber
deriving Eq
parseInt :: ReadP Int
parseInt = read <$> munch1 isDigit
parseSFNumber :: ReadP SFNumber
parseSFNumber = (Regular <$> parseInt) <++ parsePair where
parsePair = do
void $ char '['
x <- parseSFNumber
void $ char ','
y <- parseSFNumber
void $ char ']'
pure $ Pair x y
instance Read SFNumber where
readsPrec _ = readP_to_S parseSFNumber
instance Show SFNumber where
show (Regular n) = show n
show (Pair x y) = concat ["[",show x,",",show y,"]"]
explode :: SFNumber -> Maybe SFNumber -- result, did a reduction occur
explode sn = case iter 1 sn of
Nothing -> Nothing
Just (result, _, _) -> Just result
where
-- the second coordinate of the result encodes whether a
-- reduction occured, and if so, what numbers might need to
-- be added to the left or right.
iter :: Int -> SFNumber -> Maybe (SFNumber, Maybe Int, Maybe Int)
iter _ (Regular _) = Nothing
iter 5 (Pair (Regular x) (Regular y)) =
Just (Regular 0, (Just x), (Just y))
iter 5 _ = error "explode -- SFN too deeply nested"
iter k (Pair x y) = case iter (k+1) x of
Nothing -> case iter (k+1) y of
Nothing -> Nothing
Just (result,mx,my) ->
Just (Pair (injectLeft x mx) result,Nothing,my)
Just (result,mx,my) -> Just (Pair result (injectRight y my),mx,Nothing)
injectLeft x Nothing = x
injectLeft (Regular x) (Just d) = Regular $ x + d
injectLeft (Pair x y) (Just d) = Pair x (injectLeft y (Just d))
injectRight y Nothing = y
injectRight (Regular y) (Just d) = Regular $ y + d
injectRight (Pair x y) (Just d) = Pair (injectRight x (Just d)) y
split :: SFNumber -> Maybe SFNumber
split (Regular n)
| n >= 10 =
let x = n `div` 2
y = n - x
in Just (Pair (Regular x) (Regular y))
| otherwise = Nothing
split (Pair x y) = case split x of
Nothing -> case split y of
Nothing -> Nothing
Just sy -> Just (Pair x sy)
Just sx -> Just (Pair sx y)
normalize :: SFNumber -> SFNumber
normalize sfn = case explode sfn of
Just result -> normalize result
Nothing -> case split sfn of
Just result -> normalize result
Nothing -> sfn
sfAdd :: SFNumber -> SFNumber -> SFNumber
sfAdd x y = normalize (Pair x y)
magnitude :: SFNumber -> Int
magnitude (Regular n) = n
magnitude (Pair x y) = 3 * magnitude x + 2 * magnitude y
main :: IO ()
main = pure ()
main = do
input <- map (read @SFNumber) . lines <$> readFile "data/snailfish.txt"
print . maximum $
[ magnitude $ sfAdd x y
| x <- input
, y <- input
, x /= y
]
[[[0,[5,8]],[[1,7],[9,6]]],[[4,[1,2]],[[1,4],2]]]
[[[5,[2,8]],4],[5,[[9,9],0]]]
[6,[[[6,2],[5,6]],[[7,6],[4,7]]]]
[[[6,[0,7]],[0,9]],[4,[9,[9,0]]]]
[[[7,[6,4]],[3,[1,3]]],[[[5,5],1],9]]
[[6,[[7,3],[3,2]]],[[[3,8],[5,7]],4]]
[[[[5,4],[7,7]],8],[[8,3],8]]
[[9,3],[[9,9],[6,[4,9]]]]
[[2,[[7,7],7]],[[5,8],[[9,3],[0,2]]]]
[[[[5,2],5],[8,[3,7]]],[[5,[7,5]],[4,4]]]
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment