Done day 11
authorNeil Smith <NeilNjae@users.noreply.github.com>
Wed, 14 Dec 2022 16:47:29 +0000 (16:47 +0000)
committerNeil Smith <NeilNjae@users.noreply.github.com>
Wed, 14 Dec 2022 16:47:29 +0000 (16:47 +0000)
advent-of-code22.cabal
advent11/Main.hs
problems/day11.html [new file with mode: 0644]

index cb1bf56e502d5688d3fe12c8a47620753dec82c2..7d2936144e0c6bba6fc6f7663ce648f83e0c9b41 100644 (file)
@@ -154,4 +154,4 @@ executable advent10
 executable advent11
   import: common-extensions, build-directives
   main-is: advent11/Main.hs
-  build-depends: text, attoparsec, containers, lens
+  build-depends: text, attoparsec, containers, lens, mtl
index 98e80f4fd6c795aebbcd5c19bdd2232bfaf29760..42b0a5865d49096a46a93b40b8fb280b8319746d 100644 (file)
@@ -7,12 +7,12 @@ import Data.Attoparsec.Text hiding (take, D)
 import Control.Applicative
 import Data.List
 import qualified Data.IntMap as M
+import Data.IntMap ((!))
 import Control.Lens
-
-data Expression = Expression Operation Operand
-  deriving (Show, Eq)
-data Operation = Plus | Times deriving (Show, Eq)
-data Operand = Literal Int | Old deriving (Show, Eq)
+import Control.Monad.State.Strict
+import Control.Monad.Reader
+import Control.Monad.Writer
+import Control.Monad.RWS.Strict
 
 data MonkeyCode = MonkeyCode
   { _operation :: Expression
@@ -21,54 +21,127 @@ data MonkeyCode = MonkeyCode
   , _falseTarget :: Int
   }
   deriving (Show, Eq)
-makeLenses ''MonkeyCode
 
-type MoneyDescription = M.IntMap MonkeyCode
+data Expression = Expression Operator Operand deriving (Show, Eq)
+data Operator = Plus | Times deriving (Show, Eq)
+data Operand = Literal Int | Old deriving (Show, Eq)
+
+type MonkeyCodes = M.IntMap MonkeyCode
+data MonkeyDescription = MonkeyDescription { _limit :: Int -> Int
+                                           , _codes :: MonkeyCodes
+                                           }
 type MonkeyHolds = M.IntMap [Int]
+data MonkeyLog = MonkeyLog Int Int -- monkey ID, number of items handled this round
+  deriving (Show, Eq)
 
+type MonkeyHandler = RWS MonkeyDescription [MonkeyLog] MonkeyHolds
+
+makeLenses ''MonkeyCode
 
 main :: IO ()
 main = 
   do  dataFileName <- getDataFileName
       text <- TIO.readFile dataFileName
-      let monkeys = successfulParse text
-      print monkeys
-      -- let steps = expandPath path
-      -- print $ part1 steps
-      -- print $ part2 steps
+      let (monkeyCode, monkeyHold) = successfulParse text
+      print $ part1 monkeyCode monkeyHold
+      print $ part2 monkeyCode monkeyHold
 
--- part1, part2 :: Path -> Int
--- part1 steps = S.size $ rope ^. trace
---   where rope = ropeSteps (newRope 1) steps
+part1, part2 :: MonkeyCodes -> MonkeyHolds -> Int
+part1 monkeyCode monkeyHold = monkeyBusinessLevel logs
+  where monkeyDesc = MonkeyDescription { _limit = (`div` 3)
+                                       , _codes = monkeyCode
+                                       }
+        (_, logs) =  execRWS (replicateM_ 20 throwRound) 
+                             monkeyDesc monkeyHold
 
+part2 monkeyCode monkeyHold = monkeyBusinessLevel logs
+  where monkeyDesc = MonkeyDescription { _limit = (`mod` threshold)
+                                       , _codes = monkeyCode
+                                       }
+        (_, logs) =  execRWS (replicateM_ 10000 throwRound) 
+                             monkeyDesc monkeyHold
+        threshold = product $ monkeyCode ^.. folded . test
 
--- Parse the input file
+throwRound :: MonkeyHandler ()
+throwRound =
+  do mIds <- gets M.keys
+     mapM_ throwItems mIds
 
--- pathP :: Parser [Direction]
--- directionP, upP, leftP, downP, rightP :: Parser Direction
+throwItems :: Int -> MonkeyHandler ()
+throwItems mId = 
+  do items <- gets (! mId)
+     mapM_ (throwItem mId) items
+     modify (M.insert mId [])
+     tell [MonkeyLog mId (length items)]
 
+throwItem :: Int -> Int -> MonkeyHandler ()
+throwItem mId currentWorry = 
+  do  monkey <- asks ((! mId) . _codes)
+      threshold <- asks _limit
+      let newWorry = updateWorry currentWorry (monkey ^. operation) threshold
+      let testResult = worryTest (monkey ^. test) newWorry
+      let recipient = if testResult 
+                      then (monkey ^. trueTarget)
+                      else (monkey ^. falseTarget)
+      modify (receivesItem recipient newWorry)
+
+updateWorry :: Int -> Expression -> (Int -> Int) -> Int
+updateWorry current (Expression operator operand) threshold
+  | operator == Plus  = threshold (current + n) 
+  | operator == Times = threshold (current * n) 
+  where n = evalOperand operand
+        evalOperand (Literal k) = k
+        evalOperand Old = current
+
+worryTest :: Int -> Int -> Bool
+worryTest divisor worry = worry `mod` divisor == 0
+
+receivesItem :: Int -> Int -> MonkeyHolds -> MonkeyHolds
+receivesItem mId worry items = M.adjust (++ [worry]) mId items
+
+sumLogs :: [MonkeyLog] -> M.IntMap Int
+sumLogs logs = foldl' addCount M.empty logs
+  where addCount m (MonkeyLog mId n) 
+          | mId `M.member` m = M.adjust (+ n) mId m
+          | otherwise = M.insert mId n m
+
+monkeyBusinessLevel :: [MonkeyLog] -> Int
+monkeyBusinessLevel logs = prolifics!!0 * prolifics!!1
+  where prolifics = reverse $ sort $ M.elems $ sumLogs logs
+
+-- Parse the input file
+
+monkeysP :: Parser (MonkeyCodes, MonkeyHolds)
 monkeysP = makeMonkeyMaps <$> (monkeyP `sepBy` (endOfLine <* endOfLine))
   where makeMonkeyMaps monkeys = 
           ( M.fromList $ map fst monkeys
           , M.fromList $ map snd monkeys
           )
 
-monkeyP = mkMonkeyPair <$> mIdP <*> startingP <*> operationP <*> testP <*> trueTargetP <*> falseTargetP
+monkeyP :: Parser ((Int, MonkeyCode), (Int, [Int]))
+monkeyP = mkMonkeyPair <$> mIdP <*> startingP <*> operatorP 
+                       <*> testP <*> trueTargetP <*> falseTargetP
   where mkMonkeyPair mId holding _operation _test _trueTarget _falseTarget = 
           ((mId, MonkeyCode{..}), (mId, holding))
 
+mIdP, testP, trueTargetP, falseTargetP :: Parser Int
+startingP :: Parser [Int]
+operatorP, expressionP :: Parser Expression
+opP :: Parser Operator
+operandP :: Parser Operand 
+
 mIdP = ("Monkey " *> decimal) <* ":" <* endOfLine
 startingP = ("  Starting items: " *> (decimal `sepBy` ", ")) <* endOfLine
-operationP = ("  Operation: new = old " *> expressionP) <* endOfLine
+operatorP = ("  Operation: new = old " *> expressionP) <* endOfLine
 testP = ("  Test: divisible by " *> decimal) <* endOfLine
 trueTargetP = ("    If true: throw to monkey " *> decimal) <* endOfLine
 falseTargetP = ("    If false: throw to monkey " *> decimal)
 
-expressionP = Expression <$> (operatorP <* " ") <*> operandP
-operatorP = (Plus <$ "+") <|> (Times <$ "*")
+expressionP = Expression <$> (opP <* " ") <*> operandP
+opP = (Plus <$ "+") <|> (Times <$ "*")
 operandP = (Literal <$> decimal) <|> (Old <$ "old")
 
-successfulParse :: Text -> (MoneyDescription, MonkeyHolds)
+successfulParse :: Text -> (MonkeyCodes, MonkeyHolds)
 successfulParse input = 
   case parseOnly monkeysP input of
     Left  _err -> (M.empty, M.empty) -- TIO.putStr $ T.pack $ parseErrorPretty err
diff --git a/problems/day11.html b/problems/day11.html
new file mode 100644 (file)
index 0000000..f78381d
--- /dev/null
@@ -0,0 +1,406 @@
+<!DOCTYPE html>
+<html lang="en-us">
+<head>
+<meta charset="utf-8"/>
+<title>Day 11 - Advent of Code 2022</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?30"/>
+<link rel="stylesheet alternate" type="text/css" href="/static/highcontrast.css?0" title="High Contrast"/>
+<link rel="shortcut icon" href="/favicon.png"/>
+<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>
+</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="/2022/about">[About]</a></li><li><a href="/2022/events">[Events]</a></li><li><a href="https://teespring.com/stores/advent-of-code" target="_blank">[Shop]</a></li><li><a href="/2022/settings">[Settings]</a></li><li><a href="/2022/auth/logout">[Log Out]</a></li></ul></nav><div class="user">Neil Smith <a href="/2022/support" class="supporter-badge" title="Advent of Code Supporter">(AoC++)</a> <span class="star-count">22*</span></div></div><div><h1 class="title-event">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="title-event-wrap">/*</span><a href="/2022">2022</a><span class="title-event-wrap">*/</span></h1><nav><ul><li><a href="/2022">[Calendar]</a></li><li><a href="/2022/support">[AoC++]</a></li><li><a href="/2022/sponsors">[Sponsors]</a></li><li><a href="/2022/leaderboard">[Leaderboard]</a></li><li><a href="/2022/stats">[Stats]</a></li></ul></nav></div></header>
+
+<div id="sidebar">
+<div id="sponsor"><div class="quiet">Our <a href="/2022/sponsors">sponsors</a> help make Advent of Code possible:</div><div class="sponsor"><a href="https://www.exoscale.com/products/?utm_source=adventofcode&amp;utm_medium=referrer&amp;utm_campaign=ref-advent-2023" target="_blank" onclick="if(ga)ga('send','event','sponsor','sidebar',this.href);" rel="noopener">Exoscale</a> - Where to host your next application? Discover our simple and secure European cloud platform and get started in seconds. Happy coding!</div></div>
+</div><!--/sidebar-->
+
+<main>
+<article class="day-desc"><h2>--- Day 11: Monkey in the Middle ---</h2><p>As you finally start making your way upriver, you realize your pack is much lighter than you remember. Just then, one of the items from your pack goes flying overhead. Monkeys are playing <a href="https://en.wikipedia.org/wiki/Keep_away" target="_blank">Keep Away</a> with your missing things!</p>
+<p>To get your stuff back, you need to be able to predict where the monkeys will throw your items. After some careful observation, you realize the monkeys operate based on <em>how worried you are about each item</em>.</p>
+<p>You take some notes (your puzzle input) on the items each monkey currently has, how worried you are about those items, and how the monkey makes decisions based on your worry level. For example:</p>
+<pre><code>Monkey 0:
+  Starting items: 79, 98
+  Operation: new = old * 19
+  Test: divisible by 23
+    If true: throw to monkey 2
+    If false: throw to monkey 3
+
+Monkey 1:
+  Starting items: 54, 65, 75, 74
+  Operation: new = old + 6
+  Test: divisible by 19
+    If true: throw to monkey 2
+    If false: throw to monkey 0
+
+Monkey 2:
+  Starting items: 79, 60, 97
+  Operation: new = old * old
+  Test: divisible by 13
+    If true: throw to monkey 1
+    If false: throw to monkey 3
+
+Monkey 3:
+  Starting items: 74
+  Operation: new = old + 3
+  Test: divisible by 17
+    If true: throw to monkey 0
+    If false: throw to monkey 1
+</code></pre>
+<p>Each monkey has several attributes:</p>
+<ul>
+<li><code>Starting items</code> lists your <em>worry level</em> for each item the monkey is currently holding in the order they will be inspected.</li>
+<li><code>Operation</code> shows how your worry level changes as that monkey inspects an item. (An operation like <code>new = old * 5</code> means that your worry level after the monkey inspected the item is five times whatever your worry level was before inspection.)</li>
+<li><code>Test</code> shows how the monkey uses your worry level to decide where to throw an item next.
+  <ul>
+  <li><code>If true</code> shows what happens with an item if the <code>Test</code> was true.</li>
+  <li><code>If false</code> shows what happens with an item if the <code>Test</code> was false.</li>
+  </ul>
+</li>
+</ul>
+<p>After each monkey inspects an item but before it tests your worry level, your relief that the monkey's inspection didn't damage the item causes your worry level to be <em>divided by three</em> and rounded down to the nearest integer.</p>
+<p>The monkeys take turns inspecting and throwing items. On a single monkey's <em>turn</em>, it inspects and throws all of the items it is holding one at a time and in the order listed. Monkey <code>0</code> goes first, then monkey <code>1</code>, and so on until each monkey has had one turn. The process of each monkey taking a single turn is called a <em>round</em>.</p>
+<p>When a monkey throws an item to another monkey, the item goes on the <em>end</em> of the recipient monkey's list. A monkey that starts a round with no items could end up inspecting and throwing many items by the time its turn comes around. If a monkey is holding no items at the start of its turn, its turn ends.</p>
+<p>In the above example, the first round proceeds as follows:</p>
+<pre><code>Monkey 0:
+  Monkey inspects an item with a worry level of 79.
+    Worry level is multiplied by 19 to 1501.
+    Monkey gets bored with item. Worry level is divided by 3 to 500.
+    Current worry level is not divisible by 23.
+    Item with worry level 500 is thrown to monkey 3.
+  Monkey inspects an item with a worry level of 98.
+    Worry level is multiplied by 19 to 1862.
+    Monkey gets bored with item. Worry level is divided by 3 to 620.
+    Current worry level is not divisible by 23.
+    Item with worry level 620 is thrown to monkey 3.
+Monkey 1:
+  Monkey inspects an item with a worry level of 54.
+    Worry level increases by 6 to 60.
+    Monkey gets bored with item. Worry level is divided by 3 to 20.
+    Current worry level is not divisible by 19.
+    Item with worry level 20 is thrown to monkey 0.
+  Monkey inspects an item with a worry level of 65.
+    Worry level increases by 6 to 71.
+    Monkey gets bored with item. Worry level is divided by 3 to 23.
+    Current worry level is not divisible by 19.
+    Item with worry level 23 is thrown to monkey 0.
+  Monkey inspects an item with a worry level of 75.
+    Worry level increases by 6 to 81.
+    Monkey gets bored with item. Worry level is divided by 3 to 27.
+    Current worry level is not divisible by 19.
+    Item with worry level 27 is thrown to monkey 0.
+  Monkey inspects an item with a worry level of 74.
+    Worry level increases by 6 to 80.
+    Monkey gets bored with item. Worry level is divided by 3 to 26.
+    Current worry level is not divisible by 19.
+    Item with worry level 26 is thrown to monkey 0.
+Monkey 2:
+  Monkey inspects an item with a worry level of 79.
+    Worry level is multiplied by itself to 6241.
+    Monkey gets bored with item. Worry level is divided by 3 to 2080.
+    Current worry level is divisible by 13.
+    Item with worry level 2080 is thrown to monkey 1.
+  Monkey inspects an item with a worry level of 60.
+    Worry level is multiplied by itself to 3600.
+    Monkey gets bored with item. Worry level is divided by 3 to 1200.
+    Current worry level is not divisible by 13.
+    Item with worry level 1200 is thrown to monkey 3.
+  Monkey inspects an item with a worry level of 97.
+    Worry level is multiplied by itself to 9409.
+    Monkey gets bored with item. Worry level is divided by 3 to 3136.
+    Current worry level is not divisible by 13.
+    Item with worry level 3136 is thrown to monkey 3.
+Monkey 3:
+  Monkey inspects an item with a worry level of 74.
+    Worry level increases by 3 to 77.
+    Monkey gets bored with item. Worry level is divided by 3 to 25.
+    Current worry level is not divisible by 17.
+    Item with worry level 25 is thrown to monkey 1.
+  Monkey inspects an item with a worry level of 500.
+    Worry level increases by 3 to 503.
+    Monkey gets bored with item. Worry level is divided by 3 to 167.
+    Current worry level is not divisible by 17.
+    Item with worry level 167 is thrown to monkey 1.
+  Monkey inspects an item with a worry level of 620.
+    Worry level increases by 3 to 623.
+    Monkey gets bored with item. Worry level is divided by 3 to 207.
+    Current worry level is not divisible by 17.
+    Item with worry level 207 is thrown to monkey 1.
+  Monkey inspects an item with a worry level of 1200.
+    Worry level increases by 3 to 1203.
+    Monkey gets bored with item. Worry level is divided by 3 to 401.
+    Current worry level is not divisible by 17.
+    Item with worry level 401 is thrown to monkey 1.
+  Monkey inspects an item with a worry level of 3136.
+    Worry level increases by 3 to 3139.
+    Monkey gets bored with item. Worry level is divided by 3 to 1046.
+    Current worry level is not divisible by 17.
+    Item with worry level 1046 is thrown to monkey 1.
+</code></pre>
+<p>After round 1, the monkeys are holding items with these worry levels:</p>
+<pre><code>Monkey 0: 20, 23, 27, 26
+Monkey 1: 2080, 25, 167, 207, 401, 1046
+Monkey 2: 
+Monkey 3: 
+</code></pre>
+<p>Monkeys 2 and 3 aren't holding any items at the end of the round; they both inspected items during the round and threw them all before the round ended.</p>
+<p>This process continues for a few more rounds:</p>
+<pre><code>After round 2, the monkeys are holding items with these worry levels:
+Monkey 0: 695, 10, 71, 135, 350
+Monkey 1: 43, 49, 58, 55, 362
+Monkey 2: 
+Monkey 3: 
+
+After round 3, the monkeys are holding items with these worry levels:
+Monkey 0: 16, 18, 21, 20, 122
+Monkey 1: 1468, 22, 150, 286, 739
+Monkey 2: 
+Monkey 3: 
+
+After round 4, the monkeys are holding items with these worry levels:
+Monkey 0: 491, 9, 52, 97, 248, 34
+Monkey 1: 39, 45, 43, 258
+Monkey 2: 
+Monkey 3: 
+
+After round 5, the monkeys are holding items with these worry levels:
+Monkey 0: 15, 17, 16, 88, 1037
+Monkey 1: 20, 110, 205, 524, 72
+Monkey 2: 
+Monkey 3: 
+
+After round 6, the monkeys are holding items with these worry levels:
+Monkey 0: 8, 70, 176, 26, 34
+Monkey 1: 481, 32, 36, 186, 2190
+Monkey 2: 
+Monkey 3: 
+
+After round 7, the monkeys are holding items with these worry levels:
+Monkey 0: 162, 12, 14, 64, 732, 17
+Monkey 1: 148, 372, 55, 72
+Monkey 2: 
+Monkey 3: 
+
+After round 8, the monkeys are holding items with these worry levels:
+Monkey 0: 51, 126, 20, 26, 136
+Monkey 1: 343, 26, 30, 1546, 36
+Monkey 2: 
+Monkey 3: 
+
+After round 9, the monkeys are holding items with these worry levels:
+Monkey 0: 116, 10, 12, 517, 14
+Monkey 1: 108, 267, 43, 55, 288
+Monkey 2: 
+Monkey 3: 
+
+After round 10, the monkeys are holding items with these worry levels:
+Monkey 0: 91, 16, 20, 98
+Monkey 1: 481, 245, 22, 26, 1092, 30
+Monkey 2: 
+Monkey 3: 
+
+...
+
+After round 15, the monkeys are holding items with these worry levels:
+Monkey 0: 83, 44, 8, 184, 9, 20, 26, 102
+Monkey 1: 110, 36
+Monkey 2: 
+Monkey 3: 
+
+...
+
+After round 20, the monkeys are holding items with these worry levels:
+Monkey 0: 10, 12, 14, 26, 34
+Monkey 1: 245, 93, 53, 199, 115
+Monkey 2: 
+Monkey 3: 
+</code></pre>
+<p>Chasing all of the monkeys at once is impossible; you're going to have to focus on the <em>two most active</em> monkeys if you want any hope of getting your stuff back. Count the <em>total number of times each monkey inspects items</em> over 20 rounds:</p>
+<pre><code><em>Monkey 0 inspected items 101 times.</em>
+Monkey 1 inspected items 95 times.
+Monkey 2 inspected items 7 times.
+<em>Monkey 3 inspected items 105 times.</em>
+</code></pre>
+<p>In this example, the two most active monkeys inspected items 101 and 105 times. The level of <em>monkey business</em> in this situation can be found by multiplying these together: <code><em>10605</em></code>.</p>
+<p>Figure out which monkeys to chase by counting how many items they inspect over 20 rounds. <em>What is the level of monkey business after 20 rounds of stuff-slinging simian shenanigans?</em></p>
+</article>
+<p>Your puzzle answer was <code>112815</code>.</p><article class="day-desc"><h2 id="part2">--- Part Two ---</h2><p>You're worried you might not ever get your items back. So worried, in fact, that your relief that a monkey's inspection didn't damage an item <em>no longer causes your worry level to be divided by three</em>.</p>
+<p>Unfortunately, that relief was all that was keeping your worry levels from reaching <em>ridiculous levels</em>. You'll need to <em>find another way to keep your worry levels manageable</em>.</p>
+<p>At this rate, you might be putting up with these monkeys for a <em>very long time</em> - possibly <em><code>10000</code> rounds</em>!</p>
+<p>With these new rules, you can still figure out the <span title="Monkey business monkey business monkey business, monkey numbers... is this working?">monkey business</span> after 10000 rounds. Using the same example above:</p>
+<pre><code>== After round 1 ==
+Monkey 0 inspected items 2 times.
+Monkey 1 inspected items 4 times.
+Monkey 2 inspected items 3 times.
+Monkey 3 inspected items 6 times.
+
+== After round 20 ==
+Monkey 0 inspected items 99 times.
+Monkey 1 inspected items 97 times.
+Monkey 2 inspected items 8 times.
+Monkey 3 inspected items 103 times.
+
+== After round 1000 ==
+Monkey 0 inspected items 5204 times.
+Monkey 1 inspected items 4792 times.
+Monkey 2 inspected items 199 times.
+Monkey 3 inspected items 5192 times.
+
+== After round 2000 ==
+Monkey 0 inspected items 10419 times.
+Monkey 1 inspected items 9577 times.
+Monkey 2 inspected items 392 times.
+Monkey 3 inspected items 10391 times.
+
+== After round 3000 ==
+Monkey 0 inspected items 15638 times.
+Monkey 1 inspected items 14358 times.
+Monkey 2 inspected items 587 times.
+Monkey 3 inspected items 15593 times.
+
+== After round 4000 ==
+Monkey 0 inspected items 20858 times.
+Monkey 1 inspected items 19138 times.
+Monkey 2 inspected items 780 times.
+Monkey 3 inspected items 20797 times.
+
+== After round 5000 ==
+Monkey 0 inspected items 26075 times.
+Monkey 1 inspected items 23921 times.
+Monkey 2 inspected items 974 times.
+Monkey 3 inspected items 26000 times.
+
+== After round 6000 ==
+Monkey 0 inspected items 31294 times.
+Monkey 1 inspected items 28702 times.
+Monkey 2 inspected items 1165 times.
+Monkey 3 inspected items 31204 times.
+
+== After round 7000 ==
+Monkey 0 inspected items 36508 times.
+Monkey 1 inspected items 33488 times.
+Monkey 2 inspected items 1360 times.
+Monkey 3 inspected items 36400 times.
+
+== After round 8000 ==
+Monkey 0 inspected items 41728 times.
+Monkey 1 inspected items 38268 times.
+Monkey 2 inspected items 1553 times.
+Monkey 3 inspected items 41606 times.
+
+== After round 9000 ==
+Monkey 0 inspected items 46945 times.
+Monkey 1 inspected items 43051 times.
+Monkey 2 inspected items 1746 times.
+Monkey 3 inspected items 46807 times.
+
+== After round 10000 ==
+<em>Monkey 0 inspected items 52166 times.</em>
+Monkey 1 inspected items 47830 times.
+Monkey 2 inspected items 1938 times.
+<em>Monkey 3 inspected items 52013 times.</em>
+</code></pre>
+<p>After 10000 rounds, the two most active monkeys inspected items 52166 and 52013 times. Multiplying these together, the level of <em>monkey business</em> in this situation is now <code><em>2713310158</em></code>.</p>
+<p>Worry levels are no longer divided by three after each item is inspected; you'll need to find another way to keep your worry levels manageable. Starting again from the initial state in your puzzle input, <em>what is the level of monkey business after 10000 rounds?</em></p>
+</article>
+<p>Your puzzle answer was <code>25738411485</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="/2022">return to your Advent calendar</a> and try another puzzle.</p>
+<p>If you still want to see it, you can <a href="11/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+%22Monkey+in+the+Middle%22+%2D+Day+11+%2D+Advent+of+Code+2022&amp;url=https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F11&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+%22Monkey+in+the+Middle%22+%2D+Day+11+%2D+Advent+of+Code+2022+%23AdventOfCode+https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F11'}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