Done day 18
authorNeil Smith <neil.git@njae.me.uk>
Sun, 19 Dec 2021 23:05:32 +0000 (23:05 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Sun, 19 Dec 2021 23:05:32 +0000 (23:05 +0000)
advent-of-code21.cabal
advent17/Main.hs
advent18/Main.hs [new file with mode: 0644]
data/advent18.txt [new file with mode: 0644]
data/advent18a.txt [new file with mode: 0644]
data/advent18b.txt [new file with mode: 0644]
problems/day18.html [new file with mode: 0644]

index 86523234e1571d96eb203b04c28f22aa3877e4bd..3154f15be8763b4983fe3f18c5b790426ed82375 100644 (file)
@@ -191,3 +191,8 @@ executable advent17
   import: common-extensions, build-directives
   main-is: advent17/Main.hs
   build-depends: linear, text, attoparsec, lens
+
+executable advent18
+  import: common-extensions, build-directives
+  main-is: advent18/Main.hs
+  build-depends: text, attoparsec
\ No newline at end of file
index b6a4dab247e1618d07ba1ea0db3a3ce6ab21c2d2..2d1cf6b4f07a72f2bcfa6163a2052d13df7581c6 100644 (file)
@@ -44,7 +44,7 @@ findYMax (V2 _ y, _) = y' * (y' - 1) `div` 2
 step :: Probe -> Probe
 step probe = probe & pos .~ (probe ^. pos ^+^ probe ^. vel) & vel .~ vel'
   where vel' = V2 (max 0 (vx - 1)) (vy - 1)
-        V2 vx vy = _vel
+        V2 vx vy = probe ^. vel
         -- v = probe ^. vel
         -- vel' = v & _x .~ (max 0 ((v ^. _x) - 1)) & _y .~ ((v ^. _y) - 1)
 
diff --git a/advent18/Main.hs b/advent18/Main.hs
new file mode 100644 (file)
index 0000000..0eb9ac8
--- /dev/null
@@ -0,0 +1,163 @@
+-- Writeup at https://work.njae.me.uk/2021/12/19/advent-of-code-2021-day-17/
+
+import Data.Text ()
+import qualified Data.Text.IO as TIO
+import Data.Attoparsec.Text 
+import Control.Applicative
+import Data.Maybe
+import Data.List
+
+data Tree = Pair Tree Tree | Leaf Int
+  deriving (Show, Eq)
+
+data Cxt = Top | L Cxt Tree | R Tree Cxt
+  deriving (Show, Eq)
+
+-- type Context = [(Direction, Tree)]
+-- data Direction = Lft | Rght
+--   deriving (Show, Eq)
+
+type Loc = (Tree, Cxt)
+
+main :: IO ()
+main = 
+  do  text <- TIO.readFile "data/advent18.txt"
+      let numbers = successfulParse text
+      print $ part1 numbers
+      print $ part2 numbers
+
+part1 numbers = magnitude total
+  where total = foldl1' snailAdd numbers
+
+part2 numbers = maximum [ magnitude $ snailAdd a b 
+                        | a <- numbers, b <- numbers]
+
+magnitude :: Tree -> Int
+magnitude (Leaf n) = n
+magnitude (Pair a b) = 3 * (magnitude a) + 2 * (magnitude b)
+
+
+left :: Loc -> Loc
+left (Pair l r, c) = (l, L c r)
+
+right :: Loc -> Loc
+right (Pair l r, c) = (r, R l c)
+
+top :: Tree -> Loc
+top t = (t, Top)
+
+up :: Loc -> Loc
+up (t, Top) = (t, Top)
+up (t, L c r) = (Pair t r, c)
+up (t, R l c) = (Pair l t, c)
+
+upmost :: Loc -> Loc
+upmost l@(t, Top) = l
+upmost l = upmost (up l)
+
+modify :: Loc -> (Tree -> Tree) -> Loc
+modify (t, c) f = (f t, c)
+
+
+explode :: Tree -> Maybe Tree
+explode num = 
+  case mp0 of
+    Nothing -> Nothing 
+    Just _ -> Just num1
+  where 
+    mp0 = pairAtDepth 4 num
+    p0 = fromJust mp0
+    ((Pair (Leaf nl) (Leaf nr)), _) = p0
+    p1 = case rightmostOnLeft p0 of
+      Nothing -> p0
+      Just leftReg -> modify leftReg (\(Leaf n) -> Leaf (n + nl))
+    p2 = case pairAtDepthC 4 (upmost p1) >>= leftmostOnRight of
+      Nothing -> p1
+      Just rightReg -> modify rightReg (\(Leaf n) -> Leaf (n + nr))
+    p3 = case pairAtDepthC 4 (upmost p2) of
+      Nothing -> p2
+      Just centrePair -> modify centrePair (\_ -> Leaf 0)
+    (num1, _) = upmost p3
+
+pairAtDepth :: Int -> Tree -> Maybe Loc
+pairAtDepth n t = pairAtDepthC n (top t)
+
+pairAtDepthC :: Int -> Loc -> Maybe Loc
+pairAtDepthC _ (Leaf _, _) = Nothing
+pairAtDepthC 0 t@(Pair _ _, _) = Just t
+pairAtDepthC n t@(Pair _ _, _) = 
+  pairAtDepthC (n - 1) (left t) <|> pairAtDepthC (n - 1) (right t)
+
+rightmostOnLeft :: Loc -> Maybe Loc
+rightmostOnLeft (_, Top) = Nothing
+rightmostOnLeft t@(_, L c r) = rightmostOnLeft $ up t
+rightmostOnLeft t@(_, R l c) = Just $ rightmostNum $ left $ up t
+
+rightmostNum :: Loc -> Loc
+rightmostNum t@(Leaf _, _) = t
+rightmostNum t@(Pair _ _, _) = rightmostNum $ right t
+
+leftmostOnRight :: Loc -> Maybe Loc
+leftmostOnRight (_, Top) = Nothing
+leftmostOnRight t@(_, R l c) = leftmostOnRight $ up t
+leftmostOnRight t@(_, L c r) = Just $ leftmostNum $ right $ up t
+
+leftmostNum :: Loc -> Loc
+leftmostNum t@(Leaf _, _) = t
+leftmostNum t@(Pair _ _, _) = leftmostNum $ left t
+
+split :: Tree -> Maybe Tree
+split num =
+  case mn0 of
+    Nothing -> Nothing
+    Just _ -> Just num1
+  where
+    mn0 = splittable num
+    n0 = fromJust mn0
+    ((Leaf sn), _) = n0
+    ln = sn `div` 2
+    rn = ln + sn `mod` 2
+    n1 = modify n0 (\_ -> Pair (Leaf ln) (Leaf rn))
+    (num1, _) = upmost n1
+
+splittable :: Tree -> Maybe Loc
+splittable t = splittableC (top t)
+
+splittableC :: Loc -> Maybe Loc
+splittableC t@(Leaf n, _)
+  | n >= 10 = Just t
+  | otherwise = Nothing
+splittableC t@(Pair _ _, _) = splittableC (left t) <|> splittableC (right t)
+
+
+reduce :: Tree -> Tree
+reduce num = splt
+  where 
+    expl = case (explode num) of
+            Nothing -> num
+            Just eres -> reduce eres
+    splt = case (split expl) of
+            Nothing -> expl
+            Just sres -> reduce sres
+
+snailAdd :: Tree -> Tree -> Tree
+snailAdd a b = reduce $ Pair a b
+
+
+-- Parse the input file
+
+sfNumbersP = sfNumberP `sepBy` endOfLine
+
+sfNumberP = regularP <|> pairP
+
+regularP = Leaf <$> decimal
+pairP = Pair <$> ("[" *> sfNumberP) <*> ("," *> sfNumberP) <* "]"
+
+-- successfulParse :: Text -> (Integer, [Maybe Integer])
+successfulParse input = 
+  case parseOnly sfNumbersP input of
+    Left  _err -> [] -- TIO.putStr $ T.pack $ parseErrorPretty err
+    Right numbers -> numbers
+
+
+
diff --git a/data/advent18.txt b/data/advent18.txt
new file mode 100644 (file)
index 0000000..3ebba1e
--- /dev/null
@@ -0,0 +1,100 @@
+[[2,[[1,1],9]],[[0,[3,0]],[[1,6],[4,2]]]]
+[[8,[0,5]],[[[9,9],0],[[2,9],2]]]
+[[[[6,4],[5,8]],[[0,9],[6,5]]],[[5,1],4]]
+[[[9,[2,8]],[[0,2],[8,3]]],[[[5,6],[5,8]],[[4,8],2]]]
+[[0,[[0,1],[6,0]]],[[[6,4],1],[8,6]]]
+[[[[8,5],6],8],[[[9,1],[0,6]],[4,[2,4]]]]
+[7,[[4,3],[8,5]]]
+[[8,[1,[3,4]]],[[3,8],[0,1]]]
+[[[1,1],[[2,1],[0,3]]],[[7,[1,8]],[[3,8],[5,2]]]]
+[[2,[[4,6],[6,2]]],[[0,5],[3,7]]]
+[[[[9,8],[4,6]],[7,[9,1]]],[[[8,7],[4,7]],[[6,6],[8,1]]]]
+[[[2,[5,1]],[[0,4],3]],[[9,7],[[0,2],0]]]
+[[[[5,0],2],5],[[3,[5,8]],[5,[8,9]]]]
+[[6,[3,6]],[[[2,7],6],[[6,0],4]]]
+[[8,8],7]
+[[[[7,9],3],8],[[0,[1,7]],[[3,2],[4,5]]]]
+[[[1,1],[7,2]],[3,[4,[6,4]]]]
+[[[9,[6,6]],[[4,8],[1,3]]],[[[4,7],8],[[5,2],[3,8]]]]
+[[[6,[6,7]],[3,4]],5]
+[[[[0,0],2],9],[[[2,1],1],[5,[4,7]]]]
+[[[2,[9,8]],[5,8]],[[[3,4],6],[5,0]]]
+[[[7,[9,4]],[7,[7,2]]],[[1,[9,6]],1]]
+[[[[9,1],1],[4,[2,6]]],3]
+[[0,[8,[3,4]]],[8,[9,8]]]
+[[[1,6],[6,7]],[[[0,4],1],7]]
+[[6,[5,[0,0]]],[7,[[5,4],1]]]
+[[2,[[9,5],[9,1]]],[[3,0],4]]
+[[[5,7],[[1,0],[3,5]]],[4,[5,[4,0]]]]
+[[3,3],[2,2]]
+[[[[6,2],[1,7]],[1,7]],[[[6,7],6],9]]
+[[[[9,8],[8,8]],[2,1]],[[8,4],8]]
+[[[[1,4],1],[2,0]],[4,[[0,5],5]]]
+[[[7,[6,0]],[[7,3],1]],9]
+[[[[2,4],0],[[6,9],8]],[[3,[0,9]],[[4,4],[5,4]]]]
+[[7,3],[0,[2,[7,2]]]]
+[[[[8,8],5],9],[[8,6],6]]
+[[[[9,5],7],9],0]
+[[[1,4],8],[[7,[5,3]],[[6,4],6]]]
+[[9,[[9,3],[3,7]]],[[[6,9],1],[[2,3],[4,4]]]]
+[[4,[9,2]],[3,4]]
+[[1,[[0,9],2]],[1,[1,[8,7]]]]
+[[[4,1],8],[9,[9,[2,9]]]]
+[[[[7,9],[9,7]],8],[[[3,0],5],[[7,8],[3,1]]]]
+[[[[9,4],[9,9]],[[9,5],[8,9]]],[[2,[7,4]],[[4,6],6]]]
+[[[[8,7],1],[6,8]],[[4,2],5]]
+[7,[3,[3,3]]]
+[[[4,9],[0,2]],[[[4,2],9],[[5,8],6]]]
+[[[[1,3],1],[[7,5],[4,0]]],[[[6,3],4],[[1,2],8]]]
+[[[[3,2],2],[4,7]],[[[5,6],[6,3]],3]]
+[[[[4,0],6],[4,2]],[7,5]]
+[[[[9,5],[2,0]],[[6,8],[0,9]]],[[[7,4],[3,6]],1]]
+[[[4,[9,3]],[[9,4],8]],[[6,[1,2]],2]]
+[[[[4,1],[1,1]],[[4,8],9]],[[[1,0],[0,3]],2]]
+[[[3,[3,8]],[[0,6],7]],[[2,5],9]]
+[[[0,[6,8]],[[2,7],[4,1]]],6]
+[[6,3],0]
+[[[3,[7,1]],[3,[2,0]]],[[[3,5],9],[[5,2],[7,8]]]]
+[[7,8],[1,[[7,1],5]]]
+[[[9,[8,9]],2],[9,[[8,8],4]]]
+[[[8,[5,8]],[[9,1],[6,0]]],[[[9,1],[4,7]],8]]
+[5,[[[4,9],7],[[6,0],[9,0]]]]
+[[[[8,8],[6,7]],[[1,0],6]],[[5,[2,8]],[[8,0],[3,7]]]]
+[[0,[6,6]],[[0,1],[3,[9,2]]]]
+[[1,[0,[8,1]]],[[0,[0,0]],[8,[0,0]]]]
+[[[4,[1,4]],[8,[9,5]]],7]
+[7,[[[0,0],[4,3]],8]]
+[[[9,1],[[7,5],[9,2]]],[5,[9,0]]]
+[[[[2,0],9],[8,[3,0]]],[[9,8],[4,[0,7]]]]
+[4,[5,[5,[0,3]]]]
+[[6,[[6,9],8]],[1,[0,[6,0]]]]
+[[7,[4,3]],[[0,6],[[5,2],[6,9]]]]
+[[[[7,2],[4,6]],[[5,0],9]],6]
+[[[0,1],[0,2]],[0,[5,2]]]
+[[[[5,0],[5,4]],[[5,9],[9,9]]],[2,[[3,0],[8,1]]]]
+[[[[9,2],[2,9]],[[5,5],2]],[[1,3],[[3,6],[1,8]]]]
+[[0,[2,4]],[[[6,9],1],[[7,9],[9,8]]]]
+[[[[2,1],1],[7,3]],[4,[[1,2],[2,6]]]]
+[[[6,[0,1]],[[6,4],[4,2]]],[1,[[0,0],[9,7]]]]
+[[[[9,2],3],[9,8]],[[6,5],[7,[1,7]]]]
+[[3,9],7]
+[[[6,9],[[0,2],0]],[[[8,6],2],9]]
+[[[[2,2],2],[[6,7],7]],[[0,3],9]]
+[[[7,[2,7]],3],4]
+[[[[1,9],6],[0,7]],[[[2,2],1],2]]
+[9,9]
+[0,[9,[[4,1],1]]]
+[[[[7,6],1],2],[[[6,9],[9,1]],0]]
+[[[[4,3],[4,2]],3],[[5,[6,5]],[[2,6],0]]]
+[[[0,[5,1]],[6,[1,4]]],[5,[[8,1],3]]]
+[6,[9,6]]
+[[8,[9,[6,8]]],[[4,9],[[2,4],[7,1]]]]
+[[5,[[9,9],[3,3]]],[[[9,8],[5,0]],6]]
+[[6,7],1]
+[1,[4,[[9,6],0]]]
+[[[[9,8],[7,8]],[5,[4,6]]],[[[5,9],6],[[4,6],4]]]
+[[[2,7],4],[[[0,3],0],[[7,4],[7,4]]]]
+[7,[0,4]]
+[1,[3,2]]
+[[3,0],8]
+[[[3,2],5],8]
\ No newline at end of file
diff --git a/data/advent18a.txt b/data/advent18a.txt
new file mode 100644 (file)
index 0000000..20d54d0
--- /dev/null
@@ -0,0 +1,10 @@
+[[[0,[4,5]],[0,0]],[[[4,5],[2,6]],[9,5]]]
+[7,[[[3,7],[4,3]],[[6,3],[8,8]]]]
+[[2,[[0,8],[3,4]]],[[[6,7],1],[7,[1,6]]]]
+[[[[2,4],7],[6,[0,5]]],[[[6,8],[2,8]],[[2,1],[4,5]]]]
+[7,[5,[[3,8],[1,4]]]]
+[[2,[2,2]],[8,[8,1]]]
+[2,9]
+[1,[[[9,3],9],[[9,0],[0,7]]]]
+[[[5,[7,4]],7],1]
+[[[[4,2],2],6],[8,7]]
\ No newline at end of file
diff --git a/data/advent18b.txt b/data/advent18b.txt
new file mode 100644 (file)
index 0000000..2efedbf
--- /dev/null
@@ -0,0 +1,10 @@
+[[[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
diff --git a/problems/day18.html b/problems/day18.html
new file mode 100644 (file)
index 0000000..d172405
--- /dev/null
@@ -0,0 +1,275 @@
+<!DOCTYPE html>
+<html lang="en-us">
+<head>
+<meta charset="utf-8"/>
+<title>Day 18 - Advent of Code 2021</title>
+<!--[if lt IE 9]><script src="/static/html5.js"></script><![endif]-->
+<link href='//fonts.googleapis.com/css?family=Source+Code+Pro:300&subset=latin,latin-ext' rel='stylesheet' type='text/css'/>
+<link rel="stylesheet" type="text/css" href="/static/style.css?26"/>
+<link rel="stylesheet alternate" type="text/css" href="/static/highcontrast.css?0" title="High Contrast"/>
+<link rel="shortcut icon" href="/favicon.png"/>
+</head><!--
+
+
+
+
+Oh, hello!  Funny seeing you here.
+
+I appreciate your enthusiasm, but you aren't going to find much down here.
+There certainly aren't clues to any of the puzzles.  The best surprises don't
+even appear in the source until you unlock them for real.
+
+Please be careful with automated requests; I'm not a massive company, and I can
+only take so much traffic.  Please be considerate so that everyone gets to play.
+
+If you're curious about how Advent of Code works, it's running on some custom
+Perl code. Other than a few integrations (auth, analytics, social media), I
+built the whole thing myself, including the design, animations, prose, and all
+of the puzzles.
+
+The puzzles are most of the work; preparing a new calendar and a new set of
+puzzles each year takes all of my free time for 4-5 months. A lot of effort
+went into building this thing - I hope you're enjoying playing it as much as I
+enjoyed making it for you!
+
+If you'd like to hang out, I'm @ericwastl on Twitter.
+
+- Eric Wastl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-->
+<body>
+<header><div><h1 class="title-global"><a href="/">Advent of Code</a></h1><nav><ul><li><a href="/2021/about">[About]</a></li><li><a href="/2021/events">[Events]</a></li><li><a href="https://teespring.com/stores/advent-of-code" target="_blank">[Shop]</a></li><li><a href="/2021/settings">[Settings]</a></li><li><a href="/2021/auth/logout">[Log Out]</a></li></ul></nav><div class="user">Neil Smith <a href="/2021/support" class="supporter-badge" title="Advent of Code Supporter">(AoC++)</a> <span class="star-count">36*</span></div></div><div><h1 class="title-event">&nbsp;&nbsp;&nbsp;<span class="title-event-wrap">sub y{</span><a href="/2021">2021</a><span class="title-event-wrap">}</span></h1><nav><ul><li><a href="/2021">[Calendar]</a></li><li><a href="/2021/support">[AoC++]</a></li><li><a href="/2021/sponsors">[Sponsors]</a></li><li><a href="/2021/leaderboard">[Leaderboard]</a></li><li><a href="/2021/stats">[Stats]</a></li></ul></nav></div></header>
+
+<div id="sidebar">
+<div id="sponsor"><div class="quiet">Our <a href="/2021/sponsors">sponsors</a> help make Advent of Code possible:</div><div class="sponsor"><a href="https://www.careers.philips.com/global/en" target="_blank" onclick="if(ga)ga('send','event','sponsor','sidebar',this.href);" rel="noopener">Philips NV – DMIS</a> - Don&apos;t just challenge yourself, challenge the status quo</div></div>
+</div><!--/sidebar-->
+
+<main>
+<script>window.addEventListener('click', function(e,s,r){if(e.target.nodeName==='CODE'&&e.detail===3){s=window.getSelection();s.removeAllRanges();r=document.createRange();r.selectNodeContents(e.target);s.addRange(r);}});</script>
+<article class="day-desc"><h2>--- Day 18: Snailfish ---</h2><p>You descend into the ocean trench and encounter some <a href="https://en.wikipedia.org/wiki/Snailfish" target="_blank">snailfish</a>. They say they saw the sleigh keys! They'll even tell you which direction the keys went if you help one of the smaller snailfish with his <em><span title="Snailfish math is snailfish math!">math</span> homework</em>.</p>
+<p>Snailfish numbers aren't like regular numbers. Instead, every snailfish number is a <em>pair</em> - an ordered list of two elements. Each element of the pair can be either a regular number or another pair.</p>
+<p>Pairs are written as <code>[x,y]</code>, where <code>x</code> and <code>y</code> are the elements within the pair. Here are some example snailfish numbers, one snailfish number per line:</p>
+<pre><code>[1,2]
+[[1,2],3]
+[9,[8,7]]
+[[1,9],[8,5]]
+[[[[1,2],[3,4]],[[5,6],[7,8]]],9]
+[[[9,[3,8]],[[0,9],6]],[[[3,7],[4,9]],3]]
+[[[[1,3],[5,3]],[[1,3],[8,7]]],[[[4,9],[6,9]],[[8,2],[7,3]]]]
+</code></pre>
+<p>This snailfish homework is about <em>addition</em>. To add two snailfish numbers, form a pair from the left and right parameters of the addition operator. For example, <code>[1,2]</code> + <code>[[3,4],5]</code> becomes <code>[[1,2],[[3,4],5]]</code>.</p>
+<p>There's only one problem: <em>snailfish numbers must always be reduced</em>, and the process of adding two snailfish numbers can result in snailfish numbers that need to be reduced.</p>
+<p>To <em>reduce a snailfish number</em>, you must repeatedly do the first action in this list that applies to the snailfish number:</p>
+<ul>
+<li>If any pair is <em>nested inside four pairs</em>, the leftmost such pair <em>explodes</em>.</li>
+<li>If any regular number is <em>10 or greater</em>, the leftmost such regular number <em>splits</em>.</li>
+</ul>
+<p>Once no action in the above list applies, the snailfish number is reduced.</p>
+<p>During reduction, at most one action applies, after which the process returns to the top of the list of actions. For example, if <em>split</em> produces a pair that meets the <em>explode</em> criteria, that pair <em>explodes</em> before other <em>splits</em> occur.</p>
+<p>To <em>explode</em> a pair, the pair's left value is added to the first regular number to the left of the exploding pair (if any), and the pair's right value is added to the first regular number to the right of the exploding pair (if any). Exploding pairs will always consist of two regular numbers. Then, the entire exploding pair is replaced with the regular number <code>0</code>.</p>
+<p>Here are some examples of a single explode action:</p>
+<ul>
+<li><code>[[[[<em>[9,8]</em>,1],2],3],4]</code> becomes <code>[[[[<em>0</em>,<em>9</em>],2],3],4]</code> (the <code>9</code> has no regular number to its left, so it is not added to any regular number).</li>
+<li><code>[7,[6,[5,[4,<em>[3,2]</em>]]]]</code> becomes <code>[7,[6,[5,[<em>7</em>,<em>0</em>]]]]</code> (the <code>2</code> has no regular number to its right, and so it is not added to any regular number).</li>
+<li><code>[[6,[5,[4,<em>[3,2]</em>]]],1]</code> becomes <code>[[6,[5,[<em>7</em>,<em>0</em>]]],<em>3</em>]</code>.</li>
+<li><code>[[3,[2,[1,<em>[7,3]</em>]]],[6,[5,[4,[3,2]]]]]</code> becomes <code>[[3,[2,[<em>8</em>,<em>0</em>]]],[<em>9</em>,[5,[4,[3,2]]]]]</code> (the pair <code>[3,2]</code> is unaffected because the pair <code>[7,3]</code> is further to the left; <code>[3,2]</code> would explode on the next action).</li>
+<li><code>[[3,[2,[8,0]]],[9,[5,[4,<em>[3,2]</em>]]]]</code> becomes <code>[[3,[2,[8,0]]],[9,[5,[<em>7</em>,<em>0</em>]]]]</code>.</li>
+</ul>
+<p>To <em>split</em> a regular number, replace it with a pair; the left element of the pair should be the regular number divided by two and rounded <em>down</em>, while the right element of the pair should be the regular number divided by two and rounded <em>up</em>. For example, <code>10</code> becomes <code>[5,5]</code>, <code>11</code> becomes <code>[5,6]</code>, <code>12</code> becomes <code>[6,6]</code>, and so on.</p>
+<p>Here is the process of finding the reduced result of <code>[[[[4,3],4],4],[7,[[8,4],9]]]</code> + <code>[1,1]</code>:</p>
+<pre><code>after addition: [[[[<em>[4,3]</em>,4],4],[7,[[8,4],9]]],[1,1]]
+after explode:  [[[[0,7],4],[7,[<em>[8,4]</em>,9]]],[1,1]]
+after explode:  [[[[0,7],4],[<em>15</em>,[0,13]]],[1,1]]
+after split:    [[[[0,7],4],[[7,8],[0,<em>13</em>]]],[1,1]]
+after split:    [[[[0,7],4],[[7,8],[0,<em>[6,7]</em>]]],[1,1]]
+after explode:  [[[[0,7],4],[[7,8],[6,0]]],[8,1]]
+</code></pre>
+<p>Once no reduce actions apply, the snailfish number that remains is the actual result of the addition operation: <code>[[[[0,7],4],[[7,8],[6,0]]],[8,1]]</code>.</p>
+<p>The homework assignment involves adding up a <em>list of snailfish numbers</em> (your puzzle input). The snailfish numbers are each listed on a separate line. Add the first snailfish number and the second, then add that result and the third, then add that result and the fourth, and so on until all numbers in the list have been used once.</p>
+<p>For example, the final sum of this list is <code>[[[[1,1],[2,2]],[3,3]],[4,4]]</code>:</p>
+<pre><code>[1,1]
+[2,2]
+[3,3]
+[4,4]
+</code></pre>
+<p>The final sum of this list is <code>[[[[3,0],[5,3]],[4,4]],[5,5]]</code>:</p>
+<pre><code>[1,1]
+[2,2]
+[3,3]
+[4,4]
+[5,5]
+</code></pre>
+<p>The final sum of this list is <code>[[[[5,0],[7,4]],[5,5]],[6,6]]</code>:</p>
+<pre><code>[1,1]
+[2,2]
+[3,3]
+[4,4]
+[5,5]
+[6,6]
+</code></pre>
+<p>Here's a slightly larger example:</p>
+<pre><code>[[[0,[4,5]],[0,0]],[[[4,5],[2,6]],[9,5]]]
+[7,[[[3,7],[4,3]],[[6,3],[8,8]]]]
+[[2,[[0,8],[3,4]]],[[[6,7],1],[7,[1,6]]]]
+[[[[2,4],7],[6,[0,5]]],[[[6,8],[2,8]],[[2,1],[4,5]]]]
+[7,[5,[[3,8],[1,4]]]]
+[[2,[2,2]],[8,[8,1]]]
+[2,9]
+[1,[[[9,3],9],[[9,0],[0,7]]]]
+[[[5,[7,4]],7],1]
+[[[[4,2],2],6],[8,7]]
+</code></pre>
+<p>The final sum <code>[[[[8,7],[7,7]],[[8,6],[7,7]]],[[[0,7],[6,6]],[8,7]]]</code> is found after adding up the above snailfish numbers:</p>
+<pre><code>  [[[0,[4,5]],[0,0]],[[[4,5],[2,6]],[9,5]]]
++ [7,[[[3,7],[4,3]],[[6,3],[8,8]]]]
+= [[[[4,0],[5,4]],[[7,7],[6,0]]],[[8,[7,7]],[[7,9],[5,0]]]]
+
+  [[[[4,0],[5,4]],[[7,7],[6,0]]],[[8,[7,7]],[[7,9],[5,0]]]]
++ [[2,[[0,8],[3,4]]],[[[6,7],1],[7,[1,6]]]]
+= [[[[6,7],[6,7]],[[7,7],[0,7]]],[[[8,7],[7,7]],[[8,8],[8,0]]]]
+
+  [[[[6,7],[6,7]],[[7,7],[0,7]]],[[[8,7],[7,7]],[[8,8],[8,0]]]]
++ [[[[2,4],7],[6,[0,5]]],[[[6,8],[2,8]],[[2,1],[4,5]]]]
+= [[[[7,0],[7,7]],[[7,7],[7,8]]],[[[7,7],[8,8]],[[7,7],[8,7]]]]
+
+  [[[[7,0],[7,7]],[[7,7],[7,8]]],[[[7,7],[8,8]],[[7,7],[8,7]]]]
++ [7,[5,[[3,8],[1,4]]]]
+= [[[[7,7],[7,8]],[[9,5],[8,7]]],[[[6,8],[0,8]],[[9,9],[9,0]]]]
+
+  [[[[7,7],[7,8]],[[9,5],[8,7]]],[[[6,8],[0,8]],[[9,9],[9,0]]]]
++ [[2,[2,2]],[8,[8,1]]]
+= [[[[6,6],[6,6]],[[6,0],[6,7]]],[[[7,7],[8,9]],[8,[8,1]]]]
+
+  [[[[6,6],[6,6]],[[6,0],[6,7]]],[[[7,7],[8,9]],[8,[8,1]]]]
++ [2,9]
+= [[[[6,6],[7,7]],[[0,7],[7,7]]],[[[5,5],[5,6]],9]]
+
+  [[[[6,6],[7,7]],[[0,7],[7,7]]],[[[5,5],[5,6]],9]]
++ [1,[[[9,3],9],[[9,0],[0,7]]]]
+= [[[[7,8],[6,7]],[[6,8],[0,8]]],[[[7,7],[5,0]],[[5,5],[5,6]]]]
+
+  [[[[7,8],[6,7]],[[6,8],[0,8]]],[[[7,7],[5,0]],[[5,5],[5,6]]]]
++ [[[5,[7,4]],7],1]
+= [[[[7,7],[7,7]],[[8,7],[8,7]]],[[[7,0],[7,7]],9]]
+
+  [[[[7,7],[7,7]],[[8,7],[8,7]]],[[[7,0],[7,7]],9]]
++ [[[[4,2],2],6],[8,7]]
+= [[[[8,7],[7,7]],[[8,6],[7,7]]],[[[0,7],[6,6]],[8,7]]]
+</code></pre>
+<p>To check whether it's the right answer, the snailfish teacher only checks the <em>magnitude</em> of the final sum. The magnitude of a pair is 3 times the magnitude of its left element plus 2 times the magnitude of its right element. The magnitude of a regular number is just that number.</p>
+<p>For example, the magnitude of <code>[9,1]</code> is <code>3*9 + 2*1 = <em>29</em></code>; the magnitude of <code>[1,9]</code> is <code>3*1 + 2*9 = <em>21</em></code>. Magnitude calculations are recursive: the magnitude of <code>[[9,1],[1,9]]</code> is <code>3*29 + 2*21 = <em>129</em></code>.</p>
+<p>Here are a few more magnitude examples:</p>
+<ul>
+<li><code>[[1,2],[[3,4],5]]</code> becomes <code><em>143</em></code>.</li>
+<li><code>[[[[0,7],4],[[7,8],[6,0]]],[8,1]]</code> becomes <code><em>1384</em></code>.</li>
+<li><code>[[[[1,1],[2,2]],[3,3]],[4,4]]</code> becomes <code><em>445</em></code>.</li>
+<li><code>[[[[3,0],[5,3]],[4,4]],[5,5]]</code> becomes <code><em>791</em></code>.</li>
+<li><code>[[[[5,0],[7,4]],[5,5]],[6,6]]</code> becomes <code><em>1137</em></code>.</li>
+<li><code>[[[[8,7],[7,7]],[[8,6],[7,7]]],[[[0,7],[6,6]],[8,7]]]</code> becomes <code><em>3488</em></code>.</li>
+</ul>
+<p>So, given this example homework assignment:</p>
+<pre><code>[[[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]]]
+</code></pre>
+<p>The final sum is:</p>
+<pre><code>[[[[6,6],[7,6]],[[7,7],[7,0]]],[[[7,7],[7,7]],[[7,8],[9,9]]]]</code></pre>
+<p>The magnitude of this final sum is <code><em>4140</em></code>.</p>
+<p>Add up all of the snailfish numbers from the homework assignment in the order they appear. <em>What is the magnitude of the final sum?</em></p>
+</article>
+<p>Your puzzle answer was <code>2501</code>.</p><article class="day-desc"><h2 id="part2">--- Part Two ---</h2><p>You notice a second question on the back of the homework assignment:</p>
+<p>What is the largest magnitude you can get from adding only two of the snailfish numbers?</p>
+<p>Note that snailfish addition is not <a href="https://en.wikipedia.org/wiki/Commutative_property" target="_blank">commutative</a> - that is, <code>x + y</code> and <code>y + x</code> can produce different results.</p>
+<p>Again considering the last example homework assignment above:</p>
+<pre><code>[[[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]]]
+</code></pre>
+<p>The largest magnitude of the sum of any two snailfish numbers in this list is <code><em>3993</em></code>. This is the magnitude of <code>[[2,[[7,7],7]],[[5,8],[[9,3],[0,2]]]]</code> + <code>[[[0,[5,8]],[[1,7],[9,6]]],[[4,[1,2]],[[1,4],2]]]</code>, which reduces to <code>[[[[7,8],[6,6]],[[6,0],[7,7]]],[[[7,8],[8,8]],[[7,9],[0,6]]]]</code>.</p>
+<p><em>What is the largest magnitude of any sum of two different snailfish numbers from the homework assignment?</em></p>
+</article>
+<p>Your puzzle answer was <code>4935</code>.</p><p class="day-success">Both parts of this puzzle are complete! They provide two gold stars: **</p>
+<p>At this point, you should <a href="/2021">return to your Advent calendar</a> and try another puzzle.</p>
+<p>If you still want to see it, you can <a href="18/input" target="_blank">get your puzzle input</a>.</p>
+<p>You can also <span class="share">[Share<span class="share-content">on
+  <a href="https://twitter.com/intent/tweet?text=I%27ve+completed+%22Snailfish%22+%2D+Day+18+%2D+Advent+of+Code+2021&amp;url=https%3A%2F%2Fadventofcode%2Ecom%2F2021%2Fday%2F18&amp;related=ericwastl&amp;hashtags=AdventOfCode" target="_blank">Twitter</a>
+  <a href="javascript:void(0);" onclick="var mastodon_instance=prompt('Mastodon Instance / Server Name?'); if(typeof mastodon_instance==='string' && mastodon_instance.length){this.href='https://'+mastodon_instance+'/share?text=I%27ve+completed+%22Snailfish%22+%2D+Day+18+%2D+Advent+of+Code+2021+%23AdventOfCode+https%3A%2F%2Fadventofcode%2Ecom%2F2021%2Fday%2F18'}else{return false;}" target="_blank">Mastodon</a
+></span>]</span> this puzzle.</p>
+</main>
+
+<!-- ga -->
+<script>
+(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+ga('create', 'UA-69522494-1', 'auto');
+ga('set', 'anonymizeIp', true);
+ga('send', 'pageview');
+</script>
+<!-- /ga -->
+</body>
+</html>
\ No newline at end of file