<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Kevin Tarta - Security Writeups]]></title><description><![CDATA[Computer Scientist & Security Enthusiast]]></description><link>https://ghost.kevintarta.com/</link><image><url>https://ghost.kevintarta.com/favicon.png</url><title>Kevin Tarta - Security Writeups</title><link>https://ghost.kevintarta.com/</link></image><generator>Ghost 5.54</generator><lastBuildDate>Sun, 03 May 2026 11:21:47 GMT</lastBuildDate><atom:link href="https://ghost.kevintarta.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[[HackTheBox] Intentions Writeup]]></title><description><![CDATA[First hard box of Season 2. This was a really fun challenge that featured attack surfaces you don't see everyday.

Encrypted with root hash until box retires as always.]]></description><link>https://ghost.kevintarta.com/intentions/</link><guid isPermaLink="false">64acd2380c8f330e8e92b215</guid><category><![CDATA[HackTheBox]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Tue, 11 Jul 2023 04:37:53 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2023/07/intentions.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: html--><script>
    var pageContents = "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";
</script><!--kg-card-end: html--><!--kg-card-begin: html--><span id="decryption-section" style="width:100%;text-align:center;">
    <img src="https://ghost.kevintarta.com/content/images/2023/07/intentions.jpeg" alt="[HackTheBox] Intentions Writeup"><p>Enter the root hash from <code>/etc/shadow</code> to see the writeup contents:</p>
    <div class="root-hash">
        <input type="text" name="roothash" id="roothash" required>
        <label>Root Hash</label>
    </div>
    <a class="decrypt" id="decrypt" onclick="return decrypt(event)">
        <span></span>
        <span></span>
        <span></span>
        <span></span>
        Decrypt
    </a>
</span><!--kg-card-end: html--><figure class="kg-card kg-embed-card"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">I solved this hard box over the weekend. Sadly one day after I would get points for it in the new competitive mode. Crazy that HackTheBox has &quot;competitive&quot; now.<a href="https://t.co/tduv03Dsbg?ref=ghost.kevintarta.com">https://t.co/tduv03Dsbg</a></p>&#x2014; kevin (@Elveskevtar) <a href="https://twitter.com/Elveskevtar/status/1678613146842398720?ref_src=twsrc%5Etfw&amp;ref=ghost.kevintarta.com">July 11, 2023</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</figure>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 25 | Sea Cucumber]]></title><description><![CDATA[Day 25 - A Christmas day freebie, only moderately difficult - sea cucumbers in a map going perpendicular in a river stream will all stop moving after x steps; solve for x 🥒]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-25/</link><guid isPermaLink="false">61d23f8a20bb83032e76e2fb</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Mon, 03 Jan 2022 00:26:15 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-16.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-17.png" class="kg-image" alt="[Advent of Code 2021] Day 25 | Sea Cucumber" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2022/01/adventofcode-17.png 600w, https://ghost.kevintarta.com/content/images/2022/01/adventofcode-17.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-16.png" alt="[Advent of Code 2021] Day 25 | Sea Cucumber"><p>This is it: the bottom of the ocean trench, the last place the sleigh keys could be. Your submarine&apos;s experimental antenna <em>still isn&apos;t boosted enough</em> to detect the keys, but they <em>must</em> be here. All you need to do is <em>reach the seafloor</em> and find them.</p><p>At least, you&apos;d touch down on the seafloor if you could; unfortunately, it&apos;s completely covered by two large herds of <a href="https://en.wikipedia.org/wiki/Sea_cucumber?ref=ghost.kevintarta.com">sea cucumbers</a>, and there isn&apos;t an open space large enough for your submarine.</p><p>You suspect that the Elves must have done this before, because just then you discover the phone number of a deep-sea marine biologist on a handwritten note taped to the wall of the submarine&apos;s cockpit.</p><p>&quot;Sea cucumbers? Yeah, they&apos;re probably hunting for food. But don&apos;t worry, they&apos;re predictable critters: they move in perfectly straight lines, only moving forward when there&apos;s space to do so. They&apos;re actually quite polite!&quot;</p><p>You explain that you&apos;d like to predict when you could land your submarine.</p><p>&quot;Oh that&apos;s easy, they&apos;ll eventually pile up and leave enough space for-- wait, did you say submarine? And the only place with that many sea cucumbers would be at the very bottom of the Mariana--&quot; You hang up the phone.</p><p>There are two herds of sea cucumbers sharing the same region; one always moves <em>east</em> (<code>&gt;</code>), while the other always moves <em>south</em> (<code>v</code>). Each location can contain at most one sea cucumber; the remaining locations are <em>empty</em> (<code>.</code>). The submarine helpfully generates a map of the situation (your puzzle input). For example:</p><pre><code>v...&gt;&gt;.vv&gt;
.vv&gt;&gt;.vv..
&gt;&gt;.&gt;v&gt;...v
&gt;&gt;v&gt;&gt;.&gt;.v.
v&gt;v.vv.v..
&gt;.&gt;&gt;..v...
.vv..&gt;.&gt;v.
v.v..&gt;&gt;v.v
....v..v.&gt;
</code></pre><p>Every <em>step</em>, the sea cucumbers in the east-facing herd attempt to move forward one location, then the sea cucumbers in the south-facing herd attempt to move forward one location. When a herd moves forward, every sea cucumber in the herd first simultaneously considers whether there is a sea cucumber in the adjacent location it&apos;s facing (even another sea cucumber facing the same direction), and then every sea cucumber facing an empty location simultaneously moves into that location.</p><p>So, in a situation like this:</p><pre><code>...&gt;&gt;&gt;&gt;&gt;...
</code></pre><p>After one step, only the rightmost sea cucumber would have moved:</p><pre><code>...&gt;&gt;&gt;&gt;.&gt;..
</code></pre><p>After the next step, two sea cucumbers move:</p><pre><code>...&gt;&gt;&gt;.&gt;.&gt;.
</code></pre><p>During a single step, the east-facing herd moves first, then the south-facing herd moves. So, given this situation:</p><pre><code>..........
.&gt;v....v..
.......&gt;..
..........
</code></pre><p>After a single step, of the sea cucumbers on the left, only the south-facing sea cucumber has moved (as it wasn&apos;t out of the way in time for the east-facing cucumber on the left to move), but both sea cucumbers on the right have moved (as the east-facing sea cucumber moved out of the way of the south-facing sea cucumber):</p><pre><code>..........
.&gt;........
..v....v&gt;.
..........
</code></pre><p>Due to <em>strong water currents</em> in the area, sea cucumbers that move off the right edge of the map appear on the left edge, and sea cucumbers that move off the bottom edge of the map appear on the top edge. Sea cucumbers always check whether their destination location is empty before moving, even if that destination is on the opposite side of the map:</p><pre><code>Initial state:
...&gt;...
.......
......&gt;
v.....&gt;
......&gt;
.......
..vvv..

After 1 step:
..vv&gt;..
.......
&gt;......
v.....&gt;
&gt;......
.......
....v..

After 2 steps:
....v&gt;.
..vv...
.&gt;.....
......&gt;
v&gt;.....
.......
.......

After 3 steps:
......&gt;
..v.v..
..&gt;v...
&gt;......
..&gt;....
v......
.......

After 4 steps:
&gt;......
..v....
..&gt;.v..
.&gt;.v...
...&gt;...
.......
v......
</code></pre><p>To find a safe place to land your submarine, the sea cucumbers need to stop moving. Again consider the first example:</p><pre><code>Initial state:
v...&gt;&gt;.vv&gt;
.vv&gt;&gt;.vv..
&gt;&gt;.&gt;v&gt;...v
&gt;&gt;v&gt;&gt;.&gt;.v.
v&gt;v.vv.v..
&gt;.&gt;&gt;..v...
.vv..&gt;.&gt;v.
v.v..&gt;&gt;v.v
....v..v.&gt;

After 1 step:
....&gt;.&gt;v.&gt;
v.v&gt;.&gt;v.v.
&gt;v&gt;&gt;..&gt;v..
&gt;&gt;v&gt;v&gt;.&gt;.v
.&gt;v.v...v.
v&gt;&gt;.&gt;vvv..
..v...&gt;&gt;..
vv...&gt;&gt;vv.
&gt;.v.v..v.v

After 2 steps:
&gt;.v.v&gt;&gt;..v
v.v.&gt;&gt;vv..
&gt;v&gt;.&gt;.&gt;.v.
&gt;&gt;v&gt;v.&gt;v&gt;.
.&gt;..v....v
.&gt;v&gt;&gt;.v.v.
v....v&gt;v&gt;.
.vv..&gt;&gt;v..
v&gt;.....vv.

After 3 steps:
v&gt;v.v&gt;.&gt;v.
v...&gt;&gt;.v.v
&gt;vv&gt;.&gt;v&gt;..
&gt;&gt;v&gt;v.&gt;.v&gt;
..&gt;....v..
.&gt;.&gt;v&gt;v..v
..v..v&gt;vv&gt;
v.v..&gt;&gt;v..
.v&gt;....v..

After 4 steps:
v&gt;..v.&gt;&gt;..
v.v.&gt;.&gt;.v.
&gt;vv.&gt;&gt;.v&gt;v
&gt;&gt;.&gt;..v&gt;.&gt;
..v&gt;v...v.
..&gt;&gt;.&gt;vv..
&gt;.v.vv&gt;v.v
.....&gt;&gt;vv.
vvv&gt;...v..

After 5 steps:
vv&gt;...&gt;v&gt;.
v.v.v&gt;.&gt;v.
&gt;.v.&gt;.&gt;.&gt;v
&gt;v&gt;.&gt;..v&gt;&gt;
..v&gt;v.v...
..&gt;.&gt;&gt;vvv.
.&gt;...v&gt;v..
..v.v&gt;&gt;v.v
v.v.&gt;...v.

...

After 10 steps:
..&gt;..&gt;&gt;vv.
v.....&gt;&gt;.v
..v.v&gt;&gt;&gt;v&gt;
v&gt;.&gt;v.&gt;&gt;&gt;.
..v&gt;v.vv.v
.v.&gt;&gt;&gt;.v..
v.v..&gt;v&gt;..
..v...&gt;v.&gt;
.vv..v&gt;vv.

...

After 20 steps:
v&gt;.....&gt;&gt;.
&gt;vv&gt;.....v
.&gt;v&gt;v.vv&gt;&gt;
v&gt;&gt;&gt;v.&gt;v.&gt;
....vv&gt;v..
.v.&gt;&gt;&gt;vvv.
..v..&gt;&gt;vv.
v.v...&gt;&gt;.v
..v.....v&gt;

...

After 30 steps:
.vv.v..&gt;&gt;&gt;
v&gt;...v...&gt;
&gt;.v&gt;.&gt;vv.&gt;
&gt;v&gt;.&gt;.&gt;v.&gt;
.&gt;..v.vv..
..v&gt;..&gt;&gt;v.
....v&gt;..&gt;v
v.v...&gt;vv&gt;
v.v...&gt;vvv

...

After 40 steps:
&gt;&gt;v&gt;v..v..
..&gt;&gt;v..vv.
..&gt;&gt;&gt;v.&gt;.v
..&gt;&gt;&gt;&gt;vvv&gt;
v.....&gt;...
v.v...&gt;v&gt;&gt;
&gt;vv.....v&gt;
.&gt;v...v.&gt;v
vvv.v..v.&gt;

...

After 50 steps:
..&gt;&gt;v&gt;vv.v
..v.&gt;&gt;vv..
v.&gt;&gt;v&gt;&gt;v..
..&gt;&gt;&gt;&gt;&gt;vv.
vvv....&gt;vv
..v....&gt;&gt;&gt;
v&gt;.......&gt;
.vv&gt;....v&gt;
.&gt;v.vv.v..

...

After 55 steps:
..&gt;&gt;v&gt;vv..
..v.&gt;&gt;vv..
..&gt;&gt;v&gt;&gt;vv.
..&gt;&gt;&gt;&gt;&gt;vv.
v......&gt;vv
v&gt;v....&gt;&gt;v
vvv...&gt;..&gt;
&gt;vv.....&gt;.
.&gt;v.vv.v..

After 56 steps:
..&gt;&gt;v&gt;vv..
..v.&gt;&gt;vv..
..&gt;&gt;v&gt;&gt;vv.
..&gt;&gt;&gt;&gt;&gt;vv.
v......&gt;vv
v&gt;v....&gt;&gt;v
vvv....&gt;.&gt;
&gt;vv......&gt;
.&gt;v.vv.v..

After 57 steps:
..&gt;&gt;v&gt;vv..
..v.&gt;&gt;vv..
..&gt;&gt;v&gt;&gt;vv.
..&gt;&gt;&gt;&gt;&gt;vv.
v......&gt;vv
v&gt;v....&gt;&gt;v
vvv.....&gt;&gt;
&gt;vv......&gt;
.&gt;v.vv.v..

After 58 steps:
..&gt;&gt;v&gt;vv..
..v.&gt;&gt;vv..
..&gt;&gt;v&gt;&gt;vv.
..&gt;&gt;&gt;&gt;&gt;vv.
v......&gt;vv
v&gt;v....&gt;&gt;v
vvv.....&gt;&gt;
&gt;vv......&gt;
.&gt;v.vv.v..
</code></pre><p>In this example, the sea cucumbers stop moving after <code>_58_</code> steps.</p><p>Find somewhere safe to land your submarine. <em>What is the first step on which no sea cucumbers move?</em></p><hr><p>Proposed solution: setup a map for the positions with the different direction sea cucumbers, and loop until the sea cucumbers reach a stable state</p><p>Time complexity: O(n) where n is the area of the river</p><p>Space complexity: O(n)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

field = {}
herds = [&quot;&gt;&quot;, &quot;v&quot;]
for y, line in enumerate(file_input):
    if line == &quot;&quot;:
        break
    for x, char in enumerate(line):
        if char == &quot;.&quot;:
            continue
        field[x,y] = char

width, height = len(file_input[0]), len(file_input)
def print_field(field):
    for y in range(height):
        result = &quot;&quot;
        for x in range(width):
            if (x,y) not in field:
                result += &quot;.&quot;
            else:
                result += field[x,y]
        print(result)
    print(&quot;&quot;)

num_steps, moves = 0, -1
while moves != 0:
    moves = 0
    for herd in herds:
        field_copy = dict(field)
        for pos, val in field_copy.items():
            if val == herd:
                x, y = 0, 0
                if herd == &quot;&gt;&quot;:
                    x = 1
                if herd == &quot;v&quot;:
                    y = 1
                next_pos = (pos[0] + x) % width, (pos[1] + y) % height
                if next_pos in field_copy:
                    continue
                moves += 1
                field[next_pos] = herd
                field.pop(pos)
    num_steps += 1
    #print_field(field)

print(&quot;Number of steps: {}&quot;.format(num_steps))
</code></pre><figcaption>Printing function was helpful for debugging issues</figcaption></figure><pre><code class="language-bash">&#x276F; time python3 solution25.py input25
Number of steps: 337
python3 solution25.py input25  1.86s user 0.02s system 99% cpu 1.878 total
</code></pre><h3 id="part-2">Part 2</h3><p>Suddenly, the experimental antenna control console lights up:</p><pre><code>Sleigh keys detected!
</code></pre><p>According to the console, the keys are <em>directly under the submarine</em>. You landed right on them! Using a robotic arm on the submarine, you move the sleigh keys into the airlock.</p><p>Now, you just need to get them to Santa in time to save Christmas! You check your clock - it <em>is</em> Christmas. There&apos;s no way you can get them back to the surface in time.</p><p>Just as you start to lose hope, you notice a button on the sleigh keys: <em>remote start</em>. You can start the sleigh from the bottom of the ocean! You just need some way to <em>boost the signal</em> from the keys so it actually reaches the sleigh. Good thing the submarine has that experimental antenna! You&apos;ll definitely need <em>50 stars</em> to boost it that far, though.</p><p>The experimental antenna control console lights up again:</p><pre><code>Energy source detected.
Integrating energy source from device &quot;sleigh keys&quot;...done.
Installing device drivers...done.
Recalibrating experimental antenna...done.
Boost strength due to matching signal phase: 1 star
</code></pre><p>Only <em>49 stars</em> to go.</p><p>You have enough stars to [Remotely Start The Sleigh].</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.kevintarta.com/content/images/2022/01/fiftystars.png" class="kg-image" alt="[Advent of Code 2021] Day 25 | Sea Cucumber" loading="lazy" width="882" height="576" srcset="https://ghost.kevintarta.com/content/images/size/w600/2022/01/fiftystars.png 600w, https://ghost.kevintarta.com/content/images/2022/01/fiftystars.png 882w" sizes="(min-width: 720px) 720px"><figcaption>Done and done</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://ghost.kevintarta.com/content/images/2022/01/neatlights.png" class="kg-image" alt="[Advent of Code 2021] Day 25 | Sea Cucumber" loading="lazy" width="891" height="686" srcset="https://ghost.kevintarta.com/content/images/size/w600/2022/01/neatlights.png 600w, https://ghost.kevintarta.com/content/images/2022/01/neatlights.png 891w" sizes="(min-width: 720px) 720px"><figcaption>Colorful lights :)</figcaption></figure><p>I have uploaded all of my 2021 solutions to GitHub: <a href="https://github.com/elveskevtar/AdventOfCode/?ref=ghost.kevintarta.com">https://github.com/elveskevtar/AdventOfCode/</a></p>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 24 | Arithmetic Logic Unit]]></title><description><![CDATA[Day 24 - ALU w/ custom instruction set; building a simulator helps for validation but this is a reverse engineering problem that can be solved with pen & paper 📝]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-24/</link><guid isPermaLink="false">61d22ba420bb83032e76e15b</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Mon, 03 Jan 2022 00:11:01 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-14.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-15.png" class="kg-image" alt="[Advent of Code 2021] Day 24 | Arithmetic Logic Unit" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2022/01/adventofcode-15.png 600w, https://ghost.kevintarta.com/content/images/2022/01/adventofcode-15.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-14.png" alt="[Advent of Code 2021] Day 24 | Arithmetic Logic Unit"><p><a href="https://en.wikipedia.org/wiki/Magic_smoke?ref=ghost.kevintarta.com">Magic smoke</a> starts leaking from the submarine&apos;s <a href="https://en.wikipedia.org/wiki/Arithmetic_logic_unit?ref=ghost.kevintarta.com">arithmetic logic unit</a> (ALU). Without the ability to perform basic arithmetic and logic functions, the submarine can&apos;t produce cool patterns with its Christmas lights!</p><p>It also can&apos;t navigate. Or run the oxygen system.</p><p>Don&apos;t worry, though - you <em>probably</em> have enough oxygen left to give you enough time to build a new ALU.</p><p>The ALU is a four-dimensional processing unit: it has integer variables <code>w</code>, <code>x</code>, <code>y</code>, and <code>z</code>. These variables all start with the value <code>0</code>. The ALU also supports <em>six instructions</em>:</p><ul><li><code>inp a</code> - Read an input value and write it to variable <code>a</code>.</li><li><code>add a b</code> - Add the value of <code>a</code> to the value of <code>b</code>, then store the result in variable <code>a</code>.</li><li><code>mul a b</code> - Multiply the value of <code>a</code> by the value of <code>b</code>, then store the result in variable <code>a</code>.</li><li><code>div a b</code> - Divide the value of <code>a</code> by the value of <code>b</code>, truncate the result to an integer, then store the result in variable <code>a</code>. (Here, &quot;truncate&quot; means to round the value toward zero.)</li><li><code>mod a b</code> - Divide the value of <code>a</code> by the value of <code>b</code>, then store the <em>remainder</em> in variable <code>a</code>. (This is also called the <a href="https://en.wikipedia.org/wiki/Modulo_operation?ref=ghost.kevintarta.com">modulo</a> operation.)</li><li><code>eql a b</code> - If the value of <code>a</code> and <code>b</code> are equal, then store the value <code>1</code> in variable <code>a</code>. Otherwise, store the value <code>0</code> in variable <code>a</code>.</li></ul><p>In all of these instructions, <code>a</code> and <code>b</code> are placeholders; <code>a</code> will always be the variable where the result of the operation is stored (one of <code>w</code>, <code>x</code>, <code>y</code>, or <code>z</code>), while <code>b</code> can be either a variable or a number. Numbers can be positive or negative, but will always be integers.</p><p>The ALU has no <em>jump</em> instructions; in an ALU program, every instruction is run exactly once in order from top to bottom. The program halts after the last instruction has finished executing.</p><p>(Program authors should be especially cautious; attempting to execute <code>div</code> with <code>b=0</code> or attempting to execute <code>mod</code> with <code>a&lt;0</code> or <code>b&lt;=0</code> will cause the program to crash and might even damage the ALU. These operations are never intended in any serious ALU program.)</p><p>For example, here is an ALU program which takes an input number, negates it, and stores it in <code>x</code>:</p><pre><code>inp x
mul x -1
</code></pre><p>Here is an ALU program which takes two input numbers, then sets <code>z</code> to <code>1</code> if the second input number is three times larger than the first input number, or sets <code>z</code> to <code>0</code> otherwise:</p><pre><code>inp z
inp x
mul z 3
eql z x
</code></pre><p>Here is an ALU program which takes a non-negative integer as input, converts it into binary, and stores the lowest (1&apos;s) bit in <code>z</code>, the second-lowest (2&apos;s) bit in <code>y</code>, the third-lowest (4&apos;s) bit in <code>x</code>, and the fourth-lowest (8&apos;s) bit in <code>w</code>:</p><pre><code>inp w
add z w
mod z 2
div w 2
add y w
mod y 2
div w 2
add x w
mod x 2
div w 2
mod w 2
</code></pre><p>Once you have built a replacement ALU, you can install it in the submarine, which will immediately resume what it was doing when the ALU failed: validating the submarine&apos;s <em>model number</em>. To do this, the ALU will run the MOdel Number Automatic Detector program (MONAD, your puzzle input).</p><p>Submarine model numbers are always <em>fourteen-digit numbers</em> consisting only of digits <code>1</code> through <code>9</code>. The digit <code>0</code> <em>cannot</em> appear in a model number.</p><p>When MONAD checks a hypothetical fourteen-digit model number, it uses fourteen separate <code>inp</code> instructions, each expecting a <em>single digit</em> of the model number in order of most to least significant. (So, to check the model number <code>13579246899999</code>, you would give <code>1</code> to the first <code>inp</code> instruction, <code>3</code> to the second <code>inp</code> instruction, <code>5</code> to the third <code>inp</code> instruction, and so on.) This means that when operating MONAD, each input instruction should only ever be given an integer value of at least <code>1</code> and at most <code>9</code>.</p><p>Then, after MONAD has finished running all of its instructions, it will indicate that the model number was <em>valid</em> by leaving a <code>0</code> in variable <code>z</code>. However, if the model number was <em>invalid</em>, it will leave some other non-zero value in <code>z</code>.</p><p>MONAD imposes additional, mysterious restrictions on model numbers, and legend says the last copy of the MONAD documentation was eaten by a <a href="https://en.wikipedia.org/wiki/Japanese_raccoon_dog?ref=ghost.kevintarta.com">tanuki</a>. You&apos;ll need to <em>figure out what MONAD does</em> some other way.</p><p>To enable as many submarine features as possible, find the largest valid fourteen-digit model number that contains no <code>0</code> digits. <em>What is the largest model number accepted by MONAD?</em></p><hr><p>Proposed solution: at first I created an ALU simulator to run the program but quickly realized that brute forcing the answer was not going to work very well; instead I opted for reverse engineering the problem and figured it out with just pen and paper &#x2013; the simulator still helped for validation</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
import sys

if len(sys.argv) != 3:
    print(&quot;Usage: {} &lt;input file&gt; &lt;model #&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

model_num = sys.argv[2]
if len(model_num) != 14 or not model_num.isnumeric() or &quot;0&quot; in model_num:
    print(&quot;Model number must be 14 digits with no 0&apos;s&quot;)
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

i = 0
variables = {var: 0 for var in [&quot;w&quot;, &quot;x&quot;, &quot;y&quot;, &quot;z&quot;]}
for line in file_input:
    if line == &quot;&quot;:
        continue
    instr = line.split()
    if instr[0] == &quot;inp&quot;:
		print(variables)
        variables[instr[1]] = model_num[i]
        i += 1
    if instr[0] == &quot;add&quot;:
        operand = instr[2] if instr[2].strip(&quot;-&quot;).isnumeric() else variables[instr[2]]
        variables[instr[1]] += int(operand)
    if instr[0] == &quot;mul&quot;:
        operand = instr[2] if instr[2].strip(&quot;-&quot;).isnumeric() else variables[instr[2]]
        variables[instr[1]] *= int(operand)
    if instr[0] == &quot;div&quot;:
        operand = instr[2] if instr[2].strip(&quot;-&quot;).isnumeric() else variables[instr[2]]
        if int(operand) == 0:
            print(&quot;Divide by zero error&quot;)
            sys.exit(1)
        variables[instr[1]] //= int(operand)
    if instr[0] == &quot;mod&quot;:
        if variables[instr[1]] &lt; 0:
            print(&quot;Modulo dividend &lt; 0&quot;)
            sys.exit(1)
        operand = instr[2] if instr[2].strip(&quot;-&quot;).isnumeric() else variables[instr[2]]
        if int(operand) &lt;= 0:
            print(&quot;Modulo divisor &lt;= 0&quot;)
            sys.exit(1)
        variables[instr[1]] %= int(operand)
    if instr[0] == &quot;eql&quot;:
        operand = instr[2] if instr[2].strip(&quot;-&quot;).isnumeric() else variables[instr[2]]
        variables[instr[1]] = int(variables[instr[1]] == int(operand))

print(variables)</code></pre><figcaption>ALU simulator</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; python3 solution24.py input24 11111111111111
...
...
{&apos;w&apos;: &apos;1&apos;, &apos;x&apos;: 1, &apos;y&apos;: 10, &apos;z&apos;: 3118601834}
</code></pre><figcaption>For all 1s in the model number we get a very large resulting z</figcaption></figure><p>What I discovered about the input program is that there were 14 segments that looked very similar to each other: one for each number in the model number. However, there are two distinct operations that were being performed based on the position within the model number.</p><figure class="kg-card kg-code-card"><pre><code class="language-nasm">inp w
mul x 0
add x z
mod x 26
div z 1
add x 15
eql x w
eql x 0
mul y 0
add y 25
mul y x
add y 1
mul z y
mul y 0
add y w
add y 9
mul y x
add z y</code></pre><figcaption>z = z * 26 + w + offset</figcaption></figure><p>The first type of block multiplies z by 26 and adds the next digit in the model number and some offset. In the above example, this offset is 9.</p><figure class="kg-card kg-code-card"><pre><code class="language-nasm">inp w
mul x 0
add x z
mod x 26
div z 26
add x -6
eql x w
eql x 0
mul y 0
add y 25
mul y x
add y 1
mul z y
mul y 0
add y w
add y 7
mul y x
add z y</code></pre><figcaption>z = z / 26 if (z % 26) + offset == w</figcaption></figure><p>This second type of block is basically the reverse of the first. Some lines in particular which make this not trivial:</p><pre><code class="language-nasm">mul y 0
add y 25
mul y x
add y 1
mul z y
</code></pre><p><code>x</code> here is 1 if <code>(z % 26) + offset != w</code> and 0 otherwise. In the example block above, this offset is -6. We want <code>x</code> to be 0, meaning that <code>(z % 26) + offset == w</code> otherwise, this ends up resulting in <code>z *= 26</code> instead of <code>z *= 1</code> which reverses the <code>z /= 26</code> performed earlier in the same block. Basically, we need to choose numbers in the respective first block type which results in <code>x</code> becoming 0 in the respective second block type.</p><p>Here, I am saying respective because this multiplication/division by 26 is like a stack operation. There are 7 numbers which have respective blocks like the first section and 7 numbers which have the second section &#x2013; but not necessarily in that order. For example, my input program has the blocks in the following order:</p><pre><code>first  (offset: 9)    &gt;
first  (offset: 1)     &gt;
first  (offset: 11)     &gt;
first  (offset: 3)       &gt;
second (offset: -11)      &lt;
first  (offset: 5)       &gt;
first  (offset: 0)        &gt;
second (offset: -6)        &lt;
first  (offset: 9)        &gt;
second (offset: -6)        &lt;
second (offset: -6)       &lt;
second (offset: -16)     &lt;
second (offset: -4)     &lt;
second (offset: -2)    &lt;</code></pre><p>I tried to represent the stack growing and shrinking based on the first/second blocks. Of course the &quot;stack&quot; in this case is the value of the <code>z</code> register and each second block only divides the number by 26 successfully if that condition is met. Our goal is to craft the largest model number that satisfies all of these conditions for all second blocks. This will produce a <code>z</code> value of 0 at the end of the program.</p><p>I try this with pen and paper by setting each first block with the model digit as 9 and when hitting a second block, calculating what digit would satisfy the condition to set <code>x</code> as 0. If no digit will satisfy this (because the number needed is more than a single digit), I backtracked to the respective first block and lowered the digit until we could use a single digit for the second block.</p><pre><code>z=0
w=9 z = 26*z+9+w = 18
w=9 z = 26*18+1+w = 478
w=9 z = 26*478+11+w = 12448
w=9 z = 26*12448+3+w = 323660
w=1 (323660 % 26) - 11 == 1
w=9 z = 26*12448+5+w = 323662
w=9 z = 26*323662+0+w = 8415221
w=3 (8415221 % 26) - 6 == 3
w=9 z = 26*323662+9+w = 8415230
w=? (8415230 % 26) - 6 == 12</code></pre><p>We hit a problem with the 10th digit since we need <code>w</code> to be 12 but this comes from <code>inp w</code> which just takes a single digit from the model number. We have to backtrack to the 9th digit. If we set the 9th digit to 6, we should be able to set the 10th digit as 9 and continue.</p><pre><code>z=0
w=9 z = 26*z+9+w = 18
w=9 z = 26*18+1+w = 478
w=9 z = 26*478+11+w = 12448
w=9 z = 26*12448+3+w = 323660
w=1 (323660 % 26) - 11 == 1
w=9 z = 26*12448+5+w = 323662
w=9 z = 26*323662+0+w = 8415221
w=3 (8415221 % 26) - 6 == 3
w=6 z = 26*323662+9+w = 8415227
w=9 (8415227 % 26) - 6 == 9
w=8 (323662 % 26) - 6 == 8
w=4 (12448 % 26) - 16 == 4
w=6 (478 % 26) - 4 == 6
w=? (18 % 26) - 2 == 16</code></pre><p>We have to backtrack one more time. For the 14th digit, the condition resolves to 16 which is too large. We have to decrement the first digit by 7 in order to have the 14th digit work out to be a single digit 9. This will be the largest valid model number that passes the program resulting in <code>z = 0</code>.</p><pre><code>z=0
w=2 z = 26*z+9+w = 11
w=9 z = 26*11+1+w = 296
w=9 z = 26*296+11+w = 7716
w=9 z = 26*7716+3+w = 200628
w=1 (200628 % 26) - 11 == 1
w=9 z = 26*7716+5+w = 200630
w=9 z = 26*200630+0+w = 5216389
w=3 (5216389 % 26) - 6 == 3
w=6 z = 26*200630+9+w = 5216395
w=9 (5216395 % 26) - 6 == 9
w=8 (200630 % 26) - 6 == 8
w=4 (7716 % 26) - 16 == 4
w=6 (296 % 26) - 4 == 6
w=9 (11 % 26) - 2 == 9</code></pre><p>And some validation with our simulator:</p><figure class="kg-card kg-code-card"><pre><code class="language-python">&#x276F; python3 solution24.py input24 29991993698469
{&apos;w&apos;: 0, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 0}
{&apos;w&apos;: &apos;2&apos;, &apos;x&apos;: 1, &apos;y&apos;: 11, &apos;z&apos;: 11}
{&apos;w&apos;: &apos;9&apos;, &apos;x&apos;: 1, &apos;y&apos;: 10, &apos;z&apos;: 296}
{&apos;w&apos;: &apos;9&apos;, &apos;x&apos;: 1, &apos;y&apos;: 20, &apos;z&apos;: 7716}
{&apos;w&apos;: &apos;9&apos;, &apos;x&apos;: 1, &apos;y&apos;: 12, &apos;z&apos;: 200628}
{&apos;w&apos;: &apos;1&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 7716}
{&apos;w&apos;: &apos;9&apos;, &apos;x&apos;: 1, &apos;y&apos;: 14, &apos;z&apos;: 200630}
{&apos;w&apos;: &apos;9&apos;, &apos;x&apos;: 1, &apos;y&apos;: 9, &apos;z&apos;: 5216389}
{&apos;w&apos;: &apos;3&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 200630}
{&apos;w&apos;: &apos;6&apos;, &apos;x&apos;: 1, &apos;y&apos;: 15, &apos;z&apos;: 5216395}
{&apos;w&apos;: &apos;9&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 200630}
{&apos;w&apos;: &apos;8&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 7716}
{&apos;w&apos;: &apos;4&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 296}
{&apos;w&apos;: &apos;6&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 11}
{&apos;w&apos;: &apos;9&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 0}
</code></pre><figcaption>The largest valid model number validated with the ALU simulator</figcaption></figure><h3 id="part-2">Part 2</h3><p>As the submarine starts booting up things like the <a href="https://www.youtube.com/watch?v=RXJKdh1KZ0w&amp;ref=ghost.kevintarta.com">Retro Encabulator</a>, you realize that maybe you don&apos;t need all these submarine features after all.</p><p><em>What is the smallest model number accepted by MONAD?</em></p><hr><p>Proposed solution: same solution but picking the smallest numbers for each digit which make a valid model number</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; python3 solution24.py input24 14691271141118
{&apos;w&apos;: 0, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 0}
{&apos;w&apos;: &apos;1&apos;, &apos;x&apos;: 1, &apos;y&apos;: 10, &apos;z&apos;: 10}
{&apos;w&apos;: &apos;4&apos;, &apos;x&apos;: 1, &apos;y&apos;: 5, &apos;z&apos;: 265}
{&apos;w&apos;: &apos;6&apos;, &apos;x&apos;: 1, &apos;y&apos;: 17, &apos;z&apos;: 6907}
{&apos;w&apos;: &apos;9&apos;, &apos;x&apos;: 1, &apos;y&apos;: 12, &apos;z&apos;: 179594}
{&apos;w&apos;: &apos;1&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 6907}
{&apos;w&apos;: &apos;2&apos;, &apos;x&apos;: 1, &apos;y&apos;: 7, &apos;z&apos;: 179589}
{&apos;w&apos;: &apos;7&apos;, &apos;x&apos;: 1, &apos;y&apos;: 7, &apos;z&apos;: 4669321}
{&apos;w&apos;: &apos;1&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 179589}
{&apos;w&apos;: &apos;1&apos;, &apos;x&apos;: 1, &apos;y&apos;: 10, &apos;z&apos;: 4669324}
{&apos;w&apos;: &apos;4&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 179589}
{&apos;w&apos;: &apos;1&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 6907}
{&apos;w&apos;: &apos;1&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 265}
{&apos;w&apos;: &apos;1&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 10}
{&apos;w&apos;: &apos;8&apos;, &apos;x&apos;: 0, &apos;y&apos;: 0, &apos;z&apos;: 0}
</code></pre><figcaption>The process was the same just picking the smallest number and backtracking</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 23 | Amphipod]]></title><description><![CDATA[Day 23 - Boils down to a TSP with multiple salesmen with different traveling weights and special rules where they can block each other from reaching their destinations. I used heaps, dynamic programming, memoization, custom hash functions, and custom deep copies 👨‍💼💰📈]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-23/</link><guid isPermaLink="false">61d1d8d920bb83032e76e003</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Sun, 02 Jan 2022 18:17:27 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-12.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-13.png" class="kg-image" alt="[Advent of Code 2021] Day 23 | Amphipod" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2022/01/adventofcode-13.png 600w, https://ghost.kevintarta.com/content/images/2022/01/adventofcode-13.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-12.png" alt="[Advent of Code 2021] Day 23 | Amphipod"><p>A group of <a href="https://en.wikipedia.org/wiki/Amphipoda?ref=ghost.kevintarta.com">amphipods</a> notice your fancy submarine and flag you down. &quot;With such an impressive shell,&quot; one amphipod says, &quot;surely you can help us with a question that has stumped our best scientists.&quot;</p><p>They go on to explain that a group of timid, stubborn amphipods live in a nearby burrow. Four types of amphipods live there: <em>Amber</em> (<code>A</code>), <em>Bronze</em> (<code>B</code>), <em>Copper</em> (<code>C</code>), and <em>Desert</em> (<code>D</code>). They live in a burrow that consists of a <em>hallway</em> and four <em>side rooms</em>. The side rooms are initially full of amphipods, and the hallway is initially empty.</p><p>They give you a <em>diagram of the situation</em> (your puzzle input), including locations of each amphipod (<code>A</code>, <code>B</code>, <code>C</code>, or <code>D</code>, each of which is occupying an otherwise open space), walls (<code>#</code>), and open space (<code>.</code>).</p><p>For example:</p><pre><code>#############
#...........#
###B#C#B#D###
  #A#D#C#A#
  #########
</code></pre><p>The amphipods would like a method to organize every amphipod into side rooms so that each side room contains one type of amphipod and the types are sorted <code>A</code>-<code>D</code> going left to right, like this:</p><pre><code>#############
#...........#
###A#B#C#D###
  #A#B#C#D#
  #########
</code></pre><p>Amphipods can move up, down, left, or right so long as they are moving into an unoccupied open space. Each type of amphipod requires a different amount of <em>energy</em> to move one step: Amber amphipods require <code>1</code> energy per step, Bronze amphipods require <code>10</code> energy, Copper amphipods require <code>100</code>, and Desert ones require <code>1000</code>. The amphipods would like you to find a way to organize the amphipods that requires the <em>least total energy</em>.</p><p>However, because they are timid and stubborn, the amphipods have some extra rules:</p><ul><li>Amphipods will never <em>stop on the space immediately outside any room</em>. They can move into that space so long as they immediately continue moving. (Specifically, this refers to the four open spaces in the hallway that are directly above an amphipod starting position.)</li><li>Amphipods will never <em>move from the hallway into a room</em> unless that room is their destination room <em>and</em> that room contains no amphipods which do not also have that room as their own destination. If an amphipod&apos;s starting room is not its destination room, it can stay in that room until it leaves the room. (For example, an Amber amphipod will not move from the hallway into the right three rooms, and will only move into the leftmost room if that room is empty or if it only contains other Amber amphipods.)</li><li>Once an amphipod stops moving in the hallway, <em>it will stay in that spot until it can move into a room</em>. (That is, once any amphipod starts moving, any other amphipods currently in the hallway are locked in place and will not move again until they can move fully into a room.)</li></ul><p>In the above example, the amphipods can be organized using a minimum of <code>_12521_</code> energy. One way to do this is shown below.</p><p>Starting configuration:</p><pre><code>#############
#...........#
###B#C#B#D###
  #A#D#C#A#
  #########
</code></pre><p>One Bronze amphipod moves into the hallway, taking 4 steps and using <code>40</code> energy:</p><pre><code>#############
#...B.......#
###B#C#.#D###
  #A#D#C#A#
  #########
</code></pre><p>The only Copper amphipod not in its side room moves there, taking 4 steps and using <code>400</code> energy:</p><pre><code>#############
#...B.......#
###B#.#C#D###
  #A#D#C#A#
  #########
</code></pre><p>A Desert amphipod moves out of the way, taking 3 steps and using <code>3000</code> energy, and then the Bronze amphipod takes its place, taking 3 steps and using <code>30</code> energy:</p><pre><code>#############
#.....D.....#
###B#.#C#D###
  #A#B#C#A#
  #########
</code></pre><p>The leftmost Bronze amphipod moves to its room using <code>40</code> energy:</p><pre><code>#############
#.....D.....#
###.#B#C#D###
  #A#B#C#A#
  #########
</code></pre><p>Both amphipods in the rightmost room move into the hallway, using <code>2003</code> energy in total:</p><pre><code>#############
#.....D.D.A.#
###.#B#C#.###
  #A#B#C#.#
  #########
</code></pre><p>Both Desert amphipods move into the rightmost room using <code>7000</code> energy:</p><pre><code>#############
#.........A.#
###.#B#C#D###
  #A#B#C#D#
  #########
</code></pre><p>Finally, the last Amber amphipod moves into its room, using <code>8</code> energy:</p><pre><code>#############
#...........#
###A#B#C#D###
  #A#B#C#D#
  #########
</code></pre><p><em>What is the least energy required to organize the amphipods?</em></p><hr><p>Proposed solution: make copies of the map for every possible move given a certain state and repeat for all possible moves until no more moves &#x2013; keep track of already visited states to prevent simulating all of the resulting branches multiple times</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
from collections import deque
from copy import deepcopy
from heapq import heappush
from math import copysign
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

multiplier = {&quot;A&quot;: 1, &quot;B&quot;: 10, &quot;C&quot;: 100, &quot;D&quot;: 1000}
amphipod_dst = {&quot;A&quot;: 2, &quot;B&quot;: 4, &quot;C&quot;: 6, &quot;D&quot;: 8}

class Amphipod:
    def __init__(self, label, pos):
        self.label = label
        self.pos = pos
        self.moved = False
        self.points = 0

    def move(self, new_pos, field):
        self.moved = True
        moves = abs(self.pos[0] - new_pos[0]) + abs(self.pos[1] - new_pos[1])
        self.points += moves * multiplier[self.label]
        field[new_pos] = self
        field[self.pos] = None
        self.pos = new_pos

    def __repr__(self):
        return &quot;Amphipod({})&quot;.format(self.label)

    def __eq__(self, other):
        return other and self.label == other.label \
                and self.pos == other.pos and self.moved == other.moved \
                and self.points == other.points

    def __hash__(self):
        return hash((self.label, self.pos, self.moved, self.points))

def field_score(field):
    points = 0
    for pod in field.values():
        if pod is not None:
            points += pod.points
    return points

def hash_field(field):
    states = []
    for pod in field.values():
        if pod is not None:
            states.append(hash(pod))
    states.sort()
    return hash(tuple(states))

def field_solved(field):
    return field[2,1] and field[2,2] and field[4,1] and field[4,2] \
            and field[6,1] and field[6,2] and field[8,1] and field[8,2] \
            and field[2,1].label == &quot;A&quot; and field[2,2].label == &quot;A&quot; \
            and field[4,1].label == &quot;B&quot; and field[4,2].label == &quot;B&quot; \
            and field[6,1].label == &quot;C&quot; and field[6,2].label == &quot;C&quot; \
            and field[8,1].label == &quot;D&quot; and field[8,2].label == &quot;D&quot;

def print_field(field):
    for y in range(3):
        result = &quot;&quot;
        for x in range(11):
            if (x,y) not in field:
                result += &quot;#&quot;
            elif field[x,y] is None:
                result += &quot;.&quot;
            else:
                result += field[x,y].label
        print(result)
    print(&quot;&quot;)

field = {(x,0):None for x in range(11)}

for x in range(4):
    x = x*2 + 3
    field[x-1,1] = Amphipod(file_input[2][x], (x-1,1))
    field[x-1,2] = Amphipod(file_input[3][x], (x-1,2))

visited_states = set()
queue = deque()
queue.append(field)
room_rows = [2,4,6,8]
min_energy_cost = sys.maxsize
while len(queue) != 0:
    field = queue.pop()
    field_hash = hash_field(field)
    if field_hash in visited_states or field_score(field) &gt; min_energy_cost:
        continue
    visited_states.add(field_hash)
    if field_solved(field):
        min_energy_cost = min(min_energy_cost, field_score(field))
        print(min_energy_cost)
        continue
    for y in range(1,3):
        for x in range(4):
            x = x*2 + 2
            if field[x,y-1]: continue
            if field[x,y] and not field[x,y].moved:
                for x2 in range(x-1, -1, -1):
                    if x2 in room_rows: continue
                    if field[x2,0]: break
                    new_field = deepcopy(field)
                    amphipod = new_field[x,y]
                    amphipod.move((x2,0), new_field)
                    queue.append(new_field)
                for x2 in range(x+1, 11):
                    if x2 in room_rows: continue
                    if field[x2,0]: break
                    new_field = deepcopy(field)
                    amphipod = new_field[x,y]
                    amphipod.move((x2,0), new_field)
                    queue.append(new_field)
    for x in range(11):
        if not field[x,0]: continue
        dest = amphipod_dst[field[x,0].label]
        if field[dest,1]: continue
        if field[dest,2] and field[dest,2].label != field[x,0].label: continue
        direction = int(copysign(1, dest-x))
        for x2 in range(x+direction, dest+direction, direction):
            if field[x2,0]: break
            if x2 != dest: continue
            if field[x2,2]:
                new_field = deepcopy(field)
                amphipod = new_field[x,0]
                amphipod.move((x2,1), new_field)
                queue.append(new_field)
            else:
                new_field = deepcopy(field)
                amphipod = new_field[x,0]
                amphipod.move((x2,2), new_field)
                queue.append(new_field)
</code></pre><figcaption>Proud of this but needed a lot of optimizations</figcaption></figure><p>This gives the right solution for part 1 but it takes about 2 minutes to run. Here is a quick breakdown of this initial solution.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">multiplier = {&quot;A&quot;: 1, &quot;B&quot;: 10, &quot;C&quot;: 100, &quot;D&quot;: 1000}
amphipod_dst = {&quot;A&quot;: 2, &quot;B&quot;: 4, &quot;C&quot;: 6, &quot;D&quot;: 8}</code></pre><figcaption>Dictionaries to track amphipod types and their respective multiplier and x axis destination</figcaption></figure><p><code>multiplier</code> outlines the respective multipliers for each amphipod type. <code>amphipod_dst</code> outlines the x position that each amphipod needs to reach. The &quot;field&quot; object I create does not include the walls so the hallway is y=0 and the first room is at x=2.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">class Amphipod:
    def __init__(self, label, pos):
        self.label = label
        self.pos = pos
        self.moved = False
        self.points = 0

    def move(self, new_pos, field):
        self.moved = True
        moves = abs(self.pos[0] - new_pos[0]) + abs(self.pos[1] - new_pos[1])
        self.points += moves * multiplier[self.label]
        field[new_pos] = self
        field[self.pos] = None
        self.pos = new_pos

    def __repr__(self):
        return &quot;Amphipod({})&quot;.format(self.label)

    def __eq__(self, other):
        return other and self.label == other.label \
                and self.pos == other.pos and self.moved == other.moved \
                and self.points == other.points

    def __hash__(self):
        return hash((self.label, self.pos, self.moved, self.points))</code></pre><figcaption>The amphipod class</figcaption></figure><p>Each amphipod has a label, a position (which is also tracked by the field dictionary), and a flag to track if it&apos;s already moved into the hallway &#x2013; this last one when set to True means that the amphipod can only move once more, straight into its destination room. I override <code>__repr__</code> for nice printing of the object and I override <code>__eq__</code> and <code>__hash__</code> so that these objects can be hashed based on all of the class level attributes. I did this to create a good hashing function for tracking already visited states. See below.</p><p>The <code>move</code> function updates the amphipods position &amp; moved flag, the respective field dictionary, and the amphipod&apos;s points accumulator. Also, the points are being stored per amphipod object but I end up moving this to the field object in the next iteration so we don&apos;t have to count the number of points across the field dictionary everytime we need to get the number of points.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">def print_field(field):
    for y in range(3):
        result = &quot;&quot;
        for x in range(11):
            if (x,y) not in field:
                result += &quot;#&quot;
            elif field[x,y] is None:
                result += &quot;.&quot;
            else:
                result += field[x,y].label
        print(result)
    print(&quot;&quot;)</code></pre><figcaption>A convenient print function for the field</figcaption></figure><p>This function prints the field like this:</p><pre><code class="language-bash">...........
##D#B#B#A##
##C#C#D#A##</code></pre><p>This was convenient for debugging some issues with the actual solution logic. I&apos;m going to skip over the other field functions since these end up simplified or moved to a field class in the next iteration of my solution.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">visited_states = set()
queue = deque()
queue.append(field)
room_rows = [2,4,6,8]
min_energy_cost = sys.maxsize
while len(queue) != 0:
    field = queue.pop()
    field_hash = hash_field(field)
    if field_hash in visited_states or field_score(field) &gt; min_energy_cost:
        continue
    visited_states.add(field_hash)
    if field_solved(field):
        min_energy_cost = min(min_energy_cost, field_score(field))
        print(min_energy_cost)
        continue</code></pre><figcaption>The primary loop</figcaption></figure><p>The <code>queue</code> object contains copies of the field dictionary in different states which it iterates over in the main loop. During each iteration, it takes the field at the top of the queue, pops it off, and pushes all possible resulting states from the intial state onto the stack. This is repeated until all possible states have been visited. <code>visited_states</code> is a set of the field hashes (the amphipod hashes turned into a sorted tuple) which is used to make sure we don&apos;t address a whole branch of states multiple times &#x2013; this would be expensive.</p><p>The remaining part of the loop is just addressing all possible moves that the amphipods can make given the current field dictionary.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    for y in range(1,3):
        for x in range(4):
            x = x*2 + 2
            if field[x,y-1]: continue
            if field[x,y] and not field[x,y].moved:
                for x2 in range(x-1, -1, -1):
                    if x2 in room_rows: continue
                    if field[x2,0]: break
                    new_field = deepcopy(field)
                    amphipod = new_field[x,y]
                    amphipod.move((x2,0), new_field)
                    queue.append(new_field)
                for x2 in range(x+1, 11):
                    if x2 in room_rows: continue
                    if field[x2,0]: break
                    new_field = deepcopy(field)
                    amphipod = new_field[x,y]
                    amphipod.move((x2,0), new_field)
                    queue.append(new_field)</code></pre><figcaption>The first block is moving amphipods from the room to the hallway</figcaption></figure><p>This last section is broken into two parts, moving from the room to the hallway, and moving from the hallway to the destination room. Above is the former, and it checks for any blocking amphipods and tries every position in the hallway that each amphipod in a room (that has not already moved and is not properly placed in its destination room) can go to.</p><p>If it finds a non-blocked position in the hallway, it makes a copy of the field dictionary and moves the amphipod in the new copy and pushes that copy to the stack. This block assumes that all amphipods that have already moved and are in a room have followed the rules defined in the problem and are in their destination room without needing to move again so that another amphipod in the room can get to its destination.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    for x in range(11):
        if not field[x,0]: continue
        dest = amphipod_dst[field[x,0].label]
        if field[dest,1]: continue
        if field[dest,2] and field[dest,2].label != field[x,0].label: continue
        direction = int(copysign(1, dest-x))
        for x2 in range(x+direction, dest+direction, direction):
            if field[x2,0]: break
            if x2 != dest: continue
            if field[x2,2]:
                new_field = deepcopy(field)
                amphipod = new_field[x,0]
                amphipod.move((x2,1), new_field)
                queue.append(new_field)
            else:
                new_field = deepcopy(field)
                amphipod = new_field[x,0]
                amphipod.move((x2,2), new_field)
                queue.append(new_field)</code></pre><figcaption>Second block to move amphipods in the hallway to their destination rooms</figcaption></figure><p>The second, and last, block moves amphipods in the hallway to their destination rooms assuming that no other amphipod is blocking their way and only their matching counterpart is in the respective destination room. Again, if it finds such a move, it makes a deep copy of the field dictionary and moves the amphipod in the copy before pushing the copy to the stack.</p><p>Throughout this loop, if a solved state is found, the field points are calculated and the minimum points for a solved state is being tracked. The first large optimization I make is to use a heap instead of a stack for the pending fields. The heap will use the field points as the sorting key and we will look at the fields with the smallest points first. If we find a solution with a certain energy, we can end up skipping a lot of the options and their respective branches if we already know they will produce a larger point total.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">class Amphipod:
    def __init__(self, label, pos):
        self.label = label
        self.pos = pos
        self.moved = False

    def move(self, new_pos, field):
        self.moved = True
        moves = abs(self.pos[0] - new_pos[0]) + abs(self.pos[1] - new_pos[1])
        field.field[new_pos] = self
        field.field[self.pos] = None
        self.pos = new_pos
        field.points += moves * multiplier[self.label]

    def __repr__(self):
        return &quot;Amphipod({})&quot;.format(self.label)

    def __eq__(self, other):
        return other and self.label == other.label \
                and self.pos == other.pos and self.moved == other.moved

    def __hash__(self):
        return hash((self.label, self.pos, self.moved))</code></pre><figcaption>New amphipod class</figcaption></figure><p>We moved the points attributes to the field which is the major difference to the amphipod class.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">class Field:
    def __init__(self, field, points):
        self.field = field
        self.points = points

    def __lt__(self, other):
        return self.points &lt; other.points

    def __eq__(self, other):
        return self.field == other.field and self.points == other.points

    def __hash__(self):
        states = []
        for pod in self.field.values():
            if pod:
                states.append(hash(pod))
        states.sort()
        return hash(tuple(states))

    def solved(self):
        field = self.field
        return field[2,1] and field[2,2] and field[4,1] and field[4,2] \
            and field[6,1] and field[6,2] and field[8,1] and field[8,2] \
            and field[2,1].label == &quot;A&quot; and field[2,2].label == &quot;A&quot; \
            and field[4,1].label == &quot;B&quot; and field[4,2].label == &quot;B&quot; \
            and field[6,1].label == &quot;C&quot; and field[6,2].label == &quot;C&quot; \
            and field[8,1].label == &quot;D&quot; and field[8,2].label == &quot;D&quot;</code></pre><figcaption>The field class</figcaption></figure><p>The field class has two class level attributes: the field dictionary that maps the coordinates of the map to an optional amphipod (or null if no amphipod is occupying the space). The <code>__eq__</code> and <code>__hash__</code> functions are overriden again this time taking the amphipod objects, hashing them individually and taking the resulting list of 8 hashes, sorting them, transforming it into a tuple, and taking the hash of the tuple. The sorting is important here since iterating through the field dictionary could produce a different order even if the state has already been visited.</p><p>The <code>solved</code> function is what you might expect. It returns True only if all rooms are populated with the correct amphipods. The <code>__lt__</code> function is for using the field objects in a heap. Here, we only care about the points in terms of sorting the fields because of the reason explained above.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">field = {(x,0):None for x in range(11)}
for x in range(4):
    x = x*2 + 3
    field[x-1,1] = Amphipod(file_input[2][x], (x-1,1))
    field[x-1,2] = Amphipod(file_input[3][x], (x-1,2))
field = Field(field, 0)

queue = []
heappush(queue, field)
visited_states = set()
room_rows = [2,4,6,8]
min_energy_cost = sys.maxsize
while len(queue) != 0:
    field_obj = heappop(queue)
    field_hash, field, score = hash(field_obj), field_obj.field, field_obj.points
    if field_hash in visited_states or score &gt; min_energy_cost:
        continue
    visited_states.add(field_hash)
    if field_obj.solved():
        min_energy_cost = min(min_energy_cost, score)
        print(min_energy_cost)
        continue
    for y in range(1,3):
        for x in range(4):
            x = x*2 + 2
            if field[x,y-1]: continue
            if field[x,y] and not field[x,y].moved:
                for x2 in range(x-1, -1, -1):
                    if x2 in room_rows: continue
                    if field[x2,0]: break
                    new_field = deepcopy(field_obj)
                    new_field.field[x,y].move((x2,0), new_field)
                    heappush(queue, new_field)
                for x2 in range(x+1, 11):
                    if x2 in room_rows: continue
                    if field[x2,0]: break
                    new_field = deepcopy(field_obj)
                    new_field.field[x,y].move((x2,0), new_field)
                    heappush(queue, new_field)
    for x in range(11):
        if not field[x,0]: continue
        dest = amphipod_dst[field[x,0].label]
        if field[dest,1]: continue
        if field[dest,2] and field[dest,2].label != field[x,0].label: continue
        direction = int(copysign(1, dest-x))
        for x2 in range(x+direction, dest+direction, direction):
            if field[x2,0]: break
            if x2 != dest: continue
            if field[x2,2]:
                new_field = deepcopy(field_obj)
                new_field.field[x,0].move((x2,1), new_field)
                heappush(queue, new_field)
            else:
                new_field = deepcopy(field_obj)
                new_field.field[x,0].move((x2,2), new_field)
                heappush(queue, new_field)</code></pre><figcaption>Small adjustments to the solution to use a heap instead of a stack</figcaption></figure><p>This brings the solution for part 1 down to ~22 seconds:</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; time python3 solution23.py input23
15472
python3 solution23.py input23  22.77s user 0.02s system 99% cpu 22.799 total
</code></pre><figcaption>Better, but still room to improve</figcaption></figure><p>I pulled out the cProfiler to see what calls were taking the most time. I think you can probably guess what it is.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; python3 -m cProfile solution23.py input23
15472
         232307975 function calls (192139718 primitive calls) in 64.252 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:1002(_find_and_load)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:112(release)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:152(__init__)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:156(__enter__)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:160(__exit__)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:166(_get_module_lock)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:185(cb)
        2    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:220(_call_with_frames_removed)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:231(_verbose_message)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:241(_requires_builtin_wrapper)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:351(__init__)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:398(parent)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:406(has_location)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:415(spec_from_loader)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:486(_init_module_attrs)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:558(module_from_spec)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:58(__init__)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:659(_load_unlocked)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:736(find_spec)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:757(create_module)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:765(exec_module)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:782(is_package)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:87(acquire)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:874(__enter__)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:878(__exit__)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:901(_find_spec)
        1    0.000    0.000    0.000    0.000 &lt;frozen importlib._bootstrap&gt;:967(_find_and_load_unlocked)
        1    0.000    0.000    0.000    0.000 _bootlocale.py:33(getpreferredencoding)
        1    0.000    0.000    0.000    0.000 codecs.py:260(__init__)
        1    0.000    0.000    0.000    0.000 codecs.py:309(__init__)
        1    0.000    0.000    0.000    0.000 codecs.py:319(decode)
33405220/204940   25.224    0.000   58.382    0.000 copy.py:128(deepcopy)
 23977980    1.640    0.000    1.640    0.000 copy.py:182(_deepcopy_atomic)
  5533380    5.778    0.000   18.299    0.000 copy.py:209(_deepcopy_tuple)
  5533380    2.337    0.000   12.156    0.000 copy.py:210(&lt;listcomp&gt;)
2049400/204940    4.862    0.000   56.003    0.000 copy.py:226(_deepcopy_dict)
  3893860    1.744    0.000    2.412    0.000 copy.py:242(_keep_alive)
1844460/204940    4.039    0.000   57.399    0.000 copy.py:258(_reconstruct)
  3688920    0.736    0.000    2.583    0.000 copy.py:263(&lt;genexpr&gt;)
        2    0.000    0.000    0.000    0.000 copyreg.py:103(_slotnames)
  1844460    0.510    0.000    0.761    0.000 copyreg.py:94(__newobj__)
        1    0.000    0.000    0.000    0.000 solution23.py:16(Amphipod)
        8    0.000    0.000    0.000    0.000 solution23.py:17(__init__)
        1    2.074    2.074   64.252   64.252 solution23.py:2(&lt;module&gt;)
   204940    0.339    0.000    0.384    0.000 solution23.py:22(move)
  1639528    0.532    0.000    0.717    0.000 solution23.py:37(__hash__)
        1    0.000    0.000    0.000    0.000 solution23.py:40(Field)
        1    0.000    0.000    0.000    0.000 solution23.py:41(__init__)
  3432138    0.643    0.000    0.643    0.000 solution23.py:45(__lt__)
   204941    0.720    0.000    2.023    0.000 solution23.py:51(__hash__)
    80584    0.028    0.000    0.028    0.000 solution23.py:59(solved)
        1    0.000    0.000    0.000    0.000 solution23.py:81(&lt;dictcomp&gt;)
  1844460    0.251    0.000    0.251    0.000 {built-in method __new__ of type object at 0x8f32e0}
        1    0.000    0.000    0.000    0.000 {built-in method _codecs.utf_8_decode}
   204941    0.437    0.000    1.003    0.000 {built-in method _heapq.heappop}
   204941    0.112    0.000    0.190    0.000 {built-in method _heapq.heappush}
        3    0.000    0.000    0.000    0.000 {built-in method _imp.acquire_lock}
        1    0.000    0.000    0.000    0.000 {built-in method _imp.create_builtin}
        1    0.000    0.000    0.000    0.000 {built-in method _imp.exec_builtin}
        1    0.000    0.000    0.000    0.000 {built-in method _imp.is_builtin}
        3    0.000    0.000    0.000    0.000 {built-in method _imp.release_lock}
        1    0.000    0.000    0.000    0.000 {built-in method _locale.nl_langinfo}
        2    0.000    0.000    0.000    0.000 {built-in method _thread.allocate_lock}
        2    0.000    0.000    0.000    0.000 {built-in method _thread.get_ident}
        2    0.000    0.000    0.000    0.000 {built-in method builtins.__build_class__}
   409880    0.045    0.000    0.045    0.000 {built-in method builtins.abs}
        1    0.000    0.000   64.252   64.252 {built-in method builtins.exec}
  3688924    0.462    0.000    0.462    0.000 {built-in method builtins.getattr}
  1844466    0.211    0.000    0.211    0.000 {built-in method builtins.hasattr}
3688938/204941    0.617    0.000    2.108    0.000 {built-in method builtins.hash}
 46931260    3.257    0.000    3.257    0.000 {built-in method builtins.id}
  3688920    0.427    0.000    0.427    0.000 {built-in method builtins.isinstance}
  1844460    0.215    0.000    0.215    0.000 {built-in method builtins.issubclass}
   204943    0.025    0.000    0.025    0.000 {built-in method builtins.len}
        1    0.000    0.000    0.000    0.000 {built-in method builtins.min}
        1    0.000    0.000    0.000    0.000 {built-in method builtins.print}
        1    0.000    0.000    0.000    0.000 {built-in method io.open}
   206436    0.047    0.000    0.047    0.000 {built-in method math.copysign}
        2    0.000    0.000    0.000    0.000 {method &apos;__exit__&apos; of &apos;_thread.lock&apos; objects}
  1844460    0.832    0.000    0.832    0.000 {method &apos;__reduce_ex__&apos; of &apos;object&apos; objects}
    80584    0.012    0.000    0.012    0.000 {method &apos;add&apos; of &apos;set&apos; objects}
  5328448    0.497    0.000    0.497    0.000 {method &apos;append&apos; of &apos;list&apos; objects}
        1    0.000    0.000    0.000    0.000 {method &apos;disable&apos; of &apos;_lsprof.Profiler&apos; objects}
 68654902    4.899    0.000    4.899    0.000 {method &apos;get&apos; of &apos;dict&apos; objects}
        2    0.000    0.000    0.000    0.000 {method &apos;get&apos; of &apos;mappingproxy&apos; objects}
  2049400    0.214    0.000    0.214    0.000 {method &apos;items&apos; of &apos;dict&apos; objects}
        1    0.000    0.000    0.000    0.000 {method &apos;pop&apos; of &apos;dict&apos; objects}
        1    0.000    0.000    0.000    0.000 {method &apos;read&apos; of &apos;_io.TextIOWrapper&apos; objects}
        2    0.000    0.000    0.000    0.000 {method &apos;rpartition&apos; of &apos;str&apos; objects}
   204941    0.103    0.000    0.103    0.000 {method &apos;sort&apos; of &apos;list&apos; objects}
        1    0.000    0.000    0.000    0.000 {method &apos;split&apos; of &apos;str&apos; objects}
        1    0.000    0.000    0.000    0.000 {method &apos;strip&apos; of &apos;str&apos; objects}
  1844460    0.359    0.000    0.359    0.000 {method &apos;update&apos; of &apos;dict&apos; objects}
   204941    0.026    0.000    0.026    0.000 {method &apos;values&apos; of &apos;dict&apos; objects}</code></pre><figcaption>First time using cProfiler, pretty cool</figcaption></figure><p>As expected, the deep copies are taking the most time since it has to copy the entire field for every single possible move. A really cool revelation I had is that we don&apos;t need to deep copy the entire field after each move. We can do a shallow copy of the field object (the dictionary and points) and do a deep copy of the single amphipod that is moving. This means that each amphipod object will only be copied once it moves the first time and then again when it moves the second time. The same amphipod objects will be referenced in many copies of the fields until it actually moves. This greatly reduces the amount of copying that we have to do.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">class Field:
    ...
    def custom_copy(self, pos):
        # shallow copy field dict and points
        field = copy(self.field)
        points = copy(self.points)
        obj = Field(field, points)
        # deepcopy single amphipod object at position
        obj.field[pos] = deepcopy(obj.field[pos])
        return obj</code></pre><figcaption>The field&apos;s custom copy operation</figcaption></figure><p>This <code>custom_copy</code> function takes the position of the amphipod that is moving as an argument. This is the only object which a deep copy is created for. The new field object is returned.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">field = {(x,0):None for x in range(11)}
for x in range(4):
    x = x*2 + 3
    field[x-1,1] = Amphipod(file_input[2][x], (x-1,1))
    field[x-1,2] = Amphipod(file_input[3][x], (x-1,2))
field = Field(field, 0)

queue = []
heappush(queue, field)
visited_states = set()
room_rows = [2,4,6,8]
min_energy_cost = sys.maxsize
while len(queue) != 0:
    field_obj = heappop(queue)
    field_hash, field, score = hash(field_obj), field_obj.field, field_obj.points
    if field_hash in visited_states or score &gt; min_energy_cost:
        continue
    visited_states.add(field_hash)
    if field_obj.solved():
        min_energy_cost = min(min_energy_cost, score)
        continue
    for y in range(1,3):
        for x in range(4):
            x = x*2 + 2
            if field[x,y-1]: continue
            if field[x,y] and not field[x,y].moved:
                for x2 in range(x-1, -1, -1):
                    if x2 in room_rows: continue
                    if field[x2,0]: break
                    new_field = field_obj.custom_copy((x,y))
                    new_field.field[x,y].move((x2,0), new_field)
                    heappush(queue, new_field)
                for x2 in range(x+1, 11):
                    if x2 in room_rows: continue
                    if field[x2,0]: break
                    new_field = field_obj.custom_copy((x,y))
                    new_field.field[x,y].move((x2,0), new_field)
                    heappush(queue, new_field)
    for x in range(11):
        if not field[x,0]: continue
        dest = amphipod_dst[field[x,0].label]
        if field[dest,1]: continue
        if field[dest,2] and field[dest,2].label != field[x,0].label: continue
        direction = int(copysign(1, dest-x))
        for x2 in range(x+direction, dest+direction, direction):
            if field[x2,0]: break
            if x2 != dest: continue
            if field[x2,2]:
                new_field = field_obj.custom_copy((x,0))
                new_field.field[x,0].move((x2,1), new_field)
                heappush(queue, new_field)
            else:
                new_field = field_obj.custom_copy((x,0))
                new_field.field[x,0].move((x2,2), new_field)
                heappush(queue, new_field)

print(&quot;Minimum energy cost: {}&quot;.format(min_energy_cost))</code></pre><figcaption>The new custom copy being used</figcaption></figure><p>Again, not much changes for the solution loop except the use of the custom copy.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; time python3 solution23.py input23
Minimum energy cost: 15472
python3 solution23.py input23  4.66s user 0.02s system 99% cpu 4.685 total
</code></pre><figcaption>Down to 5 seconds!</figcaption></figure><h3 id="part-2">Part 2</h3><p>As you prepare to give the amphipods your solution, you notice that the diagram they handed you was actually folded up. As you unfold it, you discover an extra part of the diagram.</p><p>Between the first and second lines of text that contain amphipod starting positions, insert the following lines:</p><pre><code>  #D#C#B#A#
  #D#B#A#C#
</code></pre><p>So, the above example now becomes:</p><pre><code>#############
#...........#
###B#C#B#D###
  #D#C#B#A#
  #D#B#A#C#
  #A#D#C#A#
  #########
</code></pre><p>The amphipods still want to be organized into rooms similar to before:</p><pre><code>#############
#...........#
###A#B#C#D###
  #A#B#C#D#
  #A#B#C#D#
  #A#B#C#D#
  #########
</code></pre><p>In this updated example, the least energy required to organize these amphipods is <code>_44169_</code>:</p><pre><code>#############
#...........#
###B#C#B#D###
  #D#C#B#A#
  #D#B#A#C#
  #A#D#C#A#
  #########

#############
#..........D#
###B#C#B#.###
  #D#C#B#A#
  #D#B#A#C#
  #A#D#C#A#
  #########

#############
#A.........D#
###B#C#B#.###
  #D#C#B#.#
  #D#B#A#C#
  #A#D#C#A#
  #########

#############
#A........BD#
###B#C#.#.###
  #D#C#B#.#
  #D#B#A#C#
  #A#D#C#A#
  #########

#############
#A......B.BD#
###B#C#.#.###
  #D#C#.#.#
  #D#B#A#C#
  #A#D#C#A#
  #########

#############
#AA.....B.BD#
###B#C#.#.###
  #D#C#.#.#
  #D#B#.#C#
  #A#D#C#A#
  #########

#############
#AA.....B.BD#
###B#.#.#.###
  #D#C#.#.#
  #D#B#C#C#
  #A#D#C#A#
  #########

#############
#AA.....B.BD#
###B#.#.#.###
  #D#.#C#.#
  #D#B#C#C#
  #A#D#C#A#
  #########

#############
#AA...B.B.BD#
###B#.#.#.###
  #D#.#C#.#
  #D#.#C#C#
  #A#D#C#A#
  #########

#############
#AA.D.B.B.BD#
###B#.#.#.###
  #D#.#C#.#
  #D#.#C#C#
  #A#.#C#A#
  #########

#############
#AA.D...B.BD#
###B#.#.#.###
  #D#.#C#.#
  #D#.#C#C#
  #A#B#C#A#
  #########

#############
#AA.D.....BD#
###B#.#.#.###
  #D#.#C#.#
  #D#B#C#C#
  #A#B#C#A#
  #########

#############
#AA.D......D#
###B#.#.#.###
  #D#B#C#.#
  #D#B#C#C#
  #A#B#C#A#
  #########

#############
#AA.D......D#
###B#.#C#.###
  #D#B#C#.#
  #D#B#C#.#
  #A#B#C#A#
  #########

#############
#AA.D.....AD#
###B#.#C#.###
  #D#B#C#.#
  #D#B#C#.#
  #A#B#C#.#
  #########

#############
#AA.......AD#
###B#.#C#.###
  #D#B#C#.#
  #D#B#C#.#
  #A#B#C#D#
  #########

#############
#AA.......AD#
###.#B#C#.###
  #D#B#C#.#
  #D#B#C#.#
  #A#B#C#D#
  #########

#############
#AA.......AD#
###.#B#C#.###
  #.#B#C#.#
  #D#B#C#D#
  #A#B#C#D#
  #########

#############
#AA.D.....AD#
###.#B#C#.###
  #.#B#C#.#
  #.#B#C#D#
  #A#B#C#D#
  #########

#############
#A..D.....AD#
###.#B#C#.###
  #.#B#C#.#
  #A#B#C#D#
  #A#B#C#D#
  #########

#############
#...D.....AD#
###.#B#C#.###
  #A#B#C#.#
  #A#B#C#D#
  #A#B#C#D#
  #########

#############
#.........AD#
###.#B#C#.###
  #A#B#C#D#
  #A#B#C#D#
  #A#B#C#D#
  #########

#############
#..........D#
###A#B#C#.###
  #A#B#C#D#
  #A#B#C#D#
  #A#B#C#D#
  #########

#############
#...........#
###A#B#C#D###
  #A#B#C#D#
  #A#B#C#D#
  #A#B#C#D#
  #########
</code></pre><p>Using the initial configuration from the full diagram, <em>what is the least energy required to organize the amphipods?</em></p><hr><p>Proposed solution: same solution but the room size is a little bigger and there is a hard coded section to add to our input, the solution just needs some generalization</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
from copy import copy, deepcopy
from heapq import heappush, heappop
from math import copysign
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

multiplier = {&quot;A&quot;: 1, &quot;B&quot;: 10, &quot;C&quot;: 100, &quot;D&quot;: 1000}
amphipod_dst = {&quot;A&quot;: 2, &quot;B&quot;: 4, &quot;C&quot;: 6, &quot;D&quot;: 8}

class Amphipod:
    def __init__(self, label, pos):
        self.label = label
        self.pos = pos
        self.moved = False

    def move(self, new_pos, field):
        self.moved = True
        moves = abs(self.pos[0] - new_pos[0]) + abs(self.pos[1] - new_pos[1])
        field.field[new_pos] = self
        field.field[self.pos] = None
        self.pos = new_pos
        field.points += moves * multiplier[self.label]

    def __repr__(self):
        return &quot;Amphipod({})&quot;.format(self.label)

    def __eq__(self, other):
        return other and self.label == other.label \
                and self.pos == other.pos and self.moved == other.moved

    def __hash__(self):
        return hash((self.label, self.pos, self.moved))

class Field:
    def __init__(self, field, points):
        self.field = field
        self.points = points

    def __lt__(self, other):
        return self.points &lt; other.points

    def __eq__(self, other):
        return self.field == other.field and self.points == other.points

    def __hash__(self):
        states = []
        for pod in self.field.values():
            if pod:
                states.append(hash(pod))
        states.sort()
        return hash(tuple(states))

    def custom_copy(self, pos):
        # shallow copy field dict and points
        field = copy(self.field)
        points = copy(self.points)
        obj = Field(field, points)
        # deepcopy single amphipod object at position
        obj.field[pos] = deepcopy(obj.field[pos])
        return obj

    def solved(self):
        field = self.field
        for y in range(1,5):
            for x in range(4):
                x = x*2 + 2
                if not field[x,y]: return False
                if amphipod_dst[field[x,y].label] != x: return False
        return True

def print_field(field):
    for y in range(5):
        result = &quot;&quot;
        for x in range(11):
            if (x,y) not in field:
                result += &quot;#&quot;
            elif field[x,y] is None:
                result += &quot;.&quot;
            else:
                result += field[x,y].label
        print(result)
    print(&quot;&quot;)

field = {(x,0):None for x in range(11)}
field[2,2] = Amphipod(&quot;D&quot;, (2,2))
field[2,3] = Amphipod(&quot;D&quot;, (2,3))
field[4,2] = Amphipod(&quot;C&quot;, (4,2))
field[4,3] = Amphipod(&quot;B&quot;, (4,3))
field[6,2] = Amphipod(&quot;B&quot;, (6,2))
field[6,3] = Amphipod(&quot;A&quot;, (6,3))
field[8,2] = Amphipod(&quot;A&quot;, (8,2))
field[8,3] = Amphipod(&quot;C&quot;, (8,3))
for x in range(4):
    x = x*2 + 3
    field[x-1,1] = Amphipod(file_input[2][x], (x-1,1))
    field[x-1,4] = Amphipod(file_input[3][x], (x-1,4))
field = Field(field, 0)

queue = []
heappush(queue, field)
visited_states = set()
room_rows = [2,4,6,8]
min_energy_cost = sys.maxsize
while len(queue) != 0:
    field_obj = heappop(queue)
    field_hash, field, score = hash(field_obj), field_obj.field, field_obj.points
    if field_hash in visited_states or score &gt; min_energy_cost:
        continue
    visited_states.add(field_hash)
    if field_obj.solved():
        min_energy_cost = min(min_energy_cost, score)
        continue
    for y in range(1,5):
        for x in range(4):
            x = x*2 + 2
            if field[x,y] and not field[x,y].moved:
                blocked = False
                for y2 in range(y-1, 0, -1):
                    if field[x,y2]:
                        blocked = True
                        break
                if blocked: continue
                for x2 in range(x-1, -1, -1):
                    if x2 in room_rows: continue
                    if field[x2,0]: break
                    new_field = field_obj.custom_copy((x,y))
                    new_field.field[x,y].move((x2,0), new_field)
                    heappush(queue, new_field)
                for x2 in range(x+1, 11):
                    if x2 in room_rows: continue
                    if field[x2,0]: break
                    new_field = field_obj.custom_copy((x,y))
                    new_field.field[x,y].move((x2,0), new_field)
                    heappush(queue, new_field)
    for x in range(11):
        if not field[x,0]: continue
        dest = amphipod_dst[field[x,0].label]
        if field[dest,1]: continue
        room_available = True
        for y in range(4, 1, -1):
            if field[dest,y] and field[dest,y].label != field[x,0].label:
                room_available = False
        if not room_available: continue
        direction = int(copysign(1, dest-x))
        for x2 in range(x+direction, dest+direction, direction):
            if field[x2,0]: break
            if x2 != dest: continue
            for y in range(4, 0, -1):
                if not field[x2,y]:
                    new_field = field_obj.custom_copy((x,0))
                    new_field.field[x,0].move((x2,y), new_field)
                    heappush(queue, new_field)
                    break

print(&quot;Minimum energy cost: {}&quot;.format(min_energy_cost))
</code></pre><figcaption>Super proud of this</figcaption></figure><p>And it performs so well!</p><pre><code class="language-bash">&#x276F; time python3 solution23.py input23
Minimum energy cost: 46182
python3 solution23.py input23  5.93s user 0.02s system 99% cpu 5.949 total
</code></pre>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 22 | Reactor Reboot]]></title><description><![CDATA[Day 22 - Another 3d problem, this time with turning cube volumes on/off in a specific order. The catch: these cubes can be huge and you cannot count the coordinates individually. The solution: use dimensions and split the cubes up as they intersect 🧊]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-22/</link><guid isPermaLink="false">61d1d3b020bb83032e76dfa6</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Sun, 02 Jan 2022 16:53:56 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-10.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-11.png" class="kg-image" alt="[Advent of Code 2021] Day 22 | Reactor Reboot" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2022/01/adventofcode-11.png 600w, https://ghost.kevintarta.com/content/images/2022/01/adventofcode-11.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-10.png" alt="[Advent of Code 2021] Day 22 | Reactor Reboot"><p>Operating at these extreme ocean depths has overloaded the submarine&apos;s reactor; it needs to be rebooted.</p><p>The reactor core is made up of a large 3-dimensional grid made up entirely of cubes, one cube per integer 3-dimensional coordinate (<code>x,y,z</code>). Each cube can be either <em>on</em> or <em>off</em>; at the start of the reboot process, they are all <em>off</em>. (Could it be an old model of a reactor you&apos;ve seen <a href="https://adventofcode.com/2020/day/17?ref=ghost.kevintarta.com">before</a>?)</p><p>To reboot the reactor, you just need to set all of the cubes to either <em>on</em> or <em>off</em> by following a list of <em>reboot steps</em> (your puzzle input). Each step specifies a <a href="https://en.wikipedia.org/wiki/Cuboid?ref=ghost.kevintarta.com">cuboid</a> (the set of all cubes that have coordinates which fall within ranges for <code>x</code>, <code>y</code>, and <code>z</code>) and whether to turn all of the cubes in that cuboid <em>on</em> or <em>off</em>.</p><p>For example, given these reboot steps:</p><pre><code>on x=10..12,y=10..12,z=10..12
on x=11..13,y=11..13,z=11..13
off x=9..11,y=9..11,z=9..11
on x=10..10,y=10..10,z=10..10
</code></pre><p>The first step (<code>on x=10..12,y=10..12,z=10..12</code>) turns <em>on</em> a 3x3x3 cuboid consisting of 27 cubes:</p><ul><li><code>10,10,10</code></li><li><code>10,10,11</code></li><li><code>10,10,12</code></li><li><code>10,11,10</code></li><li><code>10,11,11</code></li><li><code>10,11,12</code></li><li><code>10,12,10</code></li><li><code>10,12,11</code></li><li><code>10,12,12</code></li><li><code>11,10,10</code></li><li><code>11,10,11</code></li><li><code>11,10,12</code></li><li><code>11,11,10</code></li><li><code>11,11,11</code></li><li><code>11,11,12</code></li><li><code>11,12,10</code></li><li><code>11,12,11</code></li><li><code>11,12,12</code></li><li><code>12,10,10</code></li><li><code>12,10,11</code></li><li><code>12,10,12</code></li><li><code>12,11,10</code></li><li><code>12,11,11</code></li><li><code>12,11,12</code></li><li><code>12,12,10</code></li><li><code>12,12,11</code></li><li><code>12,12,12</code></li></ul><p>The second step (<code>on x=11..13,y=11..13,z=11..13</code>) turns <em>on</em> a 3x3x3 cuboid that overlaps with the first. As a result, only 19 additional cubes turn on; the rest are already on from the previous step:</p><ul><li><code>11,11,13</code></li><li><code>11,12,13</code></li><li><code>11,13,11</code></li><li><code>11,13,12</code></li><li><code>11,13,13</code></li><li><code>12,11,13</code></li><li><code>12,12,13</code></li><li><code>12,13,11</code></li><li><code>12,13,12</code></li><li><code>12,13,13</code></li><li><code>13,11,11</code></li><li><code>13,11,12</code></li><li><code>13,11,13</code></li><li><code>13,12,11</code></li><li><code>13,12,12</code></li><li><code>13,12,13</code></li><li><code>13,13,11</code></li><li><code>13,13,12</code></li><li><code>13,13,13</code></li></ul><p>The third step (<code>off x=9..11,y=9..11,z=9..11</code>) turns <em>off</em> a 3x3x3 cuboid that overlaps partially with some cubes that are on, ultimately turning off 8 cubes:</p><ul><li><code>10,10,10</code></li><li><code>10,10,11</code></li><li><code>10,11,10</code></li><li><code>10,11,11</code></li><li><code>11,10,10</code></li><li><code>11,10,11</code></li><li><code>11,11,10</code></li><li><code>11,11,11</code></li></ul><p>The final step (<code>on x=10..10,y=10..10,z=10..10</code>) turns <em>on</em> a single cube, <code>10,10,10</code>. After this last step, <code>_39_</code> cubes are <em>on</em>.</p><p>The initialization procedure only uses cubes that have <code>x</code>, <code>y</code>, and <code>z</code> positions of at least <code>-50</code> and at most <code>50</code>. For now, ignore cubes outside this region.</p><p>Here is a larger example:</p><pre><code>on x=-20..26,y=-36..17,z=-47..7
on x=-20..33,y=-21..23,z=-26..28
on x=-22..28,y=-29..23,z=-38..16
on x=-46..7,y=-6..46,z=-50..-1
on x=-49..1,y=-3..46,z=-24..28
on x=2..47,y=-22..22,z=-23..27
on x=-27..23,y=-28..26,z=-21..29
on x=-39..5,y=-6..47,z=-3..44
on x=-30..21,y=-8..43,z=-13..34
on x=-22..26,y=-27..20,z=-29..19
off x=-48..-32,y=26..41,z=-47..-37
on x=-12..35,y=6..50,z=-50..-2
off x=-48..-32,y=-32..-16,z=-15..-5
on x=-18..26,y=-33..15,z=-7..46
off x=-40..-22,y=-38..-28,z=23..41
on x=-16..35,y=-41..10,z=-47..6
off x=-32..-23,y=11..30,z=-14..3
on x=-49..-5,y=-3..45,z=-29..18
off x=18..30,y=-20..-8,z=-3..13
on x=-41..9,y=-7..43,z=-33..15
on x=-54112..-39298,y=-85059..-49293,z=-27449..7877
on x=967..23432,y=45373..81175,z=27513..53682
</code></pre><p>The last two steps are fully outside the initialization procedure area; all other steps are fully within it. After executing these steps in the initialization procedure region, <code>_590784_</code> cubes are <em>on</em>.</p><p>Execute the reboot steps. Afterward, considering only cubes in the region <code>x=-50..50,y=-50..50,z=-50..50</code>, <em>how many cubes are on?</em></p><hr><p>Proposed solution: brute force seems to be achievable for part 1 but probably not for part 2, I do it anyway &#x2013; using a set of size-3 tuples for the coordinates</p><p>Time complexity: O(V) where V is the &quot;volume&quot; or the total number of points/cubes in the input</p><p>Space complexity: O(V)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

cubes = set()
init_range = range(-50,51)
for line in file_input:
    if line == &quot;&quot;:
        continue
    instr, ranges = line.split()
    _x, _y, _z = ranges.split(&quot;,&quot;)
    x1, x2 = [int(x) for x in _x.split(&quot;=&quot;)[1].split(&quot;..&quot;)]
    y1, y2 = [int(y) for y in _y.split(&quot;=&quot;)[1].split(&quot;..&quot;)]
    z1, z2 = [int(z) for z in _z.split(&quot;=&quot;)[1].split(&quot;..&quot;)]
    for x in range(x1, x2+1):
        if x &lt; -50 or x &gt; 50:
            break
        for y in range(y1, y2+1):
            for z in range(z1, z2+1):
                if instr == &quot;on&quot;:
                    cubes.add((x,y,z))
                else:
                    cubes.discard((x,y,z))

print(&quot;Number of cubes lit: {}&quot;.format(len(cubes)))
</code></pre><figcaption>Add cubes to set when the instruction is &quot;on&quot; and remove if &quot;off&quot;</figcaption></figure><pre><code class="language-bash">&#x276F; python3 solution22.py input22
Number of cubes lit: 588120
</code></pre><h3 id="part-2">Part 2</h3><p>Now that the initialization procedure is complete, you can reboot the reactor.</p><p>Starting with all cubes <em>off</em>, run all of the <em>reboot steps</em> for all cubes in the reactor.</p><p>Consider the following reboot steps:</p><pre><code>on x=-5..47,y=-31..22,z=-19..33
on x=-44..5,y=-27..21,z=-14..35
on x=-49..-1,y=-11..42,z=-10..38
on x=-20..34,y=-40..6,z=-44..1
off x=26..39,y=40..50,z=-2..11
on x=-41..5,y=-41..6,z=-36..8
off x=-43..-33,y=-45..-28,z=7..25
on x=-33..15,y=-32..19,z=-34..11
off x=35..47,y=-46..-34,z=-11..5
on x=-14..36,y=-6..44,z=-16..29
on x=-57795..-6158,y=29564..72030,z=20435..90618
on x=36731..105352,y=-21140..28532,z=16094..90401
on x=30999..107136,y=-53464..15513,z=8553..71215
on x=13528..83982,y=-99403..-27377,z=-24141..23996
on x=-72682..-12347,y=18159..111354,z=7391..80950
on x=-1060..80757,y=-65301..-20884,z=-103788..-16709
on x=-83015..-9461,y=-72160..-8347,z=-81239..-26856
on x=-52752..22273,y=-49450..9096,z=54442..119054
on x=-29982..40483,y=-108474..-28371,z=-24328..38471
on x=-4958..62750,y=40422..118853,z=-7672..65583
on x=55694..108686,y=-43367..46958,z=-26781..48729
on x=-98497..-18186,y=-63569..3412,z=1232..88485
on x=-726..56291,y=-62629..13224,z=18033..85226
on x=-110886..-34664,y=-81338..-8658,z=8914..63723
on x=-55829..24974,y=-16897..54165,z=-121762..-28058
on x=-65152..-11147,y=22489..91432,z=-58782..1780
on x=-120100..-32970,y=-46592..27473,z=-11695..61039
on x=-18631..37533,y=-124565..-50804,z=-35667..28308
on x=-57817..18248,y=49321..117703,z=5745..55881
on x=14781..98692,y=-1341..70827,z=15753..70151
on x=-34419..55919,y=-19626..40991,z=39015..114138
on x=-60785..11593,y=-56135..2999,z=-95368..-26915
on x=-32178..58085,y=17647..101866,z=-91405..-8878
on x=-53655..12091,y=50097..105568,z=-75335..-4862
on x=-111166..-40997,y=-71714..2688,z=5609..50954
on x=-16602..70118,y=-98693..-44401,z=5197..76897
on x=16383..101554,y=4615..83635,z=-44907..18747
off x=-95822..-15171,y=-19987..48940,z=10804..104439
on x=-89813..-14614,y=16069..88491,z=-3297..45228
on x=41075..99376,y=-20427..49978,z=-52012..13762
on x=-21330..50085,y=-17944..62733,z=-112280..-30197
on x=-16478..35915,y=36008..118594,z=-7885..47086
off x=-98156..-27851,y=-49952..43171,z=-99005..-8456
off x=2032..69770,y=-71013..4824,z=7471..94418
on x=43670..120875,y=-42068..12382,z=-24787..38892
off x=37514..111226,y=-45862..25743,z=-16714..54663
off x=25699..97951,y=-30668..59918,z=-15349..69697
off x=-44271..17935,y=-9516..60759,z=49131..112598
on x=-61695..-5813,y=40978..94975,z=8655..80240
off x=-101086..-9439,y=-7088..67543,z=33935..83858
off x=18020..114017,y=-48931..32606,z=21474..89843
off x=-77139..10506,y=-89994..-18797,z=-80..59318
off x=8476..79288,y=-75520..11602,z=-96624..-24783
on x=-47488..-1262,y=24338..100707,z=16292..72967
off x=-84341..13987,y=2429..92914,z=-90671..-1318
off x=-37810..49457,y=-71013..-7894,z=-105357..-13188
off x=-27365..46395,y=31009..98017,z=15428..76570
off x=-70369..-16548,y=22648..78696,z=-1892..86821
on x=-53470..21291,y=-120233..-33476,z=-44150..38147
off x=-93533..-4276,y=-16170..68771,z=-104985..-24507
</code></pre><p>After running the above reboot steps, <code>_2758514936282235_</code> cubes are <em>on</em>. (Just for fun, <code>474140</code> of those are also in the initialization procedure region.)</p><p>Starting again with all cubes <em>off</em>, execute all reboot steps. Afterward, considering all cubes, <em>how many cubes are on?</em></p><hr><p>Proposed solution: instead of counting individual &quot;cubes,&quot; or points, use the dimensions of the cubes and split the cubes as they intersect to make sure that the volumes are not overlapping &#x2013; this is important when calculating the final volume</p><p>Time complexity: O(n) where n is the number of instructions</p><p>Space complexity: O(n)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
from math import prod
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

class Cube:
    def __init__(self, dims):
        self.dims = dims

    def intersects(self, other):
        return not (other.dims[0] &lt; self.dims[0] and other.dims[1] &lt; self.dims[0]) \
            and not (other.dims[0] &gt; self.dims[1] and other.dims[1] &gt; self.dims[1]) \
            and not (other.dims[2] &lt; self.dims[2] and other.dims[3] &lt; self.dims[2]) \
            and not (other.dims[2] &gt; self.dims[3] and other.dims[3] &gt; self.dims[3]) \
            and not (other.dims[4] &lt; self.dims[4] and other.dims[5] &lt; self.dims[4]) \
            and not (other.dims[4] &gt; self.dims[5] and other.dims[5] &gt; self.dims[5])

    def volume(self):
        return prod([self.dims[i+1] - self.dims[i] + 1 for i in range(0, 6, 2)])

    def __str__(self):
        return str(self.dims)

def split(cubes, cube1, cube2):
    &quot;&quot;&quot;
    If cube2 intersects cube1, this functions splits cube1 into new cubes
    and adds them to the cubes set.
    &quot;&quot;&quot;
    x_start, y_start, z_start = cube1.dims[0], cube1.dims[2], cube1.dims[4]
    x_end, y_end, z_end = cube1.dims[1], cube1.dims[3], cube1.dims[5]
    if x_start &lt; cube2.dims[0]:
        cubes.add(Cube((x_start, cube2.dims[0]-1, y_start, y_end, z_start, z_end)))
        x_start = cube2.dims[0]
    if y_start &lt; cube2.dims[2]:
        cubes.add(Cube((x_start, x_end, y_start, cube2.dims[2]-1, z_start, z_end)))
        y_start = cube2.dims[2]
    if z_start &lt; cube2.dims[4]:
        cubes.add(Cube((x_start, x_end, y_start, y_end, z_start, cube2.dims[4]-1)))
        z_start = cube2.dims[4]
    x_start2, y_start2, z_start2 = cube2.dims[1] + 1, cube2.dims[3] + 1, cube2.dims[5] + 1
    if x_start2 &lt;= x_end:
        cubes.add(Cube((x_start2, x_end, y_start, y_end, z_start, z_end)))
        x_end = cube2.dims[1]
    if y_start2 &lt;= y_end:
        cubes.add(Cube((x_start, x_end, y_start2, y_end, z_start, z_end)))
        y_end = cube2.dims[3]
    if z_start2 &lt;= z_end:
        cubes.add(Cube((x_start, x_end, y_start, y_end, z_start2, z_end)))
        z_end = cube2.dims[5]

cubes = set()
for line in file_input:
    if line == &quot;&quot;:
        continue
    instr, ranges = line.split()
    _x, _y, _z = ranges.split(&quot;,&quot;)
    x1, x2 = [int(x) for x in _x.split(&quot;=&quot;)[1].split(&quot;..&quot;)]
    y1, y2 = [int(y) for y in _y.split(&quot;=&quot;)[1].split(&quot;..&quot;)]
    z1, z2 = [int(z) for z in _z.split(&quot;=&quot;)[1].split(&quot;..&quot;)]
    new_cube = Cube((x1, x2, y1, y2, z1, z2))
    for cube in list(cubes):
        if cube.intersects(new_cube):
            cubes.remove(cube)
            split(cubes, cube, new_cube)
    if instr == &quot;on&quot;:
        cubes.add(new_cube)

total = sum([cube.volume() for cube in cubes])
print(&quot;Number of cubes lit: {}&quot;.format(total))
</code></pre><figcaption>Splitting may seem complicated until you draw it out</figcaption></figure><p>I am not going to go over it to deeply, but you need to be careful when splitting the cube to make sure the split regions do not overlap. This <code>split</code> function can split the original cube anywhere from 1 smaller cube (if the comparison cube covers a whole face of the original with some intersecting depth) to 6 smaller cubes (if the comparison cube is fully contained within the original cube). Once I split the cube once, I adjust the start position for the respective axis to make sure this overlap does not happen with the remaining splits, if any.</p><p>Once the splitting functionality works, it&apos;s just a matter of iterating through the instructions and using each volume as a comparison cube to the ones that have already been processed. If any two cubes intersect, remove the original from the set and split it <code>x</code> ways based on the type of intersection. Add the new splits to the set. Only add the comparison cube to the set if the instruction is &quot;on.&quot; If it&apos;s &quot;off,&quot; then just continue to the next instruction.</p><pre><code class="language-bash">&#x276F; time python3 solution22.py input22
Number of cubes lit: 1134088247046731
python3 solution22.py input22  0.23s user 0.01s system 99% cpu 0.243 total</code></pre>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 21 | Dirac Dice]]></title><description><![CDATA[Day 21 - Quantum dice where each roll splits the universe into 3 ways; this gets out of hand fast. Dynamic programming, memoization, and recursion were all helpful 🎲]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-21/</link><guid isPermaLink="false">61d1cedd20bb83032e76df52</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Sun, 02 Jan 2022 16:32:03 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-8.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-9.png" class="kg-image" alt="[Advent of Code 2021] Day 21 | Dirac Dice" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2022/01/adventofcode-9.png 600w, https://ghost.kevintarta.com/content/images/2022/01/adventofcode-9.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-8.png" alt="[Advent of Code 2021] Day 21 | Dirac Dice"><p>There&apos;s not much to do as you slowly descend to the bottom of the ocean. The submarine computer challenges you to a nice game of <em>Dirac Dice</em>.</p><p>This game consists of a single <a href="https://en.wikipedia.org/wiki/Dice?ref=ghost.kevintarta.com">die</a>, two <a href="https://en.wikipedia.org/wiki/Glossary_of_board_games?ref=ghost.kevintarta.com#piece">pawns</a>, and a game board with a circular track containing ten spaces marked <code>1</code> through <code>10</code> clockwise. Each player&apos;s <em>starting space</em> is chosen randomly (your puzzle input). Player 1 goes first.</p><p>Players take turns moving. On each player&apos;s turn, the player rolls the die <em>three times</em> and adds up the results. Then, the player moves their pawn that many times <em>forward</em> around the track (that is, moving clockwise on spaces in order of increasing value, wrapping back around to <code>1</code> after <code>10</code>). So, if a player is on space <code>7</code> and they roll <code>2</code>, <code>2</code>, and <code>1</code>, they would move forward 5 times, to spaces <code>8</code>, <code>9</code>, <code>10</code>, <code>1</code>, and finally stopping on <code>2</code>.</p><p>After each player moves, they increase their <em>score</em> by the value of the space their pawn stopped on. Players&apos; scores start at <code>0</code>. So, if the first player starts on space <code>7</code> and rolls a total of <code>5</code>, they would stop on space <code>2</code> and add <code>2</code> to their score (for a total score of <code>2</code>). The game immediately ends as a win for any player whose score reaches <em>at least <code>1000</code></em>.</p><p>Since the first game is a practice game, the submarine opens a compartment labeled <em>deterministic dice</em> and a 100-sided die falls out. This die always rolls <code>1</code> first, then <code>2</code>, then <code>3</code>, and so on up to <code>100</code>, after which it starts over at <code>1</code> again. Play using this die.</p><p>For example, given these starting positions:</p><pre><code>Player 1 starting position: 4
Player 2 starting position: 8
</code></pre><p>This is how the game would go:</p><ul><li>Player 1 rolls <code>1</code>+<code>2</code>+<code>3</code> and moves to space <code>10</code> for a total score of <code>10</code>.</li><li>Player 2 rolls <code>4</code>+<code>5</code>+<code>6</code> and moves to space <code>3</code> for a total score of <code>3</code>.</li><li>Player 1 rolls <code>7</code>+<code>8</code>+<code>9</code> and moves to space <code>4</code> for a total score of <code>14</code>.</li><li>Player 2 rolls <code>10</code>+<code>11</code>+<code>12</code> and moves to space <code>6</code> for a total score of <code>9</code>.</li><li>Player 1 rolls <code>13</code>+<code>14</code>+<code>15</code> and moves to space <code>6</code> for a total score of <code>20</code>.</li><li>Player 2 rolls <code>16</code>+<code>17</code>+<code>18</code> and moves to space <code>7</code> for a total score of <code>16</code>.</li><li>Player 1 rolls <code>19</code>+<code>20</code>+<code>21</code> and moves to space <code>6</code> for a total score of <code>26</code>.</li><li>Player 2 rolls <code>22</code>+<code>23</code>+<code>24</code> and moves to space <code>6</code> for a total score of <code>22</code>.</li></ul><p>...after many turns...</p><ul><li>Player 2 rolls <code>82</code>+<code>83</code>+<code>84</code> and moves to space <code>6</code> for a total score of <code>742</code>.</li><li>Player 1 rolls <code>85</code>+<code>86</code>+<code>87</code> and moves to space <code>4</code> for a total score of <code>990</code>.</li><li>Player 2 rolls <code>88</code>+<code>89</code>+<code>90</code> and moves to space <code>3</code> for a total score of <code>745</code>.</li><li>Player 1 rolls <code>91</code>+<code>92</code>+<code>93</code> and moves to space <code>10</code> for a final score, <code>1000</code>.</li></ul><p>Since player 1 has at least <code>1000</code> points, player 1 wins and the game ends. At this point, the losing player had <code>745</code> points and the die had been rolled a total of <code>993</code> times; <code>745 * 993 = _739785_</code>.</p><p>Play a practice game using the deterministic 100-sided die. The moment either player wins, <em>what do you get if you multiply the score of the losing player by the number of times the die was rolled during the game?</em></p><hr><p>Proposed solution: take the starting positions and play the game out with the defined rules until a player wins &#x2013; keep track of the rolls and each players score</p><p>Time complexity: O(1) since the input is really not a scaling factor if we are just considering the single game</p><p>Space complexity: O(1)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)
p1start, p2start = tuple(map(lambda l: int(l[-1]), file_input[0:2]))

p1, p2 = p1start, p2start
turn, rolls, die = 0, 0, 1
p1score, p2score = 0, 0
while p1score &lt; 1000 and p2score &lt; 1000:
    roll = 0
    for _ in range(3):
        roll += die
        rolls += 1
        die = (die % 100) + 1
    if not turn:
        p1 = ((p1+roll-1) % 10) + 1
        p1score += p1
    else:
        p2 = ((p2+roll-1) % 10) + 1
        p2score += p2
    turn = (turn + 1) % 2

print(&quot;min(p1score,p2score) * rolls = {}&quot;.format(min(p1score, p2score) * rolls))</code></pre><figcaption>A nice game of dice</figcaption></figure><pre><code class="language-bash">&#x276F; python3 solution21.py input21
min(p1score,p2score) * rolls = 711480
</code></pre><h3 id="part-2">Part 2</h3><p>Now that you&apos;re warmed up, it&apos;s time to play the real game.</p><p>A second compartment opens, this time labeled <em>Dirac dice</em>. Out of it falls a single three-sided die.</p><p>As you experiment with the die, you feel a little strange. An informational brochure in the compartment explains that this is a <em>quantum die</em>: when you roll it, the universe <em>splits into multiple copies</em>, one copy for each possible outcome of the die. In this case, rolling the die always splits the universe into <em>three copies</em>: one where the outcome of the roll was <code>1</code>, one where it was <code>2</code>, and one where it was <code>3</code>.</p><p>The game is played the same as before, although to prevent things from getting too far out of hand, the game now ends when either player&apos;s score reaches at least <code>_21_</code>.</p><p>Using the same starting positions as in the example above, player 1 wins in <code>_444356092776315_</code> universes, while player 2 merely wins in <code>341960390180808</code> universes.</p><p>Using your given starting positions, determine every possible outcome. <em>Find the player that wins in more universes; in how many universes does that player win?</em></p><hr><p>Proposed solution: the number of states is rather limited since the score can only go up to 21 now and the dice are only 3 sided, making dynamic programming and memoization really useful to not count the same state</p><p>Time complexity: O(n * m) where n is the max score and m is the number of possible split universes</p><p>Space complexity: O(n * m)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)
p1start, p2start = tuple(map(lambda l: int(l[-1]), file_input[0:2]))

game_states = {}
def count_wins(p1, p2, p1score=0, p2score=0):
    if p1score &gt;= 21:
        return (1,0)
    if p2score &gt;= 21:
        return (0,1)
    if (p1, p2, p1score, p2score) in game_states:
        return game_states[p1, p2, p1score, p2score]
    result = (0,0)
    for d1 in range(1, 4):
        for d2 in range(1, 4):
            for d3 in range(1, 4):
                _p1 = ((p1 + d1 + d2 + d3 - 1) % 10) + 1
                _p1score = p1score + _p1
                swap = count_wins(p2, _p1, p2score, _p1score)
                result = (result[0] + swap[1], result[1] + swap[0])
    game_states[p1, p2, p1score, p2score] = result
    return result

print(&quot;max(count_wins(p1start, p2start)): {}&quot;.format(max(count_wins(p1start, p2start))))
</code></pre><figcaption>Clever DP and memoization, swap results and recursively call count_wins to achieve all states</figcaption></figure><pre><code class="language-bash">&#x276F; python3 solution21.py input21
max(count_wins(p1start, p2start)): 265845890886828
</code></pre>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 20 | Trench Map]]></title><description><![CDATA[Day 20 - Image "enhancement" algorithm where you have to track infinite pixels. The trick: you don't have to track infinite pixels 🤖 🎨]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-20/</link><guid isPermaLink="false">61d1135320bb83032e76def5</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Sun, 02 Jan 2022 16:14:39 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-6.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-7.png" class="kg-image" alt="[Advent of Code 2021] Day 20 | Trench Map" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2022/01/adventofcode-7.png 600w, https://ghost.kevintarta.com/content/images/2022/01/adventofcode-7.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-6.png" alt="[Advent of Code 2021] Day 20 | Trench Map"><p>With the scanners fully deployed, you turn their attention to mapping the floor of the ocean trench.</p><p>When you get back the image from the scanners, it seems to just be random noise. Perhaps you can combine an image enhancement algorithm and the input image (your puzzle input) to clean it up a little.</p><p>For example:</p><pre><code>..#.#..#####.#.#.#.###.##.....###.##.#..###.####..#####..#....#..#..##..##
#..######.###...####..#..#####..##..#.#####...##.#.#..#.##..#.#......#.###
.######.###.####...#.##.##..#..#..#####.....#.#....###..#.##......#.....#.
.#..#..##..#...##.######.####.####.#.#...#.......#..#.#.#...####.##.#.....
.#..#...##.#.##..#...##.#.##..###.#......#.#.......#.#.#.####.###.##...#..
...####.#..#..#.##.#....##..#.####....##...##..#...#......#.#.......#.....
..##..####..#...#.#.#...##..#.#..###..#####........#..####......#..#

#..#.
#....
##..#
..#..
..###
</code></pre><p>The first section is the <em>image enhancement algorithm</em>. It is normally given on a single line, but it has been wrapped to multiple lines in this example for legibility. The second section is the <em>input image</em>, a two-dimensional grid of <em>light pixels</em> (<code>#</code>) and <em>dark pixels</em> (<code>.</code>).</p><p>The image enhancement algorithm describes how to enhance an image by <em>simultaneously</em> converting all pixels in the input image into an output image. Each pixel of the output image is determined by looking at a 3x3 square of pixels centered on the corresponding input image pixel. So, to determine the value of the pixel at (5,10) in the output image, nine pixels from the input image need to be considered: (4,9), (4,10), (4,11), (5,9), (5,10), (5,11), (6,9), (6,10), and (6,11). These nine input pixels are combined into a single binary number that is used as an index in the <em>image enhancement algorithm</em> string.</p><p>For example, to determine the output pixel that corresponds to the very middle pixel of the input image, the nine pixels marked by <code>[...]</code> would need to be considered:</p><pre><code># . . # .
#[. . .].
#[# . .]#
.[. # .].
. . # # #
</code></pre><p>Starting from the top-left and reading across each row, these pixels are <code>...</code>, then <code>#..</code>, then <code>.#.</code>; combining these forms <code>...#...#.</code>. By turning dark pixels (<code>.</code>) into <code>0</code> and light pixels (<code>#</code>) into <code>1</code>, the binary number <code>000100010</code> can be formed, which is <code>34</code> in decimal.</p><p>The image enhancement algorithm string is exactly 512 characters long, enough to match every possible 9-bit binary number. The first few characters of the string (numbered starting from zero) are as follows:</p><pre><code>0         10        20        30  34    40        50        60        70
|         |         |         |   |     |         |         |         |
..#.#..#####.#.#.#.###.##.....###.##.#..###.####..#####..#....#..#..##..##
</code></pre><p>In the middle of this first group of characters, the character at index 34 can be found: <code>#</code>. So, the output pixel in the center of the output image should be <code>#</code>, a <em>light pixel</em>.</p><p>This process can then be repeated to calculate every pixel of the output image.</p><p>Through advances in imaging technology, the images being operated on here are <em>infinite</em> in size. <em>Every</em> pixel of the infinite output image needs to be calculated exactly based on the relevant pixels of the input image. The small input image you have is only a small region of the actual infinite input image; the rest of the input image consists of dark pixels (<code>.</code>). For the purposes of the example, to save on space, only a portion of the infinite-sized input and output images will be shown.</p><p>The starting input image, therefore, looks something like this, with more dark pixels (<code>.</code>) extending forever in every direction not shown here:</p><pre><code>...............
...............
...............
...............
...............
.....#..#......
.....#.........
.....##..#.....
.......#.......
.......###.....
...............
...............
...............
...............
...............
</code></pre><p>By applying the image enhancement algorithm to every pixel simultaneously, the following output image can be obtained:</p><pre><code>...............
...............
...............
...............
.....##.##.....
....#..#.#.....
....##.#..#....
....####..#....
.....#..##.....
......##..#....
.......#.#.....
...............
...............
...............
...............
</code></pre><p>Through further advances in imaging technology, the above output image can also be used as an input image! This allows it to be enhanced <em>a second time</em>:</p><pre><code>...............
...............
...............
..........#....
....#..#.#.....
...#.#...###...
...#...##.#....
...#.....#.#...
....#.#####....
.....#.#####...
......##.##....
.......###.....
...............
...............
...............
</code></pre><p>Truly incredible - now the small details are really starting to come through. After enhancing the original input image twice, <code>_35_</code> pixels are lit.</p><p>Start with the original input image and apply the image enhancement algorithm twice, being careful to account for the infinite size of the images. <em>How many pixels are lit in the resulting image?</em></p><hr><p>Proposed solution: there is a &quot;working region&quot; that expands by a pixel in each direction on every step &#x2013; this is the key to not having to address infinite pixels; everything outside of the working region is always either on or off depending on the first and last bit of the enhancement algorithm string &#x2013; we can keep track of this with one variable</p><p>Time complexity: O(n) where n is the area of the original image size</p><p>Space complexity: O(n)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)
enhance = lambda x: 0 if enhancement[x] == &quot;.&quot; else 1
enhancement = file_input[0]

default = 0
pixel_map = {}
for y, line in enumerate(file_input[2:]):
    if line == &quot;&quot;:
        continue
    for x, char in enumerate(line):
        result = 0 if char == &quot;.&quot; else 1
        pixel_map[x,y] = result
        for dx in range(-1,2):
            for dy in range(-1,2):
                if dx == 0 and dy == 0 or (x+dx,y+dy) in pixel_map:
                    continue
                pixel_map[x+dx,y+dy] = default

for i in range(2):
    new_default = enhance(int(str(default) * 9, 2))
    pixel_map_old = dict(pixel_map)
    for pos, val in pixel_map_old.items():
        x, y = pos
        result = &quot;&quot;
        for dy in range(-1,2):
            for dx in range(-1,2):
                if (x+dx,y+dy) not in pixel_map_old:
                    pixel_map[x+dx,y+dy] = new_default
                    result += str(default)
                    continue
                result += str(pixel_map_old[x+dx,y+dy])
        result = int(result, 2)
        pixel_map[x,y] = enhance(result)
    default = new_default

num_pixels = len(list(filter(lambda x: x == 1, pixel_map.values())))
print(&quot;Number Pixel Lit: {}&quot;.format(num_pixels))</code></pre><figcaption>Keeping track of infinite pixels is not so bad</figcaption></figure><p>Here <code>default</code> is to track on or off outside of the working area.</p><pre><code class="language-bash">&#x276F; python3 solution20.py input20
Number Pixel Lit: 5359
</code></pre><h3 id="part-2">Part 2</h3><p>You still can&apos;t quite make out the details in the image. Maybe you just didn&apos;t <a href="https://en.wikipedia.org/wiki/Kernel_(image_processing)?ref=ghost.kevintarta.com">enhance</a> it enough.</p><p>If you enhance the starting input image in the above example a total of <em>50</em> times, <code>_3351_</code> pixels are lit in the final output image.</p><p>Start again with the original input image and apply the image enhancement algorithm 50 times. <em>How many pixels are lit in the resulting image?</em></p><hr><p>Proposed solution: same solution but increasing the number of steps from 2 to 50</p><p>Time complexity: O(n)</p><p>Space complexity: O(n)</p><p>There is probably a geometric function that addresses the growing working area which impacts both time and space complexity; however, I&apos;m moving on since part 2 was simple enough.</p><pre><code class="language-bash">&#x276F; time python3 solution20.py input20
Number Pixel Lit: 12333
python3 solution20.py input20  6.36s user 0.01s system 99% cpu 6.372 total</code></pre>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 19 | Beacon Scanner]]></title><description><![CDATA[Day 19 - Spatially complex problem until you abstract away the number of axes. It becomes a simple rotation + translation problem that you can brute force (if you don't mind waiting 15 minutes w/o optimization). Also, learned what a Manhattan distance means 🏙]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-19/</link><guid isPermaLink="false">61d1078920bb83032e76de19</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Sun, 02 Jan 2022 02:50:27 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-4.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-5.png" class="kg-image" alt="[Advent of Code 2021] Day 19 | Beacon Scanner" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2022/01/adventofcode-5.png 600w, https://ghost.kevintarta.com/content/images/2022/01/adventofcode-5.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-4.png" alt="[Advent of Code 2021] Day 19 | Beacon Scanner"><p>As your <a href="https://adventofcode.com/2021/day/17?ref=ghost.kevintarta.com">probe</a> drifted down through this area, it released an assortment of <em>beacons</em> and <em>scanners</em> into the water. It&apos;s difficult to navigate in the pitch black open waters of the ocean trench, but if you can build a map of the trench using data from the scanners, you should be able to safely reach the bottom.</p><p>The beacons and scanners float motionless in the water; they&apos;re designed to maintain the same position for long periods of time. Each scanner is capable of detecting all beacons in a large cube centered on the scanner; beacons that are at most 1000 units away from the scanner in each of the three axes (<code>x</code>, <code>y</code>, and <code>z</code>) have their precise position determined relative to the scanner. However, scanners cannot detect other scanners. The submarine has automatically summarized the relative positions of beacons detected by each scanner (your puzzle input).</p><p>For example, if a scanner is at <code>x,y,z</code> coordinates <code>500,0,-500</code> and there are beacons at <code>-500,1000,-1500</code> and <code>1501,0,-500</code>, the scanner could report that the first beacon is at <code>-1000,1000,-1000</code> (relative to the scanner) but would not detect the second beacon at all.</p><p>Unfortunately, while each scanner can report the positions of all detected beacons relative to itself, <em>the scanners do not know their own position</em>. You&apos;ll need to determine the positions of the beacons and scanners yourself.</p><p>The scanners and beacons map a single contiguous 3d region. This region can be reconstructed by finding pairs of scanners that have overlapping detection regions such that there are <em>at least 12 beacons</em> that both scanners detect within the overlap. By establishing 12 common beacons, you can precisely determine where the scanners are relative to each other, allowing you to reconstruct the beacon map one scanner at a time.</p><p>For a moment, consider only two dimensions. Suppose you have the following scanner reports:</p><pre><code>--- scanner 0 ---
0,2
4,1
3,3

--- scanner 1 ---
-1,-1
-5,0
-2,1
</code></pre><p>Drawing <code>x</code> increasing rightward, <code>y</code> increasing upward, scanners as <code>S</code>, and beacons as <code>B</code>, scanner <code>0</code> detects this:</p><pre><code>...B.
B....
....B
S....
</code></pre><p>Scanner <code>1</code> detects this:</p><pre><code>...B..
B....S
....B.
</code></pre><p>For this example, assume scanners only need 3 overlapping beacons. Then, the beacons visible to both scanners overlap to produce the following complete map:</p><pre><code>...B..
B....S
....B.
S.....
</code></pre><p>Unfortunately, there&apos;s a second problem: the scanners also don&apos;t know their <em>rotation or facing direction</em>. Due to magnetic alignment, each scanner is rotated some integer number of 90-degree turns around all of the <code>x</code>, <code>y</code>, and <code>z</code> axes. That is, one scanner might call a direction positive <code>x</code>, while another scanner might call that direction negative <code>y</code>. Or, two scanners might agree on which direction is positive <code>x</code>, but one scanner might be upside-down from the perspective of the other scanner. In total, each scanner could be in any of 24 different orientations: facing positive or negative <code>x</code>, <code>y</code>, or <code>z</code>, and considering any of four directions &quot;up&quot; from that facing.</p><p>For example, here is an arrangement of beacons as seen from a scanner in the same position but in different orientations:</p><pre><code>--- scanner 0 ---
-1,-1,1
-2,-2,2
-3,-3,3
-2,-3,1
5,6,-4
8,0,7

--- scanner 0 ---
1,-1,1
2,-2,2
3,-3,3
2,-1,3
-5,4,-6
-8,-7,0

--- scanner 0 ---
-1,-1,-1
-2,-2,-2
-3,-3,-3
-1,-3,-2
4,6,5
-7,0,8

--- scanner 0 ---
1,1,-1
2,2,-2
3,3,-3
1,3,-2
-4,-6,5
7,0,8

--- scanner 0 ---
1,1,1
2,2,2
3,3,3
3,1,2
-6,-4,-5
0,7,-8
</code></pre><p>By finding pairs of scanners that both see at least 12 of the same beacons, you can assemble the entire map. For example, consider the following report:</p><pre><code>--- scanner 0 ---
404,-588,-901
528,-643,409
-838,591,734
390,-675,-793
-537,-823,-458
-485,-357,347
-345,-311,381
-661,-816,-575
-876,649,763
-618,-824,-621
553,345,-567
474,580,667
-447,-329,318
-584,868,-557
544,-627,-890
564,392,-477
455,729,728
-892,524,684
-689,845,-530
423,-701,434
7,-33,-71
630,319,-379
443,580,662
-789,900,-551
459,-707,401

--- scanner 1 ---
686,422,578
605,423,415
515,917,-361
-336,658,858
95,138,22
-476,619,847
-340,-569,-846
567,-361,727
-460,603,-452
669,-402,600
729,430,532
-500,-761,534
-322,571,750
-466,-666,-811
-429,-592,574
-355,545,-477
703,-491,-529
-328,-685,520
413,935,-424
-391,539,-444
586,-435,557
-364,-763,-893
807,-499,-711
755,-354,-619
553,889,-390

--- scanner 2 ---
649,640,665
682,-795,504
-784,533,-524
-644,584,-595
-588,-843,648
-30,6,44
-674,560,763
500,723,-460
609,671,-379
-555,-800,653
-675,-892,-343
697,-426,-610
578,704,681
493,664,-388
-671,-858,530
-667,343,800
571,-461,-707
-138,-166,112
-889,563,-600
646,-828,498
640,759,510
-630,509,768
-681,-892,-333
673,-379,-804
-742,-814,-386
577,-820,562

--- scanner 3 ---
-589,542,597
605,-692,669
-500,565,-823
-660,373,557
-458,-679,-417
-488,449,543
-626,468,-788
338,-750,-386
528,-832,-391
562,-778,733
-938,-730,414
543,643,-506
-524,371,-870
407,773,750
-104,29,83
378,-903,-323
-778,-728,485
426,699,580
-438,-605,-362
-469,-447,-387
509,732,623
647,635,-688
-868,-804,481
614,-800,639
595,780,-596

--- scanner 4 ---
727,592,562
-293,-554,779
441,611,-461
-714,465,-776
-743,427,-804
-660,-479,-426
832,-632,460
927,-485,-438
408,393,-506
466,436,-512
110,16,151
-258,-428,682
-393,719,612
-211,-452,876
808,-476,-593
-575,615,604
-485,667,467
-680,325,-822
-627,-443,-432
872,-547,-609
833,512,582
807,604,487
839,-516,451
891,-625,532
-652,-548,-490
30,-46,-14
</code></pre><p>Because all coordinates are relative, in this example, all &quot;absolute&quot; positions will be expressed relative to scanner <code>0</code> (using the orientation of scanner <code>0</code> and as if scanner <code>0</code> is at coordinates <code>0,0,0</code>).</p><p>Scanners <code>0</code> and <code>1</code> have overlapping detection cubes; the 12 beacons they both detect (relative to scanner <code>0</code>) are at the following coordinates:</p><pre><code>-618,-824,-621
-537,-823,-458
-447,-329,318
404,-588,-901
544,-627,-890
528,-643,409
-661,-816,-575
390,-675,-793
423,-701,434
-345,-311,381
459,-707,401
-485,-357,347
</code></pre><p>These same 12 beacons (in the same order) but from the perspective of scanner <code>1</code> are:</p><pre><code>686,422,578
605,423,415
515,917,-361
-336,658,858
-476,619,847
-460,603,-452
729,430,532
-322,571,750
-355,545,-477
413,935,-424
-391,539,-444
553,889,-390
</code></pre><p>Because of this, scanner <code>1</code> must be at <code>68,-1246,-43</code> (relative to scanner <code>0</code>).</p><p>Scanner <code>4</code> overlaps with scanner <code>1</code>; the 12 beacons they both detect (relative to scanner <code>0</code>) are:</p><pre><code>459,-707,401
-739,-1745,668
-485,-357,347
432,-2009,850
528,-643,409
423,-701,434
-345,-311,381
408,-1815,803
534,-1912,768
-687,-1600,576
-447,-329,318
-635,-1737,486
</code></pre><p>So, scanner <code>4</code> is at <code>-20,-1133,1061</code> (relative to scanner <code>0</code>).</p><p>Following this process, scanner <code>2</code> must be at <code>1105,-1205,1229</code> (relative to scanner <code>0</code>) and scanner <code>3</code> must be at <code>-92,-2380,-20</code> (relative to scanner <code>0</code>).</p><p>The full list of beacons (relative to scanner <code>0</code>) is:</p><pre><code>-892,524,684
-876,649,763
-838,591,734
-789,900,-551
-739,-1745,668
-706,-3180,-659
-697,-3072,-689
-689,845,-530
-687,-1600,576
-661,-816,-575
-654,-3158,-753
-635,-1737,486
-631,-672,1502
-624,-1620,1868
-620,-3212,371
-618,-824,-621
-612,-1695,1788
-601,-1648,-643
-584,868,-557
-537,-823,-458
-532,-1715,1894
-518,-1681,-600
-499,-1607,-770
-485,-357,347
-470,-3283,303
-456,-621,1527
-447,-329,318
-430,-3130,366
-413,-627,1469
-345,-311,381
-36,-1284,1171
-27,-1108,-65
7,-33,-71
12,-2351,-103
26,-1119,1091
346,-2985,342
366,-3059,397
377,-2827,367
390,-675,-793
396,-1931,-563
404,-588,-901
408,-1815,803
423,-701,434
432,-2009,850
443,580,662
455,729,728
456,-540,1869
459,-707,401
465,-695,1988
474,580,667
496,-1584,1900
497,-1838,-617
527,-524,1933
528,-643,409
534,-1912,768
544,-627,-890
553,345,-567
564,392,-477
568,-2007,-577
605,-1665,1952
612,-1593,1893
630,319,-379
686,-3108,-505
776,-3184,-501
846,-3110,-434
1135,-1161,1235
1243,-1093,1063
1660,-552,429
1693,-557,386
1735,-437,1738
1749,-1800,1813
1772,-405,1572
1776,-675,371
1779,-442,1789
1780,-1548,337
1786,-1538,337
1847,-1591,415
1889,-1729,1762
1994,-1805,1792
</code></pre><p>In total, there are <code>_79_</code> beacons.</p><p>Assemble the full map of beacons. <em>How many beacons are there?</em></p><hr><p>Proposed solution: so there are 24 different possible rotations for the 3 axes (x, y, z); I will brute force by setting scanner 0 as the standard rotation and consider it to be at (0, 0, 0) in this relative space; then, for every other scanner, iterate through every possible rotation, and iterate through every beacon for that scanner, and for each of those beacons rotate + translate to every other point found by scanner 0 until one of these other scanners ends up mapping to at least 12 beacons from scanner 0 &#x2013; this is when the rotation and offset from 0 can be confirmed for the scanner; then, once another scanner&apos;s rotation + relative position has been found, rotate + translate the beacon points so that it is uniform with scanner 0; then, you can use these properly rotated + translated scanners as a reference to find the orientation of other scanners</p><figure class="kg-card kg-code-card"><pre><code class="language-python">rotation_funcs = [lambdas for all 24 possible rotations]
scanners = {
	0: {
    	&quot;beacons&quot;: set(position tuples of the beacons)
        &quot;position&quot;: None # translated position tuple when found and (0,0,0) for scanner 0
    },
    1: {
    ...
    ...
    },
    ...
}

missing = set(of scanners that have not been located (position=None))
while len(missing) != 0:
	for scanners not missing:
    	for func in rotation_funcs:
        	rotated_set = set()
            for coord in other_scanner[&quot;beacons&quot;]:
            	rotated_set.add(func(*coord))
            
            for coord in reference_scanner[&quot;beacons&quot;]:
            	for other_coord in rotated_set:
                	delta = other_coord - coord
                    translated_set = set()
                    for rotated_coord in rotated_set:
                    	translated_set.add(rotated_coord - delta)
                    intersection = translated_set.intersection(reference_scanner[&quot;beacons&quot;])
                    if len(insersection) &gt;= 12:
                    	other_scanner[&quot;position&quot;] = delta
                        other_scanner[&quot;beacons&quot;] = translated_set
                        missing.remove(other_scanner)
                        # jmp to next for while loop

beacons = set()
for vals in scanners.values():
	beacons |= vals[&quot;beacons&quot;]
answer = len(beacons)</code></pre><figcaption>Some python semi-pseudo code</figcaption></figure><p>Time complexity: O(n<sup>2</sup>) where n is the number of beacons</p><p>Space complexity: O(n)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

rotation_funcs = [
    lambda x,y,z: ( x, y, z),
    lambda x,y,z: ( x, z,-y),
    lambda x,y,z: ( x,-y,-z),
    lambda x,y,z: ( x,-z, y),
    lambda x,y,z: (-x,-y, z),
    lambda x,y,z: (-x, z, y),
    lambda x,y,z: (-x, y,-z),
    lambda x,y,z: (-x,-z,-y),
    lambda x,y,z: ( y,-x, z),
    lambda x,y,z: ( y, z, x),
    lambda x,y,z: ( y, x,-z),
    lambda x,y,z: ( y,-z,-x),
    lambda x,y,z: (-y, x, z),
    lambda x,y,z: (-y, z,-x),
    lambda x,y,z: (-y,-x,-z),
    lambda x,y,z: (-y,-z, x),
    lambda x,y,z: ( z, y,-x),
    lambda x,y,z: ( z,-x,-y),
    lambda x,y,z: ( z,-y, x),
    lambda x,y,z: ( z, x, y),
    lambda x,y,z: (-z, y, x),
    lambda x,y,z: (-z, x,-y),
    lambda x,y,z: (-z,-y,-x),
    lambda x,y,z: (-z,-x, y)
]

scanners = {}
for line in file_input:
    if line == &quot;&quot;:
        continue
    if &quot;scanner&quot; in line:
        i = int(line.split()[2])
        scanners[i] = {
            &quot;beacons&quot;: set(),
            &quot;position&quot;: None
        }
        continue
    x, y, z = tuple(map(lambda x: int(x), line.split(&quot;,&quot;)))
    scanners[i][&quot;beacons&quot;].add((x,y,z))
scanners[0][&quot;position&quot;] = (0,0,0)

scanner = 0
rotated_set, translated_set = set(), set()
not_located = lambda elem: elem[1][&quot;position&quot;] is None
missing = {k for k,v in list(filter(not_located, scanners.items()))}
while len(missing) &gt; 0:
    found = False
    i = list(missing)[scanner]
    for j in set(scanners.keys()) - missing:
        for func in rotation_funcs:
            rotated_set.clear()
            for coord in scanners[i][&quot;beacons&quot;]:
                rotated_set.add(func(*coord))

            for init_coord in scanners[j][&quot;beacons&quot;]:
                for compare_coord in rotated_set:
                    delta = tuple(compare_coord[i] - init_coord[i] for i in range(3))
                    translated_set.clear()
                    for coord in rotated_set:
                        translated_set.add(tuple(coord[i] - delta[i] for i in range(3)))
                    intersection = translated_set.intersection(scanners[j][&quot;beacons&quot;])
                    if len(intersection) &gt;= 12:
                        delta = tuple(-delta[i] for i in range(3))
                        print(&quot;Scanner {} position discovered: {}&quot;.format(i, delta))
                        scanners[i][&quot;position&quot;] = delta
                        scanners[i][&quot;beacons&quot;] = set(translated_set)
                        missing.remove(i)
                        found = True
                    if found: break
                if found: break
            if found: break
        if found: break
    scanner = 0 if found else (scanner + 1) % len(missing)

beacons = set()
for vals in scanners.values():
    beacons |= vals[&quot;beacons&quot;]

print(&quot;Number of unique beacons: {}&quot;.format(len(beacons)))
</code></pre><figcaption>A lot of loops and really slow runtime</figcaption></figure><p>This took about 15 minutes to run for my input. It&apos;s pretty slow finding new positions and there are serious optimizations to be made if I have time.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; python3 solution19.py input19
Scanner 38 position discovered: (147, 155, -1150)
Scanner 15 position discovered: (-1111, -15, -1172)
Scanner 17 position discovered: (84, -12, -2408)
Scanner 4 position discovered: (152, 57, -3678)
Scanner 10 position discovered: (140, 1336, -2439)
Scanner 6 position discovered: (73, 2415, -2429)
Scanner 29 position discovered: (130, 2535, -3661)
Scanner 8 position discovered: (-1166, 2471, -3551)
Scanner 23 position discovered: (-7, 2465, -4812)
Scanner 28 position discovered: (61, 1318, -4788)
Scanner 3 position discovered: (-1230, 1218, -4909)
Scanner 21 position discovered: (1189, 1325, -4821)
Scanner 25 position discovered: (1176, 1237, -5981)
Scanner 30 position discovered: (1182, 2551, -6086)
Scanner 31 position discovered: (-1172, 1211, -2375)
Scanner 2 position discovered: (-2296, 1210, -2351)
Scanner 33 position discovered: (91, 1367, -3627)
Scanner 35 position discovered: (-1069, 1334, -1335)
Scanner 5 position discovered: (-1125, 2470, -1239)
Scanner 18 position discovered: (-2300, 2420, -1172)
Scanner 26 position discovered: (-1061, 3690, -1300)
Scanner 7 position discovered: (-1041, 3750, -2376)
Scanner 16 position discovered: (-1168, 4811, -2507)
Scanner 34 position discovered: (37, 3619, -1177)
Scanner 14 position discovered: (86, 4852, -1290)
Scanner 12 position discovered: (10, 4959, 1)
Scanner 19 position discovered: (51, 6081, -1202)
Scanner 24 position discovered: (139, 7342, -1144)
Scanner 27 position discovered: (-1201, 6159, -1249)
Scanner 32 position discovered: (4, 6024, -123)
Scanner 36 position discovered: (25, -1081, -3562)
Scanner 22 position discovered: (40, -2227, -3679)
Scanner 1 position discovered: (39, -3432, -3735)
Scanner 13 position discovered: (-1133, -2226, -3620)
Scanner 9 position discovered: (-2428, -2405, -3634)
Scanner 20 position discovered: (43, -2315, -2539)
Scanner 37 position discovered: (30, 2407, -5973)
Scanner 39 position discovered: (-1091, 4964, -52)
Scanner 11 position discovered: (-2393, 4828, -81)
Number of unique beacons: 483
</code></pre><figcaption>Slow but satisfying after each scanner position is found</figcaption></figure><h3 id="part-2">Part 2</h3><p>Sometimes, it&apos;s a good idea to appreciate just how big the ocean is. Using the <a href="https://en.wikipedia.org/wiki/Taxicab_geometry?ref=ghost.kevintarta.com">Manhattan distance</a>, how far apart do the scanners get?</p><p>In the above example, scanners <code>2</code> (<code>1105,-1205,1229</code>) and <code>3</code> (<code>-92,-2380,-20</code>) are the largest Manhattan distance apart. In total, they are <code>1197 + 1175 + 1249 = _3621_</code> units apart.</p><p>_What is the largest Manhattan distance between any two scanners?</p><hr><p>Proposed solution: nothing changes to find the scanner positions but now we need to calculate the Manhattan distance for every pair of two scanners</p><p>Time complexity: O(n<sup>2</sup> + m<sup>2</sup>) where n is the number of beacons and m is the number of scanners</p><p>Space complexity: O(n)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">max_dist = 0
beacons = set()
for vals1 in scanners.values():
    beacons |= vals1[&quot;beacons&quot;]
    for vals2 in scanners.values():
        if vals1 == vals2:
            continue
        pos1, pos2 = vals1[&quot;position&quot;], vals2[&quot;position&quot;]
        max_dist = max(max_dist, sum([abs(pos1[i]-pos2[i]) for i in range(3)]))

print(&quot;Number of unique beacons: {}&quot;.format(len(beacons)))
print(&quot;Maximum manhattan distance: {}&quot;.format(max_dist))</code></pre><figcaption>Update to final block to calculate the Manhattan distance</figcaption></figure><p>Again, brute force calculation for the positions of every distinct pair of scanners.</p><pre><code class="language-bash">&#x276F; python3 solution19.py input19
Scanner 38 position discovered: (147, 155, -1150)
Scanner 15 position discovered: (-1111, -15, -1172)
Scanner 17 position discovered: (84, -12, -2408)
Scanner 4 position discovered: (152, 57, -3678)
Scanner 10 position discovered: (140, 1336, -2439)
Scanner 6 position discovered: (73, 2415, -2429)
Scanner 29 position discovered: (130, 2535, -3661)
Scanner 8 position discovered: (-1166, 2471, -3551)
Scanner 23 position discovered: (-7, 2465, -4812)
Scanner 28 position discovered: (61, 1318, -4788)
Scanner 3 position discovered: (-1230, 1218, -4909)
Scanner 21 position discovered: (1189, 1325, -4821)
Scanner 25 position discovered: (1176, 1237, -5981)
Scanner 30 position discovered: (1182, 2551, -6086)
Scanner 31 position discovered: (-1172, 1211, -2375)
Scanner 2 position discovered: (-2296, 1210, -2351)
Scanner 33 position discovered: (91, 1367, -3627)
Scanner 35 position discovered: (-1069, 1334, -1335)
Scanner 5 position discovered: (-1125, 2470, -1239)
Scanner 18 position discovered: (-2300, 2420, -1172)
Scanner 26 position discovered: (-1061, 3690, -1300)
Scanner 7 position discovered: (-1041, 3750, -2376)
Scanner 16 position discovered: (-1168, 4811, -2507)
Scanner 34 position discovered: (37, 3619, -1177)
Scanner 14 position discovered: (86, 4852, -1290)
Scanner 12 position discovered: (10, 4959, 1)
Scanner 19 position discovered: (51, 6081, -1202)
Scanner 24 position discovered: (139, 7342, -1144)
Scanner 27 position discovered: (-1201, 6159, -1249)
Scanner 32 position discovered: (4, 6024, -123)
Scanner 36 position discovered: (25, -1081, -3562)
Scanner 22 position discovered: (40, -2227, -3679)
Scanner 1 position discovered: (39, -3432, -3735)
Scanner 13 position discovered: (-1133, -2226, -3620)
Scanner 9 position discovered: (-2428, -2405, -3634)
Scanner 20 position discovered: (43, -2315, -2539)
Scanner 37 position discovered: (30, 2407, -5973)
Scanner 39 position discovered: (-1091, 4964, -52)
Scanner 11 position discovered: (-2393, 4828, -81)
Number of unique beacons: 483
Maximum manhattan distance: 14804
</code></pre>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 18 | Snailfish]]></title><description><![CDATA[Day 18 - Snailfish apparently have math homework. I created a custom binary tree with some special properties, and brute forced part 2 with deep copies 🐟 🎄 🐟]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-18/</link><guid isPermaLink="false">61cfec7c20bb83032e76dcbb</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Sun, 02 Jan 2022 01:35:42 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-2.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-3.png" class="kg-image" alt="[Advent of Code 2021] Day 18 | Snailfish" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2022/01/adventofcode-3.png 600w, https://ghost.kevintarta.com/content/images/2022/01/adventofcode-3.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-2.png" alt="[Advent of Code 2021] Day 18 | Snailfish"><p>You descend into the ocean trench and encounter some <a href="https://en.wikipedia.org/wiki/Snailfish?ref=ghost.kevintarta.com">snailfish</a>. They say they saw the sleigh keys! They&apos;ll even tell you which direction the keys went if you help one of the smaller snailfish with his <em>math homework</em>.</p><p>Snailfish numbers aren&apos;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&apos;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&apos;s left value is added to the first regular number to the left of the exploding pair (if any), and the pair&apos;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>[[[[_[9,8]_,1],2],3],4]</code> becomes <code>[[[[_0_,_9_],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,_[3,2]_]]]]</code> becomes <code>[7,[6,[5,[_7_,_0_]]]]</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,_[3,2]_]]],1]</code> becomes <code>[[6,[5,[_7_,_0_]]],_3_]</code>.</li><li><code>[[3,[2,[1,_[7,3]_]]],[6,[5,[4,[3,2]]]]]</code> becomes <code>[[3,[2,[_8_,_0_]]],[_9_,[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,_[3,2]_]]]]</code> becomes <code>[[3,[2,[8,0]]],[9,[5,[_7_,_0_]]]]</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: [[[[[4,3],4],4],[7,[[8,4],9]]],[1,1]]
after explode:  [[[[0,7],4],[7,[[8,4],9]]],[1,1]]
after explode:  [[[[0,7],4],[15,[0,13]]],[1,1]]
after split:    [[[[0,7],4],[[7,8],[0,13]]],[1,1]]
after split:    [[[[0,7],4],[[7,8],[0,[6,7]]]],[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&apos;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&apos;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 = _29_</code>; the magnitude of <code>[1,9]</code> is <code>3*1 + 2*9 = _21_</code>. Magnitude calculations are recursive: the magnitude of <code>[[9,1],[1,9]]</code> is <code>3*29 + 2*21 = _129_</code>.</p><p>Here are a few more magnitude examples:</p><ul><li><code>[[1,2],[[3,4],5]]</code> becomes <code>_143_</code>.</li><li><code>[[[[0,7],4],[[7,8],[6,0]]],[8,1]]</code> becomes <code>_1384_</code>.</li><li><code>[[[[1,1],[2,2]],[3,3]],[4,4]]</code> becomes <code>_445_</code>.</li><li><code>[[[[3,0],[5,3]],[4,4]],[5,5]]</code> becomes <code>_791_</code>.</li><li><code>[[[[5,0],[7,4]],[5,5]],[6,6]]</code> becomes <code>_1137_</code>.</li><li><code>[[[[8,7],[7,7]],[[8,6],[7,7]]],[[[0,7],[6,6]],[8,7]]]</code> becomes <code>_3488_</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>_4140_</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><hr><p>Proposed solution: use a binary tree while holding true specific invariants: each node either has no value (this represents a set of square brackets) and both left &amp; right are non-null OR it has a non-null value and both left &amp; right are null &#x2014; this means that only leaf nodes have values and all other nodes should have both a left and a right</p><p>Time complexity: O(n<sup>2</sup>)</p><p>Space complexity: O(n)</p><p>Since the initial snailfish lines seem to already be fully reduced, each individual addition of the numbers has a limited number of reduction actions needed.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
from collections import deque
from math import floor, ceil
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

class SnailfishNode:
    def __init__(self, val=None, left=None, right=None, parent=None):
        &quot;&quot;&quot;
        Invariants:
        1. Each node has either a data value or has left and right, never both
        2. A pair node (no value) should have both left and right != None
        3. A value node (value != None) should always have a parent (always in pair)
        &quot;&quot;&quot;
        self.val = val
        self.left = left
        self.right = right
        self.parent = parent

    def depth(self):
        node, depth = self, 1
        while node.parent:
            node = node.parent
            depth += 1
        return depth

    def find_left(self):
        node = self.parent
        if self == node.left:
            while node.parent and node == node.parent.left:
                node = node.parent
            if not node.parent:
                return None
            node = node.parent

        node = node.left
        while node.val is None:
            node = node.right
        return node

    def find_right(self):
        node = self.parent
        if self == node.right:
            while node.parent and node == node.parent.right:
                node = node.parent
            if not node.parent:
                return None
            node = node.parent

        node = node.right
        while node.val is None:
            node = node.left
        return node

    def explode(self):
        &quot;&quot;&quot;
        Preconditions:
        1. Node is a pair node
        2. Node points to two value nodes
        3. Occurs if only if depth &gt; 4
        &quot;&quot;&quot;
        left = self.find_left()
        right = self.find_right()
        if left:
            left.val += self.left.val
        if right:
            right.val += self.right.val
        self.left = None
        self.right = None
        self.val = 0

    def split(self):
        &quot;&quot;&quot;
        Preconditions:
        1. Node is a value node
        2. Occurs only if value is &gt;= 10
        &quot;&quot;&quot;
        left_val = floor(self.val / 2)
        right_val = ceil(self.val / 2)
        left_node = SnailfishNode(val=left_val, parent=self)
        right_node = SnailfishNode(val=right_val, parent=self)
        self.val, self.left, self.right = None, left_node, right_node

    def reduce(self):
        &quot;&quot;&quot;
        Fully reduces tree by exploding heavily nested pairs and splitting large nums
        &quot;&quot;&quot;
        stack = deque()
        while True:
            exploded, splitted = False, False
            stack.clear()
            stack.append(self)
            while len(stack) != 0:
                node = stack.pop()
                if node.val is not None:
                    continue
                stack.append(node.right)
                stack.append(node.left)
                if node.left.val is not None and node.right.val is not None \
                        and node.depth() &gt; 4:
                    node.explode()
                    exploded = True
                    break
            if exploded:
                continue
            
            stack.clear()
            stack.append(self)
            while len(stack) != 0:
                node = stack.pop()
                if node.val is None:
                    stack.append(node.right)
                    stack.append(node.left)
                    continue
                if node.val &gt;= 10:
                    node.split()
                    splitted = True
                    break
            if not splitted:
                break

    def magnitude(self):
        &quot;&quot;&quot;
        Calculate the magnitude of the entire tree
        &quot;&quot;&quot;
        if self.val is not None:
            return self.val
        return 3 * self.left.magnitude() + 2 * self.right.magnitude()


trees = deque()
for line in file_input[::-1]:
    if line == &quot;&quot;:
        continue
    line = line[1:-1]
    root = curr = SnailfishNode()
    for char in line:
        if char == &quot;[&quot;:
            node = SnailfishNode(parent=curr)
            if not curr.left:
                curr.left = node
            else:
                curr.right = node
            curr = node
        elif char.isnumeric():
            node = SnailfishNode(val=int(char), parent=curr)
            if not curr.left:
                curr.left = node
            else:
                curr.right = node
        elif char == &quot;]&quot;:
            curr = curr.parent
    trees.append(root)

while len(trees) &gt; 1:
    tree1 = trees.pop()
    tree2 = trees.pop()
    new_node = SnailfishNode(left=tree1, right=tree2)
    tree1.parent = new_node
    tree2.parent = new_node
    new_node.reduce()
    trees.append(new_node)

print(&quot;Final Magnitude: {}&quot;.format(trees[0].magnitude()))
</code></pre><figcaption>The binary tree is imperative</figcaption></figure><p>Breaking this down, the constructor takes a value, left, right, and a parent all of which are null by default. Keeping track of the parent in this case makes the operations that we have to do easier.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">class SnailfishNode:
    def __init__(self, val=None, left=None, right=None, parent=None):
        &quot;&quot;&quot;
        Invariants:
        1. Each node has either a data value or has left and right, never both
        2. A pair node (no value) should have both left and right != None
        3. A value node (value != None) should always have a parent (always in pair)
        &quot;&quot;&quot;
        self.val = val
        self.left = left
        self.right = right
        self.parent = parent</code></pre><figcaption>I love OOP</figcaption></figure><p>Skipping forward, we need to create our trees for each line in the input.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">trees = deque()
for line in file_input[::-1]:
    if line == &quot;&quot;:
        continue
    line = line[1:-1]
    root = curr = SnailfishNode()
    for char in line:
        if char == &quot;[&quot;:
            node = SnailfishNode(parent=curr)
            if not curr.left:
                curr.left = node
            else:
                curr.right = node
            curr = node
        elif char.isnumeric():
            node = SnailfishNode(val=int(char), parent=curr)
            if not curr.left:
                curr.left = node
            else:
                curr.right = node
        elif char == &quot;]&quot;:
            curr = curr.parent
    trees.append(root)</code></pre><figcaption>Input lines mapped to a stack of binary trees</figcaption></figure><p>I start with the last line of the input and work backwards to populate the stack. I could have done this by treating the deque as a FIFO queue instead but the important thing is that we need to &quot;add&quot; these snailfish numbers in the same order provided in the input.</p><p>I ignore the first and last characters (should always be start and end brackets) and initialize the first node. This represents the first pair and will always have a left and right. Maintaining a <code>curr</code> node, we loop through the character in the input to populate the tree. If we encounter a <code>[</code> then we create a new empty node with <code>parent=curr</code>. This will either be <code>curr</code>&apos;s left node, or right node if the left node is already non-null. <code>curr</code> is then set to the new node to continue building the tree.</p><p>For any numeric value, we can assume it is a single digit since the input numbers are fully reduced. Create a new node with that value and again <code>parent=curr</code>. Set as left, or right if left is already defined. Hitting a <code>]</code> means that we are done processing a pair and can set <code>curr</code> to <code>curr.parent</code> to continue building. This is repeated until the snailfish tree is fully built for every line.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    def depth(self):
        node, depth = self, 1
        while node.parent:
            node = node.parent
            depth += 1
        return depth</code></pre><figcaption>Tree depth is O(n) worst case</figcaption></figure><p>Tree depth can be easily calculated with the <code>parent</code> field since you can traverse up the tree until hitting the root node. This functionality will be important for the reduction step.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    def find_left(self):
        node = self.parent
        if self == node.left:
            while node.parent and node == node.parent.left:
                node = node.parent
            if not node.parent:
                return None
            node = node.parent

        node = node.left
        while node.val is None:
            node = node.right
        return node

    def find_right(self):
        node = self.parent
        if self == node.right:
            while node.parent and node == node.parent.right:
                node = node.parent
            if not node.parent:
                return None
            node = node.parent

        node = node.right
        while node.val is None:
            node = node.left
        return node</code></pre><figcaption>Finding leaf nodes directly left and right in the snailfish number representation: O(n)</figcaption></figure><p>Finding the left and right nodes respectively will be important will be important for &quot;exploding&quot; in the reduction steps. We need to find the leaf nodes that are directly left or right of the current node. These work the same way but in opposite directions. For example, when finding the left nearest leaf node, move up the tree at least once until you hit a node where you can move left (without going back down the same branch). Once you find this, move left once and then move right until you hit a leaf node. Because of the properties of this specific binary tree, this will always be the nearest leaf node to the left. Same thing can be accomplished for the right by just flipping the directions.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    def explode(self):
        &quot;&quot;&quot;
        Preconditions:
        1. Node is a pair node
        2. Node points to two value nodes
        3. Occurs if only if depth &gt; 4
        &quot;&quot;&quot;
        left = self.find_left()
        right = self.find_right()
        if left:
            left.val += self.left.val
        if right:
            right.val += self.right.val
        self.left = None
        self.right = None
        self.val = 0</code></pre><figcaption>Exploding reduction step: O(n)</figcaption></figure><p>The exploding reduction step that we just discussed. This will be called for the node directly parenting two leaf nodes. This node&apos;s left node&apos;s value will be added to the nearest leaf node to the left node and same thing in reverse for the right. This parent node then becomes a new leaf node with a value of zero and left &amp; right set to null.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    def split(self):
        &quot;&quot;&quot;
        Preconditions:
        1. Node is a value node
        2. Occurs only if value is &gt;= 10
        &quot;&quot;&quot;
        left_val = floor(self.val / 2)
        right_val = ceil(self.val / 2)
        left_node = SnailfishNode(val=left_val, parent=self)
        right_node = SnailfishNode(val=right_val, parent=self)
        self.val, self.left, self.right = None, left_node, right_node</code></pre><figcaption>Split reduction step: O(1)</figcaption></figure><p>The splitting reduction step is called from a leaf node with a value &gt;= 10. Halving the value and taking the floor will go into a new left node of the current, and same thing (but the ceiling after halving) will go into a new right node. The current node&apos;s value becomes null.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    def reduce(self):
        &quot;&quot;&quot;
        Fully reduces tree by exploding heavily nested pairs and splitting large nums
        &quot;&quot;&quot;
        stack = deque()
        while True:
            exploded, splitted = False, False
            stack.clear()
            stack.append(self)
            while len(stack) != 0:
                node = stack.pop()
                if node.val is not None:
                    continue
                stack.append(node.right)
                stack.append(node.left)
                if node.left.val is not None and node.right.val is not None \
                        and node.depth() &gt; 4:
                    node.explode()
                    exploded = True
                    break
            if exploded:
                continue
            
            stack.clear()
            stack.append(self)
            while len(stack) != 0:
                node = stack.pop()
                if node.val is None:
                    stack.append(node.right)
                    stack.append(node.left)
                    continue
                if node.val &gt;= 10:
                    node.split()
                    splitted = True
                    break
            if not splitted:
                break</code></pre><figcaption>The whole reduction process is a little complicated: O(n)</figcaption></figure><p>The reduction step repeats until no reduction steps need to be performed. It prioritizes explosions first and then looks for splitting after it has ruled out the former. If an explosion occurs, it restarts the process. If splitting occurs it also restarts the process by first looking for any resulting explosions. For explosions, the non-leaf node parenting two leaf nodes is used for calling the <code>explode</code> function while the <code>split</code> function is called for the leaf node.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    def magnitude(self):
        &quot;&quot;&quot;
        Calculate the magnitude of the entire tree
        &quot;&quot;&quot;
        if self.val is not None:
            return self.val
        return 3 * self.left.magnitude() + 2 * self.right.magnitude()</code></pre><figcaption>Recursive magnitude calculation for final calculation: O(n)</figcaption></figure><p>The magniatude calculation is simple recursion, all left values are bubbled up and multiplied by 3 while right values are multiplied by 2.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">while len(trees) &gt; 1:
    tree1 = trees.pop()
    tree2 = trees.pop()
    new_node = SnailfishNode(left=tree1, right=tree2)
    tree1.parent = new_node
    tree2.parent = new_node
    new_node.reduce()
    trees.append(new_node)

print(&quot;Final Magnitude: {}&quot;.format(trees[0].magnitude()))</code></pre><figcaption>Adding all numbers together and reducing after each addition: O(n<sup>2</sup>)</figcaption></figure><p>The final step is to take the stack/queue of trees that we generated and adding each of them together, in order, (by creating a new root node and setting the left node as the first on the stack and the right as the second on the stack) and then reducing after each of these steps. The new root node is placed back on the stack until the stack contains only one node &#x2013; the fully added and reduced snailfish number. Calculate the magnitude of the final number.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; python3 solution18.py input18
Final Magnitude: 3763
</code></pre><figcaption>Crazy amount of work for such a small number</figcaption></figure><h3 id="part-2">Part 2</h3><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?ref=ghost.kevintarta.com">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>_3993_</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><hr><p>Proposed solution: all the functionality of the tree stays the same but a new last section to add every number to itself; deepcopy&apos;s need to be made, otherwise the original tree will be changed and cannot be used to add to all other numbers</p><p>Time complexity: O(n<sup>3</sup>)</p><p>Space complexity: O(n)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">max_magnitude = 0
for _tree1 in trees:
    for _tree2 in trees:
        if _tree1 == _tree2:
            continue
        tree1 = deepcopy(_tree1)
        tree2 = deepcopy(_tree2)
        new_node = SnailfishNode(left=tree1, right=tree2)
        tree1.parent = new_node
        tree2.parent = new_node
        new_node.reduce()
        max_magnitude = max(max_magnitude, new_node.magnitude())

print(&quot;Maximum Magnitude: {}&quot;.format(max_magnitude))
</code></pre><figcaption>Deep copy is helpful but slow</figcaption></figure><p>This is a brute force technique. I commented out the loop to add all snailfish numbers together and wrote this. It&apos;s O(n<sup>3</sup>) but it&apos;s more than fast enough.</p><pre><code class="language-bash">&#x276F; time python3 solution18.py input18
Maximum Magnitude: 4664
python3 solution18.py input18  3.50s user 0.01s system 99% cpu 3.509 total</code></pre>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 17 | Trick Shot]]></title><description><![CDATA[Day 17 - Basically a trajectory problem that you might see in physics/mechanics class. Brute force works well enough but I suspect there is a constant-time solution for this one 📈]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-17/</link><guid isPermaLink="false">61cfdb3b20bb83032e76dc38</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Sun, 02 Jan 2022 01:34:11 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2022/01/adventofcode.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode-1.png" class="kg-image" alt="[Advent of Code 2021] Day 17 | Trick Shot" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2022/01/adventofcode-1.png 600w, https://ghost.kevintarta.com/content/images/2022/01/adventofcode-1.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2022/01/adventofcode.png" alt="[Advent of Code 2021] Day 17 | Trick Shot"><p>You finally decode the Elves&apos; message. <code>HI</code>, the message says. You continue searching for the sleigh keys.</p><p>Ahead of you is what appears to be a large <a href="https://en.wikipedia.org/wiki/Oceanic_trench?ref=ghost.kevintarta.com">ocean trench</a>. Could the keys have fallen into it? You&apos;d better send a probe to investigate.</p><p>The probe launcher on your submarine can fire the probe with any <a href="https://en.wikipedia.org/wiki/Integer?ref=ghost.kevintarta.com">integer</a> velocity in the <code>x</code> (forward) and <code>y</code> (upward, or downward if negative) directions. For example, an initial <code>x,y</code> velocity like <code>0,10</code> would fire the probe straight up, while an initial velocity like <code>10,-1</code> would fire the probe forward at a slight downward angle.</p><p>The probe&apos;s <code>x,y</code> position starts at <code>0,0</code>. Then, it will follow some trajectory by moving in <em>steps</em>. On each step, these changes occur in the following order:</p><ul><li>The probe&apos;s <code>x</code> position increases by its <code>x</code> velocity.</li><li>The probe&apos;s <code>y</code> position increases by its <code>y</code> velocity.</li><li>Due to drag, the probe&apos;s <code>x</code> velocity changes by <code>1</code> toward the value <code>0</code>; that is, it decreases by <code>1</code> if it is greater than <code>0</code>, increases by <code>1</code> if it is less than <code>0</code>, or does not change if it is already <code>0</code>.</li><li>Due to gravity, the probe&apos;s <code>y</code> velocity decreases by <code>1</code>.</li></ul><p>For the probe to successfully make it into the trench, the probe must be on some trajectory that causes it to be within a <em>target area</em> after any step. The submarine computer has already calculated this target area (your puzzle input). For example:</p><pre><code>target area: x=20..30, y=-10..-5
</code></pre><p>This target area means that you need to find initial <code>x,y</code> velocity values such that after any step, the probe&apos;s <code>x</code> position is at least <code>20</code> and at most <code>30</code>, <em>and</em> the probe&apos;s <code>y</code> position is at least <code>-10</code> and at most <code>-5</code>.</p><p>Given this target area, one initial velocity that causes the probe to be within the target area after any step is <code>7,2</code>:</p><pre><code>.............#....#............
.......#..............#........
...............................
S........................#.....
...............................
...............................
...........................#...
...............................
....................TTTTTTTTTTT
....................TTTTTTTTTTT
....................TTTTTTTT#TT
....................TTTTTTTTTTT
....................TTTTTTTTTTT
....................TTTTTTTTTTT
</code></pre><p>In this diagram, <code>S</code> is the probe&apos;s initial position, <code>0,0</code>. The <code>x</code> coordinate increases to the right, and the <code>y</code> coordinate increases upward. In the bottom right, positions that are within the target area are shown as <code>T</code>. After each step (until the target area is reached), the position of the probe is marked with <code>#</code>. (The bottom-right <code>#</code> is both a position the probe reaches and a position in the target area.)</p><p>Another initial velocity that causes the probe to be within the target area after any step is <code>6,3</code>:</p><pre><code>...............#..#............
...........#........#..........
...............................
......#..............#.........
...............................
...............................
S....................#.........
...............................
...............................
...............................
.....................#.........
....................TTTTTTTTTTT
....................TTTTTTTTTTT
....................TTTTTTTTTTT
....................TTTTTTTTTTT
....................T#TTTTTTTTT
....................TTTTTTTTTTT
</code></pre><p>Another one is <code>9,0</code>:</p><pre><code>S........#.....................
.................#.............
...............................
........................#......
...............................
....................TTTTTTTTTTT
....................TTTTTTTTTT#
....................TTTTTTTTTTT
....................TTTTTTTTTTT
....................TTTTTTTTTTT
....................TTTTTTTTTTT
</code></pre><p>One initial velocity that <em>doesn&apos;t</em> cause the probe to be within the target area after any step is <code>17,-4</code>:</p><pre><code>S..............................................................
...............................................................
...............................................................
...............................................................
.................#.............................................
....................TTTTTTTTTTT................................
....................TTTTTTTTTTT................................
....................TTTTTTTTTTT................................
....................TTTTTTTTTTT................................
....................TTTTTTTTTTT..#.............................
....................TTTTTTTTTTT................................
...............................................................
...............................................................
...............................................................
...............................................................
................................................#..............
...............................................................
...............................................................
...............................................................
...............................................................
...............................................................
...............................................................
..............................................................#
</code></pre><p>The probe appears to pass through the target area, but is never within it after any step. Instead, it continues down and to the right - only the first few steps are shown.</p><p>If you&apos;re going to fire a highly scientific probe out of a super cool probe launcher, you might as well do it with <em>style</em>. How high can you make the probe go while still reaching the target area?</p><p>In the above example, using an initial velocity of <code>6,9</code> is the best you can do, causing the probe to reach a maximum <code>y</code> position of <code>_45_</code>. (Any higher initial <code>y</code> velocity causes the probe to overshoot the target area entirely.)</p><p>Find the initial velocity that causes the probe to reach the highest <code>y</code> position and still eventually be within the target area after any step. <em>What is the highest <code>y</code> position it reaches on this trajectory?</em></p><hr><p>Proposed solution: pick various start velocities up until a point where the initial velocity will cause the probe to never land in the target area; brute force the max height with these initial velocities</p><p>Time complexity: O(n) where n is the difference between the minimum and maximum y coordinate for the target area</p><p>Space complexity: O(1)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)
temp = file_input[0].split(&quot;target area: &quot;)[1].split(&quot;, &quot;)
min_x, max_x = list(map(lambda x: int(x), temp[0].split(&quot;=&quot;)[1].split(&quot;..&quot;)))
min_y, max_y = list(map(lambda x: int(x), temp[1].split(&quot;=&quot;)[1].split(&quot;..&quot;)))

range_y = max_y - min_y

result = 0
for dy_init in range(range_y, range_y*100):
    dy, y, ymax = dy_init, 0, 0
    while y &gt;= min_y:
        if y &lt;= max_y:
            result = max(result, ymax)
            break
        y += dy
        dy -= 1
        ymax = max(ymax, y)

print(&quot;Max y: {}&quot;.format(result))
</code></pre><figcaption>Brute forcing yeeesh</figcaption></figure><p>I picked a magnitude of 100 times the initial <code>range_y</code>. I figured this should be good enough since the target in my input was in the negative y quadrant and anything above that starting velocity should never hit the target area &#x2013; it&apos;s velocity would be too large by the time it got to near the same y coordinate on the way down.</p><pre><code class="language-bash">&#x276F; python3 solution17.py input17
Max y: 5050</code></pre><h3 id="part-2">Part 2</h3><p>Maybe a fancy trick shot isn&apos;t the best idea; after all, you only have one probe, so you had better not miss.</p><p>To get the best idea of what your options are for launching the probe, you need to find <em>every initial velocity</em> that causes the probe to eventually be within the target area after any step.</p><p>In the above example, there are <code>_112_</code> different initial velocity values that meet these criteria:</p><pre><code>23,-10  25,-9   27,-5   29,-6   22,-6   21,-7   9,0     27,-7   24,-5
25,-7   26,-6   25,-5   6,8     11,-2   20,-5   29,-10  6,3     28,-7
8,0     30,-6   29,-8   20,-10  6,7     6,4     6,1     14,-4   21,-6
26,-10  7,-1    7,7     8,-1    21,-9   6,2     20,-7   30,-10  14,-3
20,-8   13,-2   7,3     28,-8   29,-9   15,-3   22,-5   26,-8   25,-8
25,-6   15,-4   9,-2    15,-2   12,-2   28,-9   12,-3   24,-6   23,-7
25,-10  7,8     11,-3   26,-7   7,1     23,-9   6,0     22,-10  27,-6
8,1     22,-8   13,-4   7,6     28,-6   11,-4   12,-4   26,-9   7,4
24,-10  23,-8   30,-8   7,0     9,-1    10,-1   26,-5   22,-9   6,5
7,5     23,-6   28,-10  10,-2   11,-1   20,-9   14,-2   29,-7   13,-3
23,-5   24,-8   27,-9   30,-7   28,-5   21,-10  7,9     6,6     21,-5
27,-10  7,2     30,-9   21,-8   22,-7   24,-9   20,-6   6,9     29,-5
8,-2    27,-8   30,-5   24,-7
</code></pre><p><em>How many distinct initial velocity values cause the probe to be within the target area after any step?</em></p><hr><p>Proposed solution: iterate over all pairs of initial velocities (considering both x and y initial) and keep track of all that make it into the target area</p><p>Time complexity: O(n)</p><p>Space complexity: O(n)</p><p>I think we could represent time complexity in terms of the actual parabolic function but I&apos;m not going to do that. Instead, just consider n the total length of the set of initial velocities that will be tested.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)
temp = file_input[0].split(&quot;target area: &quot;)[1].split(&quot;, &quot;)
min_x, max_x = list(map(lambda x: int(x), temp[0].split(&quot;=&quot;)[1].split(&quot;..&quot;)))
min_y, max_y = list(map(lambda x: int(x), temp[1].split(&quot;=&quot;)[1].split(&quot;..&quot;)))

range_x = max_x - min_x
range_y = max_y - min_y

result = 0
uniq_velocities = set()
for dx_init in range(1, max_x+1):
    for dy_init in range(min_y, range_y*10):
        dx, x = dx_init, 0
        dy, y, ymax = dy_init, 0, 0
        while x &lt;= max_x and y &gt;= min_y:
            if x &gt;= min_x and y &lt;= max_y:
                uniq_velocities.add((dx_init, dy_init))
                result = max(result, ymax)
                break
            y += dy
            dy -= 1
            ymax = max(ymax, y)
            x += dx
            dx = max(0, dx - 1)

print(&quot;Max y: {}&quot;.format(result))
print(&quot;Unique velocities: {}&quot;.format(len(uniq_velocities)))
</code></pre><figcaption>Test a bunch of initial velocities</figcaption></figure><p>In this case, I selected initial <code>dx</code> in the range <code>1</code> to <code>max_x</code> and an initial <code>dy</code> from <code>min_y</code> to <code>range_y * 10</code> for every <code>dx_init</code> value. For x, this is because anything above <code>max_x</code> would already be past the target after step 1. For y, this is because anything lower than <code>min_y</code> will be past the target by step 1 and in part 1 I discovered that anything past <code>range_y * 10</code> will not reach the target, even just isolated to the y-axis.</p><pre><code class="language-bash">&#x276F; python3 solution17.py input17
Max y: 5050
Unique velocities: 2223
</code></pre>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 16 | Packet Decoder]]></title><description><![CDATA[Day 16 - Complicated packet parsing (no actual networking) for arithmetic operations. Using a stack to keep track of nested operations 🧝]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-16/</link><guid isPermaLink="false">61cc06e0f81db6034cb7ce53</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Sun, 02 Jan 2022 01:32:53 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-33.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-34.png" class="kg-image" alt="[Advent of Code 2021] Day 16 | Packet Decoder" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2021/12/adventofcode-34.png 600w, https://ghost.kevintarta.com/content/images/2021/12/adventofcode-34.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-33.png" alt="[Advent of Code 2021] Day 16 | Packet Decoder"><p>As you leave the cave and reach open waters, you receive a transmission from the Elves back on the ship.</p><p>The transmission was sent using the Buoyancy Interchange Transmission System (BITS), a method of packing numeric expressions into a binary sequence. Your submarine&apos;s computer has saved the transmission in <a href="https://en.wikipedia.org/wiki/Hexadecimal?ref=ghost.kevintarta.com">hexadecimal</a> (your puzzle input).</p><p>The first step of decoding the message is to convert the hexadecimal representation into binary. Each character of hexadecimal corresponds to four bits of binary data:</p><pre><code>0 = 0000
1 = 0001
2 = 0010
3 = 0011
4 = 0100
5 = 0101
6 = 0110
7 = 0111
8 = 1000
9 = 1001
A = 1010
B = 1011
C = 1100
D = 1101
E = 1110
F = 1111
</code></pre><p>The BITS transmission contains a single <em>packet</em> at its outermost layer which itself contains many other packets. The hexadecimal representation of this packet might encode a few extra <code>0</code> bits at the end; these are not part of the transmission and should be ignored.</p><p>Every packet begins with a standard header: the first three bits encode the packet <em>version</em>, and the next three bits encode the packet <em>type ID</em>. These two values are numbers; all numbers encoded in any packet are represented as binary with the most significant bit first. For example, a version encoded as the binary sequence <code>100</code> represents the number <code>4</code>.</p><p>Packets with type ID <code>4</code> represent a <em>literal value</em>. Literal value packets encode a single binary number. To do this, the binary number is padded with leading zeroes until its length is a multiple of four bits, and then it is broken into groups of four bits. Each group is prefixed by a <code>1</code> bit except the last group, which is prefixed by a <code>0</code> bit. These groups of five bits immediately follow the packet header. For example, the hexadecimal string <code>D2FE28</code> becomes:</p><pre><code>110100101111111000101000
VVVTTTAAAAABBBBBCCCCC
</code></pre><p>Below each bit is a label indicating its purpose:</p><ul><li>The three bits labeled <code>V</code> (<code>110</code>) are the packet version, <code>6</code>.</li><li>The three bits labeled <code>T</code> (<code>100</code>) are the packet type ID, <code>4</code>, which means the packet is a literal value.</li><li>The five bits labeled <code>A</code> (<code>10111</code>) start with a <code>1</code> (not the last group, keep reading) and contain the first four bits of the number, <code>0111</code>.</li><li>The five bits labeled <code>B</code> (<code>11110</code>) start with a <code>1</code> (not the last group, keep reading) and contain four more bits of the number, <code>1110</code>.</li><li>The five bits labeled <code>C</code> (<code>00101</code>) start with a <code>0</code> (last group, end of packet) and contain the last four bits of the number, <code>0101</code>.</li><li>The three unlabeled <code>0</code> bits at the end are extra due to the hexadecimal representation and should be ignored.</li></ul><p>So, this packet represents a literal value with binary representation <code>011111100101</code>, which is <code>2021</code> in decimal.</p><p>Every other type of packet (any packet with a type ID other than <code>4</code>) represent an <em>operator</em> that performs some calculation on one or more sub-packets contained within. Right now, the specific operations aren&apos;t important; focus on parsing the hierarchy of sub-packets.</p><p>An operator packet contains one or more packets. To indicate which subsequent binary data represents its sub-packets, an operator packet can use one of two modes indicated by the bit immediately after the packet header; this is called the <em>length type ID</em>:</p><ul><li>If the length type ID is <code>0</code>, then the next <em>15</em> bits are a number that represents the <em>total length in bits</em> of the sub-packets contained by this packet.</li><li>If the length type ID is <code>1</code>, then the next <em>11</em> bits are a number that represents the <em>number of sub-packets immediately contained</em> by this packet.</li></ul><p>Finally, after the length type ID bit and the 15-bit or 11-bit field, the sub-packets appear.</p><p>For example, here is an operator packet (hexadecimal string <code>38006F45291200</code>) with length type ID <code>0</code> that contains two sub-packets:</p><pre><code>00111000000000000110111101000101001010010001001000000000
VVVTTTILLLLLLLLLLLLLLLAAAAAAAAAAABBBBBBBBBBBBBBBB
</code></pre><ul><li>The three bits labeled <code>V</code> (<code>001</code>) are the packet version, <code>1</code>.</li><li>The three bits labeled <code>T</code> (<code>110</code>) are the packet type ID, <code>6</code>, which means the packet is an operator.</li><li>The bit labeled <code>I</code> (<code>0</code>) is the length type ID, which indicates that the length is a 15-bit number representing the number of bits in the sub-packets.</li><li>The 15 bits labeled <code>L</code> (<code>000000000011011</code>) contain the length of the sub-packets in bits, <code>27</code>.</li><li>The 11 bits labeled <code>A</code> contain the first sub-packet, a literal value representing the number <code>10</code>.</li><li>The 16 bits labeled <code>B</code> contain the second sub-packet, a literal value representing the number <code>20</code>.</li></ul><p>After reading 11 and 16 bits of sub-packet data, the total length indicated in <code>L</code> (27) is reached, and so parsing of this packet stops.</p><p>As another example, here is an operator packet (hexadecimal string <code>EE00D40C823060</code>) with length type ID <code>1</code> that contains three sub-packets:</p><pre><code>11101110000000001101010000001100100000100011000001100000
VVVTTTILLLLLLLLLLLAAAAAAAAAAABBBBBBBBBBBCCCCCCCCCCC
</code></pre><ul><li>The three bits labeled <code>V</code> (<code>111</code>) are the packet version, <code>7</code>.</li><li>The three bits labeled <code>T</code> (<code>011</code>) are the packet type ID, <code>3</code>, which means the packet is an operator.</li><li>The bit labeled <code>I</code> (<code>1</code>) is the length type ID, which indicates that the length is a 11-bit number representing the number of sub-packets.</li><li>The 11 bits labeled <code>L</code> (<code>00000000011</code>) contain the number of sub-packets, <code>3</code>.</li><li>The 11 bits labeled <code>A</code> contain the first sub-packet, a literal value representing the number <code>1</code>.</li><li>The 11 bits labeled <code>B</code> contain the second sub-packet, a literal value representing the number <code>2</code>.</li><li>The 11 bits labeled <code>C</code> contain the third sub-packet, a literal value representing the number <code>3</code>.</li></ul><p>After reading 3 complete sub-packets, the number of sub-packets indicated in <code>L</code> (3) is reached, and so parsing of this packet stops.</p><p>For now, parse the hierarchy of the packets throughout the transmission and <em>add up all of the version numbers</em>.</p><p>Here are a few more examples of hexadecimal-encoded transmissions:</p><ul><li><code>8A004A801A8002F478</code> represents an operator packet (version 4) which contains an operator packet (version 1) which contains an operator packet (version 5) which contains a literal value (version 6); this packet has a version sum of <code>_16_</code>.</li><li><code>620080001611562C8802118E34</code> represents an operator packet (version 3) which contains two sub-packets; each sub-packet is an operator packet that contains two literal values. This packet has a version sum of <code>_12_</code>.</li><li><code>C0015000016115A2E0802F182340</code> has the same structure as the previous example, but the outermost packet uses a different length type ID. This packet has a version sum of <code>_23_</code>.</li><li><code>A0016C880162017C3686B18A3D4780</code> is an operator packet that contains an operator packet that contains an operator packet that contains five literal values; it has a version sum of <code>_31_</code>.</li></ul><p>Decode the structure of your hexadecimal-encoded BITS transmission; <em>what do you get if you add up the version numbers in all packets?</em></p><hr><p>Proposed solution: packets representing literals have a looped structure where the first bit in every 5 bits indicates whether it is the last block; operation packets can indicate either the number of sub-packets (immediately nested in the current packet) or the number of bytes of the sub-packets (all nested sub-packets); the idea is to keep a stack indicating this nesting of operator packets with the <code>length_type</code> and then the corresponding length</p><p>Time complexity: O(n)</p><p>Space complexity: O(n)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
from collections import deque
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

decode_table = {
    &quot;0&quot;: &quot;0000&quot;,
    &quot;1&quot;: &quot;0001&quot;,
    &quot;2&quot;: &quot;0010&quot;,
    &quot;3&quot;: &quot;0011&quot;,
    &quot;4&quot;: &quot;0100&quot;,
    &quot;5&quot;: &quot;0101&quot;,
    &quot;6&quot;: &quot;0110&quot;,
    &quot;7&quot;: &quot;0111&quot;,
    &quot;8&quot;: &quot;1000&quot;,
    &quot;9&quot;: &quot;1001&quot;,
    &quot;A&quot;: &quot;1010&quot;,
    &quot;B&quot;: &quot;1011&quot;,
    &quot;C&quot;: &quot;1100&quot;,
    &quot;D&quot;: &quot;1101&quot;,
    &quot;E&quot;: &quot;1110&quot;,
    &quot;F&quot;: &quot;1111&quot;
}

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)
hex_string = file_input[0]
#print(hex_string)

bin_string = &quot;&quot;
for char in hex_string:
    bin_string += decode_table[char]
#print(bin_string)</code></pre><figcaption>Basic setup and creating the binary string</figcaption></figure><p>Another way to create the binary string is by using the built-in <code>bin</code> function after converting the hex string into an integer. Something like <code>bin(int(&quot;deadbeef&quot;, 16))[2:]</code>.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">i = 0
stack = deque()
version_total = 0
unbin = lambda x: int(x, 2)
while i &lt; len(bin_string):
    if len(stack) != 0:
        if stack[-1][0] == 1:
            elem = stack.pop()
            if elem[1] &gt; 1:
                stack.append((elem[0], elem[1]-1))
        else:
            if i == stack[-1][1]:
                stack.pop()
    if len(bin_string) - i &lt; 11 and unbin(bin_string[i:len(bin_string)]) == 0:
        break
    version = unbin(bin_string[i:i+3])
    version_total += version
    type_id = unbin(bin_string[i+3:i+6])
    if type_id == 4:
        i += 6
        literal = &quot;&quot;
        while unbin(bin_string[i]) == 1:
            literal += bin_string[i+1:i+5]
            i += 5
        literal += bin_string[i+1:i+5]
        i += 5
        continue
    length_type = unbin(bin_string[i+6])
    if length_type:
        length = 11
        num_subpackets = unbin(bin_string[i+7:i+7+length])
        stack.append((length_type, num_subpackets))
    else:
        length = 15
        length_subpackets = unbin(bin_string[i+7:i+7+length])
        stack.append((length_type, i+7+length+length_subpackets))
    i += 7 + length

print(&quot;Version Total: {}&quot;.format(version_total))</code></pre><figcaption>This is just parsing logic</figcaption></figure><p>I constructed this just to count the version numbers and sum them together. Each step is just parsing until the binary string is completely enumerated while keeping a stack due to the nested nature of the packets.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    if len(stack) != 0:
        if stack[-1][0] == 1:
            elem = stack.pop()
            if elem[1] &gt; 1:
                stack.append((elem[0], elem[1]-1))
        else:
            if i == stack[-1][1]:
                stack.pop()</code></pre><figcaption>Updating top of the stack</figcaption></figure><p>Each loop through the outer while loop goes through a single packet (not including respective sub-packets). This first block updates the top element of the stack. These elements in the stack are tuples with the first element being the length type (0 is for number of packets and 1 is for number of bits) and the second it the actual length. For number of packets, this length is decremented and placed back on the stack until the number of sub-packets reaches zero &#x2013; then it is just popped off. For number of bits, this is actually pushed to the stack with the length + the starting position of the sub-packets which is effectively the end of the packet.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">if len(bin_string) - i &lt; 11 and unbin(bin_string[i:len(bin_string)]) == 0:
        break</code></pre><figcaption>Check for extra 0s padded at the end</figcaption></figure><p>If the iterator is not at the end of the bit string and the rest of the bin string is all 0s and smaller than the minimum packet length, just break out since this is just padding.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    version = unbin(bin_string[i:i+3])
    version_total += version
    type_id = unbin(bin_string[i+3:i+6])
    if type_id == 4:
        i += 6
        literal = &quot;&quot;
        while unbin(bin_string[i]) == 1:
            literal += bin_string[i+1:i+5]
            i += 5
        literal += bin_string[i+1:i+5]
        i += 5
        continue</code></pre><figcaption>Version, type, and processing literals</figcaption></figure><p>This first section parses the version, packet type, and if the packet type is a literal (has a value of 4) then, loop through blocks of 5 bits until hitting the last block.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    length_type = unbin(bin_string[i+6])
    if length_type:
        length = 11
        num_subpackets = unbin(bin_string[i+7:i+7+length])
        stack.append((length_type, num_subpackets))
    else:
        length = 15
        length_subpackets = unbin(bin_string[i+7:i+7+length])
        stack.append((length_type, i+7+length+length_subpackets))
    i += 7 + length</code></pre><figcaption>Operation packets and adding sub-packet information to the stack</figcaption></figure><p>The last block is for operation packets. Based on length-type, push the corresponding length value to the stack. Again, for bit length we calculate the end of the packet before pushing.</p><pre><code class="language-bash">&#x276F; python3 solution16.py input16
Version Total: 873
</code></pre><h3 id="part-2">Part 2</h3><p>Now that you have the structure of your transmission decoded, you can calculate the value of the expression it represents.</p><p>Literal values (type ID <code>4</code>) represent a single number as described above. The remaining type IDs are more interesting:</p><ul><li>Packets with type ID <code>0</code> are <em>sum</em> packets - their value is the sum of the values of their sub-packets. If they only have a single sub-packet, their value is the value of the sub-packet.</li><li>Packets with type ID <code>1</code> are <em>product</em> packets - their value is the result of multiplying together the values of their sub-packets. If they only have a single sub-packet, their value is the value of the sub-packet.</li><li>Packets with type ID <code>2</code> are <em>minimum</em> packets - their value is the minimum of the values of their sub-packets.</li><li>Packets with type ID <code>3</code> are <em>maximum</em> packets - their value is the maximum of the values of their sub-packets.</li><li>Packets with type ID <code>5</code> are <em>greater than</em> packets - their value is <em>1</em> if the value of the first sub-packet is greater than the value of the second sub-packet; otherwise, their value is <em>0</em>. These packets always have exactly two sub-packets.</li><li>Packets with type ID <code>6</code> are <em>less than</em> packets - their value is <em>1</em> if the value of the first sub-packet is less than the value of the second sub-packet; otherwise, their value is <em>0</em>. These packets always have exactly two sub-packets.</li><li>Packets with type ID <code>7</code> are <em>equal to</em> packets - their value is <em>1</em> if the value of the first sub-packet is equal to the value of the second sub-packet; otherwise, their value is <em>0</em>. These packets always have exactly two sub-packets.</li></ul><p>Using these rules, you can now work out the value of the outermost packet in your BITS transmission.</p><p>For example:</p><ul><li><code>C200B40A82</code> finds the sum of <code>1</code> and <code>2</code>, resulting in the value <code>_3_</code>.</li><li><code>04005AC33890</code> finds the product of <code>6</code> and <code>9</code>, resulting in the value <code>_54_</code>.</li><li><code>880086C3E88112</code> finds the minimum of <code>7</code>, <code>8</code>, and <code>9</code>, resulting in the value <code>_7_</code>.</li><li><code>CE00C43D881120</code> finds the maximum of <code>7</code>, <code>8</code>, and <code>9</code>, resulting in the value <code>_9_</code>.</li><li><code>D8005AC2A8F0</code> produces <code>1</code>, because <code>5</code> is less than <code>15</code>.</li><li><code>F600BC2D8F</code> produces <code>0</code>, because <code>5</code> is not greater than <code>15</code>.</li><li><code>9C005AC2F8F0</code> produces <code>0</code>, because <code>5</code> is not equal to <code>15</code>.</li><li><code>9C0141080250320F1802104A08</code> produces <code>1</code>, because <code>1</code> + <code>3</code> = <code>2</code> * <code>2</code>.</li></ul><p><em>What do you get if you evaluate the expression represented by your hexadecimal-encoded BITS transmission?</em></p><hr><p>Proposed solution: same idea but now having to do actual calculations based on the literals and operation packets; we have to store more information for each operation packet on the stack (like the cumulative result and the number of bits already iterated over)</p><p>Time complexity: O(n)</p><p>Space complexity: O(n)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
from collections import deque
from math import prod
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

decode_table = {
    &quot;0&quot;: &quot;0000&quot;,
    &quot;1&quot;: &quot;0001&quot;,
    &quot;2&quot;: &quot;0010&quot;,
    &quot;3&quot;: &quot;0011&quot;,
    &quot;4&quot;: &quot;0100&quot;,
    &quot;5&quot;: &quot;0101&quot;,
    &quot;6&quot;: &quot;0110&quot;,
    &quot;7&quot;: &quot;0111&quot;,
    &quot;8&quot;: &quot;1000&quot;,
    &quot;9&quot;: &quot;1001&quot;,
    &quot;A&quot;: &quot;1010&quot;,
    &quot;B&quot;: &quot;1011&quot;,
    &quot;C&quot;: &quot;1100&quot;,
    &quot;D&quot;: &quot;1101&quot;,
    &quot;E&quot;: &quot;1110&quot;,
    &quot;F&quot;: &quot;1111&quot;
}

operator_map = {
    0: lambda x: sum(x),
    1: lambda x: prod(x),
    2: lambda x: min(x),
    3: lambda x: max(x),
    5: lambda x: int(x[0] &gt; x[1]),
    6: lambda x: int(x[0] &lt; x[1]),
    7: lambda x: int(x[0] == x[1])
}

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)
hex_string = file_input[0]
#print(hex_string)

bin_string = &quot;&quot;
for char in hex_string:
    bin_string += decode_table[char]
#print(bin_string)

stack = deque()
unbin = lambda x: int(x, 2)
result, num_packets, version_total, i = 0, 0, 0, 0
while i &lt; len(bin_string):
    if len(bin_string) - i &lt; 11 and unbin(bin_string[i:len(bin_string)]) == 0:
        # break out of loop when we hit trailing zeroes less than minimum packet length
        break
    start_i = i
    version = unbin(bin_string[i:i+3]) # first three bits are version
    version_total += version
    type_id = unbin(bin_string[i+3:i+6]) # next three bits are packet type id
    if type_id != 4:
        # process operator packets
        length_type = unbin(bin_string[i+6])
        length = 11 if length_type else 15
        length_num = unbin(bin_string[i+7:i+7+length])
        i += 7 + length # move i to start of first sub-packet
        if len(stack) != 0:
            # track new bits and sub-packets in parent packet
            stack[-1][&quot;num_bits&quot;] += i - start_i
            stack[-1][&quot;num_packets&quot;] += 1
        stack.append({
            &quot;result&quot;: [],
            &quot;length_type&quot;: length_type,
            &quot;length_num&quot;: length_num,
            &quot;type_id&quot;: type_id,
            &quot;num_bits&quot;: 0,
            &quot;num_packets&quot;: 0
        })
        continue
    # process literals and stack reduction
    i += 6 # move i to the start of the literal
    literal = &quot;&quot;
    while unbin(bin_string[i]) == 1:
        # loop until we hit the last block
        literal += bin_string[i+1:i+5]
        i += 5
    literal += bin_string[i+1:i+5]
    literal = unbin(literal)
    i += 5
    if len(stack) == 0:
        # if packet is just a literal, we&apos;re done
        result = literal
        break
    stack[-1][&quot;result&quot;].append(literal) # track literal in top of operator stack

    if len(stack) != 0:
        # track new bits and sub-packets in parent operator packet
        stack[-1][&quot;num_bits&quot;] += i - start_i
        stack[-1][&quot;num_packets&quot;] += 1
    while len(stack) != 0:
        top = stack[-1]
        if not (top[&quot;length_type&quot;] and top[&quot;length_num&quot;] == top[&quot;num_packets&quot;]) \
                and not (not top[&quot;length_type&quot;] and top[&quot;length_num&quot;] == top[&quot;num_bits&quot;]):
            # if we are not finished with the top operator packet, continue
            break
        top = stack.pop()
        operation_result = operator_map[top[&quot;type_id&quot;]](top[&quot;result&quot;])
        if len(stack) == 0:
            # when done with our top-level operator packet, we are done
            result = operation_result
        else:
            # bubble up new bits to parent operator packet
            # note: no need to bubble up num_packets since we care about immediate children
            stack[-1][&quot;num_bits&quot;] += top[&quot;num_bits&quot;]
            # take operation result from current packet and append to parent operator
            stack[-1][&quot;result&quot;].append(operation_result)

print(&quot;Version Total: {}&quot;.format(version_total))
print(&quot;Packet Result: {}&quot;.format(result))
</code></pre><figcaption>I&apos;m really glad I added comments for this one</figcaption></figure><p>I defined some lambdas in a map to easily call operations based on which operator packet is being dealt with.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">operator_map = {
    0: lambda x: sum(x),
    1: lambda x: prod(x),
    2: lambda x: min(x),
    3: lambda x: max(x),
    5: lambda x: int(x[0] &gt; x[1]),
    6: lambda x: int(x[0] &lt; x[1]),
    7: lambda x: int(x[0] == x[1])
}</code></pre><figcaption>A map of operator packet types to corresponding lambdas</figcaption></figure><p>We maintain the same check for extra padding 0s to break out early instead of interpreting the 0s as another packet.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    if len(bin_string) - i &lt; 11 and unbin(bin_string[i:len(bin_string)]) == 0:
        # break out of loop when we hit trailing zeroes less than minimum packet length
        break</code></pre><figcaption>Padded 0s be gone</figcaption></figure><p>I switched it around for part 2 and processed operator packets earlier in the loop. It is straight forward with the new stack elements (dictionaries to store some additional information).</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    start_i = i
    version = unbin(bin_string[i:i+3]) # first three bits are version
    version_total += version
    type_id = unbin(bin_string[i+3:i+6]) # next three bits are packet type id
    if type_id != 4:
        # process operator packets
        length_type = unbin(bin_string[i+6])
        length = 11 if length_type else 15
        length_num = unbin(bin_string[i+7:i+7+length])
        i += 7 + length # move i to start of first sub-packet
        if len(stack) != 0:
            # track new bits and sub-packets in parent packet
            stack[-1][&quot;num_bits&quot;] += i - start_i
            stack[-1][&quot;num_packets&quot;] += 1
        stack.append({
            &quot;result&quot;: [],
            &quot;length_type&quot;: length_type,
            &quot;length_num&quot;: length_num,
            &quot;type_id&quot;: type_id,
            &quot;num_bits&quot;: 0,
            &quot;num_packets&quot;: 0
        })
        continue</code></pre><figcaption>Operator packets just got easier</figcaption></figure><p>For the new elements, <code>result</code> is a list of literals from resulting sub-packets. These will be passed to the actual operation lambda once the end of the packet has been reached (these will bubble up until all packets have been processed). <code>length_type</code>, <code>length_num</code>, and <code>type_id</code> are the respective values from the operation packet. <code>num_bits</code> and <code>num_packets</code> track the number of bits and packets coming from sub-packets of the element added to the stack. Even the operation packets will update these values for the nested opeartion above it &#x2013; only if the stack is not empty meaning that it is not the first packet.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    # process literals and stack reduction
    i += 6 # move i to the start of the literal
    literal = &quot;&quot;
    while unbin(bin_string[i]) == 1:
        # loop until we hit the last block
        literal += bin_string[i+1:i+5]
        i += 5
    literal += bin_string[i+1:i+5]
    literal = unbin(literal)
    i += 5
    if len(stack) == 0:
        # if packet is just a literal, we&apos;re done
        result = literal
        break
    stack[-1][&quot;result&quot;].append(literal) # track literal in top of operator stack

    if len(stack) != 0:
        # track new bits and sub-packets in parent operator packet
        stack[-1][&quot;num_bits&quot;] += i - start_i
        stack[-1][&quot;num_packets&quot;] += 1</code></pre><figcaption>Just literals, literally cool... literally</figcaption></figure><p>The last blocks of the while loop are skipping for operator packets, meaning that these blocks are only run while processing literals. This calculates the value of the current literal and sets it as the result if the stack is empty &#x2013; meaning that it is the only packet in the input. Otheriwse, it appends the literal value to the parent operation&apos;s <code>result</code> list. Also, track the number of bits and packets in the parent operation&apos;s element on the stack.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    while len(stack) != 0:
        top = stack[-1]
        if not (top[&quot;length_type&quot;] and top[&quot;length_num&quot;] == top[&quot;num_packets&quot;]) \
                and not (not top[&quot;length_type&quot;] and top[&quot;length_num&quot;] == top[&quot;num_bits&quot;]):
            # if we are not finished with the top operator packet, continue
            break
        top = stack.pop()
        operation_result = operator_map[top[&quot;type_id&quot;]](top[&quot;result&quot;])
        if len(stack) == 0:
            # when done with our top-level operator packet, we are done
            result = operation_result
        else:
            # bubble up new bits to parent operator packet
            # note: no need to bubble up num_packets since we care about immediate children
            stack[-1][&quot;num_bits&quot;] += top[&quot;num_bits&quot;]
            # take operation result from current packet and append to parent operator
            stack[-1][&quot;result&quot;].append(operation_result)</code></pre><figcaption>Bubble up</figcaption></figure><p>The last section bubbles up the result from the stack. If the operation at the top of the stack has all of its sub-packets processed, then it runs the corresponding operation lambda on the <code>result</code> list and the <code>operational_result</code> is added to the parent operator&apos;s <code>result</code> list &#x2013; also the <code>num_bits</code>. The <code>num_packets</code> does not need to be bubbled up since only the immediate (one layer nested) sub-packets matter for that length type. This process is repeated until hitting an operation that is not done being processed on the stack or the stack is empty meaning that the entire packet has been processed.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; python3 solution16.py input16
Version Total: 873
Packet Result: 402817863665
</code></pre><figcaption>Stack based operations</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 15 | Chiton]]></title><description><![CDATA[Day 15 - Dijkstra's algorithm!! Might be the easiest solution to implement that is not >O(V^2) 🗺️]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-15/</link><guid isPermaLink="false">61cc01e1f81db6034cb7cdea</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Fri, 31 Dec 2021 02:59:56 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-31.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-32.png" class="kg-image" alt="[Advent of Code 2021] Day 15 | Chiton" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2021/12/adventofcode-32.png 600w, https://ghost.kevintarta.com/content/images/2021/12/adventofcode-32.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-31.png" alt="[Advent of Code 2021] Day 15 | Chiton"><p>You&apos;ve almost reached the exit of the cave, but the walls are getting closer together. Your submarine can barely still fit, though; the main problem is that the walls of the cave are covered in <a href="https://en.wikipedia.org/wiki/Chiton?ref=ghost.kevintarta.com">chitons</a>, and it would be best not to bump any of them.</p><p>The cavern is large, but has a very low ceiling, restricting your motion to two dimensions. The shape of the cavern resembles a square; a quick scan of chiton density produces a map of <em>risk level</em> throughout the cave (your puzzle input). For example:</p><pre><code>1163751742
1381373672
2136511328
3694931569
7463417111
1319128137
1359912421
3125421639
1293138521
2311944581
</code></pre><p>You start in the top left position, your destination is the bottom right position, and you cannot move diagonally. The number at each position is its <em>risk level</em>; to determine the total risk of an entire path, add up the risk levels of each position you <em>enter</em> (that is, don&apos;t count the risk level of your starting position unless you enter it; leaving it adds no risk to your total).</p><p>Your goal is to find a path with the <em>lowest total risk</em>. In this example, a path with the lowest total risk is highlighted here:</p><pre><code>1163751742
1381373672
2136511328
3694931569
7463417111
1319128137
1359912421
3125421639
1293138521
2311944581
</code></pre><p>The total risk of this path is <code>_40_</code> (the starting position is never entered, so its risk is not counted).</p><p><em>What is the lowest total risk of any path from the top left to the bottom right?</em></p><hr><p>Proposed solution: using dynamic programming, we can keep track of the most optimal risk score of each point on the map &#x2013; if we can calculate a more optimal path for a given point (eliminating many non-optimal paths), we update the minimum risk score</p><p>Time complexity: O(V<sup>2</sup>) where V is the number of &quot;vertices&quot; (or points) in the map</p><p>Space complexity: O(V)</p><p>This is technically Dijkstra&apos;s algorithm where the graph is the map and each vertex is a number on the map which connects to its 2-4 adjacent neighbors.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
from collections import deque
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

class Cell:
    def __init__(self, x, y, weight=None):
        self.x = x
        self.y = y
        self.weight = weight

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

    def __hash__(self):
        return hash((self.x, self.y))

graph = {}
for y, line in enumerate(file_input):
    for x, weight in enumerate(line):
        graph[x,y] = Cell(x, y, int(weight))

dx = [-1,0,1,0]
dy = [0,1,0,-1]

x_length = len(file_input[0])
y_length = len(file_input)

st = set()
st.add(Cell(0, 0, 0))
dist = {(0,0): 0}
while len(st) != 0:
    cell = st.pop()
    for i in range(4):
        x = cell.x + dx[i]
        y = cell.y + dy[i]

        if x &lt; 0 or y &lt; 0 or y &gt;= y_length or x &gt;= x_length:
            continue

        if (x,y) not in dist or dist[x,y] &gt; dist[cell.x,cell.y] + graph[x,y].weight:
            check = Cell(x,y)
            if check in st:
                st.remove(check)

            dist[x,y] = dist[cell.x,cell.y] + graph[x,y].weight
            st.add(Cell(x, y, dist[x,y]))

print(&quot;Shortest Path Length: {}&quot;.format(dist[x_length-1,y_length-1]))</code></pre><figcaption>I missed OOP so I mixed it up a little</figcaption></figure><p>Not too much to explain here. Dijkstra&apos;s algorithm with some specific checks because of the 2d map nature of the problem.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; python3 solution15.py input15
Shortest Path Length: 363</code></pre><figcaption>Thank you Dijkstra!</figcaption></figure><h3 id="part-2">Part 2</h3><p>Now that you know how to find low-risk paths in the cave, you can try to find your way out.</p><p>The entire cave is actually <em>five times larger in both dimensions</em> than you thought; the area you originally scanned is just one tile in a 5x5 tile area that forms the full map. Your original map tile repeats to the right and downward; each time the tile repeats to the right or downward, all of its risk levels <em>are 1 higher</em> than the tile immediately up or left of it. However, risk levels above <code>9</code> wrap back around to <code>1</code>. So, if your original map had some position with a risk level of <code>8</code>, then that same position on each of the 25 total tiles would be as follows:</p><pre><code>8 9 1 2 3
9 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
</code></pre><p>Each single digit above corresponds to the example position with a value of <code>8</code> on the top-left tile. Because the full map is actually five times larger in both dimensions, that position appears a total of 25 times, once in each duplicated tile, with the values shown above.</p><p>Here is the full five-times-as-large version of the first example above, with the original map in the top left corner highlighted:</p><pre><code>11637517422274862853338597396444961841755517295286
13813736722492484783351359589446246169155735727126
21365113283247622439435873354154698446526571955763
36949315694715142671582625378269373648937148475914
74634171118574528222968563933317967414442817852555
13191281372421239248353234135946434524615754563572
13599124212461123532357223464346833457545794456865
31254216394236532741534764385264587549637569865174
12931385212314249632342535174345364628545647573965
23119445813422155692453326671356443778246755488935
22748628533385973964449618417555172952866628316397
24924847833513595894462461691557357271266846838237
32476224394358733541546984465265719557637682166874
47151426715826253782693736489371484759148259586125
85745282229685639333179674144428178525553928963666
24212392483532341359464345246157545635726865674683
24611235323572234643468334575457944568656815567976
42365327415347643852645875496375698651748671976285
23142496323425351743453646285456475739656758684176
34221556924533266713564437782467554889357866599146
33859739644496184175551729528666283163977739427418
35135958944624616915573572712668468382377957949348
43587335415469844652657195576376821668748793277985
58262537826937364893714847591482595861259361697236
96856393331796741444281785255539289636664139174777
35323413594643452461575456357268656746837976785794
35722346434683345754579445686568155679767926678187
53476438526458754963756986517486719762859782187396
34253517434536462854564757396567586841767869795287
45332667135644377824675548893578665991468977611257
44961841755517295286662831639777394274188841538529
46246169155735727126684683823779579493488168151459
54698446526571955763768216687487932779859814388196
69373648937148475914825958612593616972361472718347
17967414442817852555392896366641391747775241285888
46434524615754563572686567468379767857948187896815
46833457545794456865681556797679266781878137789298
64587549637569865174867197628597821873961893298417
45364628545647573965675868417678697952878971816398
56443778246755488935786659914689776112579188722368
55172952866628316397773942741888415385299952649631
57357271266846838237795794934881681514599279262561
65719557637682166874879327798598143881961925499217
71484759148259586125936169723614727183472583829458
28178525553928963666413917477752412858886352396999
57545635726865674683797678579481878968159298917926
57944568656815567976792667818781377892989248891319
75698651748671976285978218739618932984172914319528
56475739656758684176786979528789718163989182927419
67554889357866599146897761125791887223681299833479
</code></pre><p>Equipped with the full map, you can now find a path from the top left corner to the bottom right corner with the lowest total risk:</p><pre><code>11637517422274862853338597396444961841755517295286
13813736722492484783351359589446246169155735727126
21365113283247622439435873354154698446526571955763
36949315694715142671582625378269373648937148475914
74634171118574528222968563933317967414442817852555
13191281372421239248353234135946434524615754563572
13599124212461123532357223464346833457545794456865
31254216394236532741534764385264587549637569865174
12931385212314249632342535174345364628545647573965
23119445813422155692453326671356443778246755488935
22748628533385973964449618417555172952866628316397
24924847833513595894462461691557357271266846838237
32476224394358733541546984465265719557637682166874
47151426715826253782693736489371484759148259586125
85745282229685639333179674144428178525553928963666
24212392483532341359464345246157545635726865674683
24611235323572234643468334575457944568656815567976
42365327415347643852645875496375698651748671976285
23142496323425351743453646285456475739656758684176
34221556924533266713564437782467554889357866599146
33859739644496184175551729528666283163977739427418
35135958944624616915573572712668468382377957949348
43587335415469844652657195576376821668748793277985
58262537826937364893714847591482595861259361697236
96856393331796741444281785255539289636664139174777
35323413594643452461575456357268656746837976785794
35722346434683345754579445686568155679767926678187
53476438526458754963756986517486719762859782187396
34253517434536462854564757396567586841767869795287
45332667135644377824675548893578665991468977611257
44961841755517295286662831639777394274188841538529
46246169155735727126684683823779579493488168151459
54698446526571955763768216687487932779859814388196
69373648937148475914825958612593616972361472718347
17967414442817852555392896366641391747775241285888
46434524615754563572686567468379767857948187896815
46833457545794456865681556797679266781878137789298
64587549637569865174867197628597821873961893298417
45364628545647573965675868417678697952878971816398
56443778246755488935786659914689776112579188722368
55172952866628316397773942741888415385299952649631
57357271266846838237795794934881681514599279262561
65719557637682166874879327798598143881961925499217
71484759148259586125936169723614727183472583829458
28178525553928963666413917477752412858886352396999
57545635726865674683797678579481878968159298917926
57944568656815567976792667818781377892989248891319
75698651748671976285978218739618932984172914319528
56475739656758684176786979528789718163989182927419
67554889357866599146897761125791887223681299833479
</code></pre><p>The total risk of this path is <code>_315_</code> (the starting position is still never entered, so its risk is not counted).</p><p>Using the full map, <em>what is the lowest total risk of any path from the top left to the bottom right?</em></p><hr><p>Proposed solution: exactly the same but update to the in-memory graph generation</p><p>Time complexity: O(V<sup>2</sup>)</p><p>Space complexity: O(V)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">graph = {}
x_length = len(file_input[0])
y_length = len(file_input)
for y, line in enumerate(file_input):
    for x, weight in enumerate(line):
        for ry in range(5):
            for rx in range(5):
                graph_x = rx * x_length + x
                graph_y = ry * y_length + y
                new_weight = ((int(weight) + (ry + rx) - 1) % 9) + 1
                graph[graph_x,graph_y] = Cell(graph_x, graph_y, new_weight)</code></pre><figcaption>New generation for the graph to account for the map wrapping</figcaption></figure><pre><code class="language-bash">&#x276F; python3 solution15.py input15
Shortest Path Length: 2835
</code></pre>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 14 | Extended Polymerization]]></title><description><![CDATA[Day 14 - Exponential growth of a polymer does not scale well, and it turns out that the same type of solution for lanternfish (day 6) works here 🧪]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-14/</link><guid isPermaLink="false">61ca866af81db6034cb7ccf8</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Fri, 31 Dec 2021 02:52:10 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-29.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-30.png" class="kg-image" alt="[Advent of Code 2021] Day 14 | Extended Polymerization" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2021/12/adventofcode-30.png 600w, https://ghost.kevintarta.com/content/images/2021/12/adventofcode-30.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-29.png" alt="[Advent of Code 2021] Day 14 | Extended Polymerization"><p>The incredible pressures at this depth are starting to put a strain on your submarine. The submarine has <a href="https://en.wikipedia.org/wiki/Polymerization?ref=ghost.kevintarta.com">polymerization</a> equipment that would produce suitable materials to reinforce the submarine, and the nearby volcanically-active caves should even have the necessary input elements in sufficient quantities.</p><p>The submarine manual contains instructions for finding the optimal polymer formula; specifically, it offers a <em>polymer template</em> and a list of <em>pair insertion</em> rules (your puzzle input). You just need to work out what polymer would result after repeating the pair insertion process a few times.</p><p>For example:</p><pre><code>NNCB

CH -&gt; B
HH -&gt; N
CB -&gt; H
NH -&gt; C
HB -&gt; C
HC -&gt; B
HN -&gt; C
NN -&gt; C
BH -&gt; H
NC -&gt; B
NB -&gt; B
BN -&gt; B
BB -&gt; N
BC -&gt; B
CC -&gt; N
CN -&gt; C
</code></pre><p>The first line is the <em>polymer template</em> - this is the starting point of the process.</p><p>The following section defines the <em>pair insertion</em> rules. A rule like <code>AB -&gt; C</code> means that when elements <code>A</code> and <code>B</code> are immediately adjacent, element <code>C</code> should be inserted between them. These insertions all happen simultaneously.</p><p>So, starting with the polymer template <code>NNCB</code>, the first step simultaneously considers all three pairs:</p><ul><li>The first pair (<code>NN</code>) matches the rule <code>NN -&gt; C</code>, so element <code>_C_</code> is inserted between the first <code>N</code> and the second <code>N</code>.</li><li>The second pair (<code>NC</code>) matches the rule <code>NC -&gt; B</code>, so element <code>_B_</code> is inserted between the <code>N</code> and the <code>C</code>.</li><li>The third pair (<code>CB</code>) matches the rule <code>CB -&gt; H</code>, so element <code>_H_</code> is inserted between the <code>C</code> and the <code>B</code>.</li></ul><p>Note that these pairs overlap: the second element of one pair is the first element of the next pair. Also, because all pairs are considered simultaneously, inserted elements are not considered to be part of a pair until the next step.</p><p>After the first step of this process, the polymer becomes <code>N_C_N_B_C_H_B</code>.</p><p>Here are the results of a few steps using the above rules:</p><pre><code>Template:     NNCB
After step 1: NCNBCHB
After step 2: NBCCNBBBCBHCB
After step 3: NBBBCNCCNBBNBNBBCHBHHBCHB
After step 4: NBBNBNBBCCNBCNCCNBBNBBNBBBNBBNBBCBHCBHHNHCBBCBHCB
</code></pre><p>This polymer grows quickly. After step 5, it has length 97; After step 10, it has length 3073. After step 10, <code>B</code> occurs 1749 times, <code>C</code> occurs 298 times, <code>H</code> occurs 161 times, and <code>N</code> occurs 865 times; taking the quantity of the most common element (<code>B</code>, 1749) and subtracting the quantity of the least common element (<code>H</code>, 161) produces <code>1749 - 161 = _1588_</code>.</p><p>Apply 10 steps of pair insertion to the polymer template and find the most and least common elements in the result. <em>What do you get if you take the quantity of the most common element and subtract the quantity of the least common element?</em></p><hr><p>Proposed solution: create an insertion map for the polymers from the input data, take the initial template and apply 10 steps of the process; generate a new string each round with the inserted values</p><p>Time complexity: O(2<sup>n</sup>) where n is the number of steps in the process</p><p>Space complexity: O(2<sup>n</sup>)</p><p>Each step of the process roughly doubles the length of the string. Both time and space complexity are exponential functions.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

insertion_map = {}
for line in file_input[2:]:
    if line == &quot;&quot;:
        continue
    template, insertion = line.split()[0], line.split()[-1]
    insertion_map[template] = insertion

start = file_input[0]
for i in range(10):
    result = &quot;&quot;
    for j in range(len(str(start)) - 1):
        template = start[j:j+2]
        if j == 0:
            result += template[0]
        result += insertion_map[template] + template[1]
    start = result

freq_count = {char:start.count(char) for char in set(start)}

least = min(freq_count.values())
most = max(freq_count.values())
print(&quot;Most - Least common = {}&quot;.format(most - least))</code></pre><figcaption>Exponential growth oh no</figcaption></figure><p>This works fine mainly because the number of steps is relatively small and 2<sup>10</sup> is only 1024. The first block is populating the insertion dictionary mapping the input chars to their respective output characters.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">insertion_map = {}
for line in file_input[2:]:
    if line == &quot;&quot;:
        continue
    template, insertion = line.split()[0], line.split()[-1]
    insertion_map[template] = insertion</code></pre><figcaption>Data structure setup</figcaption></figure><p>The next block iterates through the steps; during the first step the first character of the string is added to the final result. Each step including the first, the insertion character is appended followed by the second character in the template.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">start = file_input[0]
for i in range(10):
    result = &quot;&quot;
    for j in range(len(str(start)) - 1):
        template = start[j:j+2]
        if j == 0:
            result += template[0]
        result += insertion_map[template] + template[1]
    start = result

freq_count = {char:start.count(char) for char in set(start)}

least = min(freq_count.values())
most = max(freq_count.values())</code></pre><figcaption>This might get out of control...</figcaption></figure><p>Calculate the least and most frequent characters in the final string.</p><pre><code class="language-bash">&#x276F; python3 solution14.py input14
Most - Least common = 2937</code></pre><h3 id="part-2">Part 2</h3><p>The resulting polymer isn&apos;t nearly strong enough to reinforce the submarine. You&apos;ll need to run more steps of the pair insertion process; a total of <em>40 steps</em> should do it.</p><p>In the above example, the most common element is <code>B</code> (occurring <code>2192039569602</code> times) and the least common element is <code>H</code> (occurring <code>3849876073</code> times); subtracting these produces <code>_2188189693529_</code>.</p><p>Apply <em>40</em> steps of pair insertion to the polymer template and find the most and least common elements in the result. <em>What do you get if you take the quantity of the most common element and subtract the quantity of the least common element?</em></p><hr><p>Proposed solution: the previous solution will not work as we might encounter the heat death of the universe before the calculation is complete &#x2013; or just run out of memory; however, similar to what I did in day 6, we can keep track of the individual states and their frequencies instead of the entire string; each single two-letter state will map to two individual two-letter states as output for a single step</p><p>Time complexity: O(n)</p><p>Space complexity: O(1)</p><p>The number of unique characters that can appear in the polymer has some impact on the space/time but it is by definition not a scaling factor within this problem so we consider this constant.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

insertion_map = {}
for line in file_input[2:]:
    if line == &quot;&quot;:
        continue
    template, insertion = line.split()[0], line.split()[-1]
    insertion_map[template] = insertion

start = file_input[0]
templates = {}
for j in range(len(start)-1):
    template = start[j:j+2]
    templates[template] = templates.get(template, 0) + 1

freq_count = {char:start.count(char) for char in set(start)}
for i in range(40):
    for template, freq in dict(templates).items():
        templates[template] -= freq
        insertion = insertion_map[template]
        first, second = template[0] + insertion, insertion + template[1]
        templates[first] = templates.get(first, 0) + freq
        templates[second] = templates.get(second, 0) + freq
        freq_count[insertion] = freq_count.get(insertion, 0) + freq

least = min(freq_count.values())
most = max(freq_count.values())
print(&quot;Most - Least common = {}&quot;.format(most - least))
</code></pre><figcaption>From exponential to linear and constant space</figcaption></figure><p>Our new frequency count dictionary contains the mapping between any two adjacent characters (in the polymer) and their frequencies. Each step, these frequencies are negated in favor of their respective outputs. For example, if the string &quot;AB&quot; appeared 30 times in the current step for the polymer, &quot;AB&quot; maps to &quot;C&quot; for the insertion character, and no other strings produce &quot;AB&quot; this step, then our <code>freq_count</code> dictionary would contain the following:</p><pre><code>{
  ...
  &quot;AB&quot;: 0,
  &quot;AC&quot;: 30,
  &quot;CB&quot;: 30,
  ...
}</code></pre><p>This solution is very similar to the other exponential growth problem in <a href="https://ghost.kevintarta.com/aoc-2021-day-6/">Advent of Code 2021 Day 6 &#x2013; Lanternfish</a>. Instead of keeping track of all copies of the objects, the number of distinct states are limited so it&apos;s more efficient to track these and their respective frequencies. This only works because each state has a single path to the next state.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; python3 solution14.py input14
Most - Least common = 3390034818249
</code></pre><figcaption>It computes!</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 13 | Transparent Origami]]></title><description><![CDATA[Day 13 - Origami required calculating the mirror coordinates across the folds 🦢]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-13/</link><guid isPermaLink="false">61c9431df81db6034cb7cc55</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Mon, 27 Dec 2021 05:36:20 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-27.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-28.png" class="kg-image" alt="[Advent of Code 2021] Day 13 | Transparent Origami" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2021/12/adventofcode-28.png 600w, https://ghost.kevintarta.com/content/images/2021/12/adventofcode-28.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-27.png" alt="[Advent of Code 2021] Day 13 | Transparent Origami"><p>You reach another volcanically active part of the cave. It would be nice if you could do some kind of thermal imaging so you could tell ahead of time which caves are too hot to safely enter.</p><p>Fortunately, the submarine seems to be equipped with a thermal camera! When you activate it, you are greeted with:</p><pre><code>Congratulations on your purchase! To activate this infrared thermal imaging
camera system, please enter the code found on page 1 of the manual.
</code></pre><p>Apparently, the Elves have never used this feature. To your surprise, you manage to find the manual; as you go to open it, page 1 falls out. It&apos;s a large sheet of <a href="https://en.wikipedia.org/wiki/Transparency_(projection)?ref=ghost.kevintarta.com">transparent paper</a>! The transparent paper is marked with random dots and includes instructions on how to fold it up (your puzzle input). For example:</p><pre><code>6,10
0,14
9,10
0,3
10,4
4,11
6,0
6,12
4,1
0,13
10,12
3,4
3,0
8,4
1,10
2,14
8,10
9,0

fold along y=7
fold along x=5
</code></pre><p>The first section is a list of dots on the transparent paper. <code>0,0</code> represents the top-left coordinate. The first value, <code>x</code>, increases to the right. The second value, <code>y</code>, increases downward. So, the coordinate <code>3,0</code> is to the right of <code>0,0</code>, and the coordinate <code>0,7</code> is below <code>0,0</code>. The coordinates in this example form the following pattern, where <code>#</code> is a dot on the paper and <code>.</code> is an empty, unmarked position:</p><pre><code>...#..#..#.
....#......
...........
#..........
...#....#.#
...........
...........
...........
...........
...........
.#....#.##.
....#......
......#...#
#..........
#.#........
</code></pre><p>Then, there is a list of <em>fold instructions</em>. Each instruction indicates a line on the transparent paper and wants you to fold the paper <em>up</em> (for horizontal <code>y=...</code> lines) or <em>left</em> (for vertical <code>x=...</code> lines). In this example, the first fold instruction is <code>fold along y=7</code>, which designates the line formed by all of the positions where <code>y</code> is <code>7</code> (marked here with <code>-</code>):</p><pre><code>...#..#..#.
....#......
...........
#..........
...#....#.#
...........
...........
-----------
...........
...........
.#....#.##.
....#......
......#...#
#..........
#.#........
</code></pre><p>Because this is a horizontal line, fold the bottom half <em>up</em>. Some of the dots might end up overlapping after the fold is complete, but dots will never appear exactly on a fold line. The result of doing this fold looks like this:</p><pre><code>#.##..#..#.
#...#......
......#...#
#...#......
.#.#..#.###
...........
...........
</code></pre><p>Now, only <code>17</code> dots are visible.</p><p>Notice, for example, the two dots in the bottom left corner before the transparent paper is folded; after the fold is complete, those dots appear in the top left corner (at <code>0,0</code> and <code>0,1</code>). Because the paper is transparent, the dot just below them in the result (at <code>0,3</code>) remains visible, as it can be seen through the transparent paper.</p><p>Also notice that some dots can end up <em>overlapping</em>; in this case, the dots merge together and become a single dot.</p><p>The second fold instruction is <code>fold along x=5</code>, which indicates this line:</p><pre><code>#.##.|#..#.
#...#|.....
.....|#...#
#...#|.....
.#.#.|#.###
.....|.....
.....|.....
</code></pre><p>Because this is a vertical line, fold <em>left</em>:</p><pre><code>#####
#...#
#...#
#...#
#####
.....
.....
</code></pre><p>The instructions made a square!</p><p>The transparent paper is pretty big, so for now, focus on just completing the first fold. After the first fold in the example above, <code>_17_</code> dots are visible - dots that end up overlapping after the fold is completed count as a single dot.</p><p><em>How many dots are visible after completing just the first fold instruction on your transparent paper?</em></p><hr><p>Proposed solution: represent dots as x, y tuples in a set and add + remove dot after translation to other side of the fold &#x2013; e.g. for a fold on the y-axis, points with y greater than y fold will have a new position of (x, 2*(y-fold) - y) where (x, y) was the initial position</p><p>Time complexity: O(n) where n is the number of dots</p><p>Space complexity: O(1)</p><p>Assuming that the number of dots are distributed evenly on average across the two sides of the fold, we get O(n) time complexity since half of the dots will be removed from the set and their new coordinates will be added to the set. Addition/removal set operations are O(1) operations on average.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

i = 0
line = file_input[i]
dots = set()
while line != &quot;&quot;:
    x, y = [int(x) for x in line.split(&quot;,&quot;)]
    dots.add((x,y))
    i += 1
    line = file_input[i]

plane, num = file_input[i+1].split()[-1].split(&quot;=&quot;)
num = int(num)

for x, y in set(dots):
    if plane == &quot;y&quot;:
        if y &gt; num:
            dots.add((x,2*num-y))
            dots.remove((x,y))
    else:
        if x &gt; num:
            dots.add((2*num-x,y))
            dots.remove((x,y))

print(&quot;Number Dots: {}&quot;.format(len(dots)))
</code></pre><figcaption>O(1) extra space after we put the actual coordinates into memory</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; python3 solution13.py input13
Number Dots: 802
</code></pre><figcaption>After one fold</figcaption></figure><h3 id="part-2">Part 2</h3><p>Finish folding the transparent paper according to the instructions. The manual says the code is always <em>eight capital letters</em>.</p><p><em>What code do you use to activate the infrared thermal imaging camera system?</em></p><hr><p>Proposed solution: same solution but iterating through all folds this time &#x2013; also some extra code to print the dots</p><p>Time complexity: O(f log(n)) where f is the number of folds</p><p>Space complexity: O(1)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

i = 0
line = file_input[i]
dots = set()
while line != &quot;&quot;:
    x, y = [int(x) for x in line.split(&quot;,&quot;)]
    dots.add((x,y))
    i += 1
    line = file_input[i]

for i in range(i+1, len(file_input)):
    if file_input[i] == &quot;&quot;:
        continue
    plane, num = file_input[i].split()[-1].split(&quot;=&quot;)
    num = int(num)
    for x, y in set(dots):
        if plane == &quot;y&quot;:
            if y &gt; num:
                dots.add((x,2*num-y))
                dots.remove((x,y))
        else:
            if x &gt; num:
                dots.add((2*num-x,y))
                dots.remove((x,y))

print(&quot;Number Dots: {}&quot;.format(len(dots)))

for y in range(10):
    result = &quot;&quot;
    for x in range(50):
        if (x, y) in dots:
            result += &quot;#&quot;
        else:
            result += &quot;.&quot;
    print(result)
</code></pre><figcaption>Just some generalizing</figcaption></figure><p>Solution is now O(f log(n)). We can expect that some fraction of the dots are overlapping on every fold, reducing the total number of dots. Every fold will split the search space roughly in half making this fraction more likely to be larger after every fold.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; python3 solution13.py input13
Number Dots: 103
###..#..#.#..#.####.####..##..#..#.###............
#..#.#.#..#..#.#.......#.#..#.#..#.#..#...........
#..#.##...####.###....#..#....#..#.###............
###..#.#..#..#.#.....#...#.##.#..#.#..#...........
#.#..#.#..#..#.#....#....#..#.#..#.#..#...........
#..#.#..#.#..#.#....####..###..##..###............
..................................................
..................................................
..................................................
..................................................</code></pre><figcaption>RKHFZGUB</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[[Advent of Code 2021] Day 12 | Passage Pathing]]></title><description><![CDATA[Day 12 - Finding all paths for a bidirectional graph with some special rules as to what nodes can be visited how many number of times. TSP sub-problem? 🚢]]></description><link>https://ghost.kevintarta.com/aoc-2021-day-12/</link><guid isPermaLink="false">61c8df66f81db6034cb7cbbf</guid><category><![CDATA[Advent of Code]]></category><dc:creator><![CDATA[Kevin Tarta]]></dc:creator><pubDate>Mon, 27 Dec 2021 04:21:35 GMT</pubDate><media:content url="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-25.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://adventofcode.com/2021?ref=ghost.kevintarta.com"><img src="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-26.png" class="kg-image" alt="[Advent of Code 2021] Day 12 | Passage Pathing" loading="lazy" width="649" height="221" srcset="https://ghost.kevintarta.com/content/images/size/w600/2021/12/adventofcode-26.png 600w, https://ghost.kevintarta.com/content/images/2021/12/adventofcode-26.png 649w"></a><figcaption>Advent of Code 2021</figcaption></figure><h3 id="part-1">Part 1</h3><img src="https://ghost.kevintarta.com/content/images/2021/12/adventofcode-25.png" alt="[Advent of Code 2021] Day 12 | Passage Pathing"><p>With your submarine&apos;s subterranean subsystems subsisting suboptimally, the only way you&apos;re getting out of this cave anytime soon is by finding a path yourself. Not just <em>a</em> path - the only way to know if you&apos;ve found the <em>best</em> path is to find <em>all</em> of them.</p><p>Fortunately, the sensors are still mostly working, and so you build a rough map of the remaining caves (your puzzle input). For example:</p><pre><code>start-A
start-b
A-c
A-b
b-d
A-end
b-end
</code></pre><p>This is a list of how all of the caves are connected. You start in the cave named <code>start</code>, and your destination is the cave named <code>end</code>. An entry like <code>b-d</code> means that cave <code>b</code> is connected to cave <code>d</code> - that is, you can move between them.</p><p>So, the above cave system looks roughly like this:</p><pre><code>    start
    /   \
c--A-----b--d
    \   /
     end
</code></pre><p>Your goal is to find the number of distinct <em>paths</em> that start at <code>start</code>, end at <code>end</code>, and don&apos;t visit small caves more than once. There are two types of caves: <em>big</em> caves (written in uppercase, like <code>A</code>) and <em>small</em> caves (written in lowercase, like <code>b</code>). It would be a waste of time to visit any small cave more than once, but big caves are large enough that it might be worth visiting them multiple times. So, all paths you find should <em>visit small caves at most once</em>, and can <em>visit big caves any number of times</em>.</p><p>Given these rules, there are <code>_10_</code> paths through this example cave system:</p><pre><code>start,A,b,A,c,A,end
start,A,b,A,end
start,A,b,end
start,A,c,A,b,A,end
start,A,c,A,b,end
start,A,c,A,end
start,A,end
start,b,A,c,A,end
start,b,A,end
start,b,end
</code></pre><p>(Each line in the above list corresponds to a single path; the caves visited by that path are listed in the order they are visited and separated by commas.)</p><p>Note that in this cave system, cave <code>d</code> is never visited by any path: to do so, cave <code>b</code> would need to be visited twice (once on the way to cave <code>d</code> and a second time when returning from cave <code>d</code>), and since cave <code>b</code> is small, this is not allowed.</p><p>Here is a slightly larger example:</p><pre><code>dc-end
HN-start
start-kj
dc-start
dc-HN
LN-dc
HN-end
kj-sa
kj-HN
kj-dc
</code></pre><p>The <code>19</code> paths through it are as follows:</p><pre><code>start,HN,dc,HN,end
start,HN,dc,HN,kj,HN,end
start,HN,dc,end
start,HN,dc,kj,HN,end
start,HN,end
start,HN,kj,HN,dc,HN,end
start,HN,kj,HN,dc,end
start,HN,kj,HN,end
start,HN,kj,dc,HN,end
start,HN,kj,dc,end
start,dc,HN,end
start,dc,HN,kj,HN,end
start,dc,end
start,dc,kj,HN,end
start,kj,HN,dc,HN,end
start,kj,HN,dc,end
start,kj,HN,end
start,kj,dc,HN,end
start,kj,dc,end
</code></pre><p>Finally, this even larger example has <code>226</code> paths through it:</p><pre><code>fs-end
he-DX
fs-he
start-DX
pj-DX
end-zg
zg-sl
zg-pj
pj-he
RW-he
fs-DX
pj-RW
zg-RW
start-pj
he-WI
zg-he
pj-fs
start-RW
</code></pre><p><em>How many paths through this cave system are there that visit small caves at most once?</em></p><hr><p>Proposed solution: since this is a graph with only the unique name of the nodes as attributes we can represent this as a dictionary of node names to a list of connections; then breadth-first search while using memoization to keep track of unique paths until running out of unique paths</p><p>Time complexity: O(E + V) where E is the number of edges and V is the number of vertices</p><p>Space complexity: O(N) where N is the number of unique valid paths from start to end</p><figure class="kg-card kg-code-card"><pre><code class="language-python">#!/usr/bin/env python3
from collections import defaultdict, deque
import sys

if len(sys.argv) != 2:
    print(&quot;Usage: {} &lt;input file&gt;&quot;.format(sys.argv[0]))
    sys.exit(1)

file_input = open(sys.argv[1], &quot;r&quot;).read().strip().split(&quot;\n&quot;)

connections = defaultdict(list)
for line in file_input:
    first, second = line.split(&quot;-&quot;)
    connections[first].append(second)
    connections[second].append(first)

paths = set()
queue = deque()
queue.append(&quot;start&quot;)
while len(queue) != 0:
    check = queue.popleft()
    last_node = check.split(&quot;,&quot;)[-1]
    if last_node == &quot;end&quot;:
        paths.add(check)
        continue
    for move in connections[last_node]:
        if &quot;{},&quot;.format(move) not in check or move.isupper():
            queue.append(&quot;{},{}&quot;.format(check, move))

print(&quot;Total Unique Paths: {}&quot;.format(len(paths)))</code></pre><figcaption>Proud of the simplicity of this one</figcaption></figure><p>Let&apos;s break this down. The first part is just taking each line and populating the graph being represented by a dictionary. Each key is an individual node&apos;s name e.g. &quot;start&quot;, &quot;dc&quot;, &quot;end&quot;, etc. And the corresponding values are lists of connections to other nodes.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">connections = defaultdict(list)
for line in file_input:
    first, second = line.split(&quot;-&quot;)
    connections[first].append(second)
    connections[second].append(first)</code></pre><figcaption>Default dict makes this nice for us</figcaption></figure><p>Next, make a data structure for the final unique paths (already visited) and a queue for unique paths being traversed. We can populate the queue beginning with start.</p><figure class="kg-card kg-code-card"><pre><code class="language-python">paths = set()
queue = deque()
queue.append(&quot;start&quot;)
while len(queue) != 0:
    check = queue.popleft()</code></pre><figcaption>The data structures</figcaption></figure><p>For each working path in the queue, we are representing them by the string delimited by commas (exactly like they are represented in the description of the problem). If the last visited node is &quot;end&quot; then it&apos;s a valid path and we can add it to the unique paths. Otherwise, iterate through the possible connections to the last node. Valid moves for part 1 are those that are not already in the working path or the connection is back to a big cave (uppercase).</p><figure class="kg-card kg-code-card"><pre><code class="language-python">    last_node = check.split(&quot;,&quot;)[-1]
    if last_node == &quot;end&quot;:
        paths.add(check)
        continue
    for move in connections[last_node]:
        if &quot;{},&quot;.format(move) not in check or move.isupper():
            queue.append(&quot;{},{}&quot;.format(check, move))</code></pre><figcaption>Really happy with string representation making things easier</figcaption></figure><p>Our final paths set contains all unique paths represented as comma-delimited strings.</p><pre><code class="language-python">&#x276F; python3 solution12.py example
Total Unique Paths: 10
&#x276F; python3 solution12.py example2
Total Unique Paths: 19
&#x276F; python3 solution12.py example3
Total Unique Paths: 226
&#x276F; python3 solution12.py input12
Total Unique Paths: 5104</code></pre><h3 id="part-2">Part 2</h3><p>After reviewing the available paths, you realize you might have time to visit a single small cave <em>twice</em>. Specifically, big caves can be visited any number of times, a single small cave can be visited at most twice, and the remaining small caves can be visited at most once. However, the caves named <code>start</code> and <code>end</code> can only be visited <em>exactly once each</em>: once you leave the <code>start</code> cave, you may not return to it, and once you reach the <code>end</code> cave, the path must end immediately.</p><p>Now, the <code>36</code> possible paths through the first example above are:</p><pre><code>start,A,b,A,b,A,c,A,end
start,A,b,A,b,A,end
start,A,b,A,b,end
start,A,b,A,c,A,b,A,end
start,A,b,A,c,A,b,end
start,A,b,A,c,A,c,A,end
start,A,b,A,c,A,end
start,A,b,A,end
start,A,b,d,b,A,c,A,end
start,A,b,d,b,A,end
start,A,b,d,b,end
start,A,b,end
start,A,c,A,b,A,b,A,end
start,A,c,A,b,A,b,end
start,A,c,A,b,A,c,A,end
start,A,c,A,b,A,end
start,A,c,A,b,d,b,A,end
start,A,c,A,b,d,b,end
start,A,c,A,b,end
start,A,c,A,c,A,b,A,end
start,A,c,A,c,A,b,end
start,A,c,A,c,A,end
start,A,c,A,end
start,A,end
start,b,A,b,A,c,A,end
start,b,A,b,A,end
start,b,A,b,end
start,b,A,c,A,b,A,end
start,b,A,c,A,b,end
start,b,A,c,A,c,A,end
start,b,A,c,A,end
start,b,A,end
start,b,d,b,A,c,A,end
start,b,d,b,A,end
start,b,d,b,end
start,b,end
</code></pre><p>The slightly larger example above now has <code>103</code> paths through it, and the even larger example now has <code>3509</code> paths through it.</p><p>Given these new rules, <em>how many paths through this cave system are there?</em></p><hr><p>Proposed solution: the same solution except the rules for a valid move have changed slightly; I abstract this into a function to check if another small cave has already been moved to twice in the current path being checked</p><p>Time complexity: O(E + V)</p><p>Space complexity: O(N)</p><figure class="kg-card kg-code-card"><pre><code class="language-python">def valid_path(check, move):
    if move == &quot;start&quot;:
        return False
    double_small = None
    frequencies = {name:check.count(&quot;{}&quot;.format(name)) for name in check.split(&quot;,&quot;)}
    for name, frequency in frequencies.items():
        if frequency == 2 and name.islower():
            double_small = name
    if double_small is not None and (double_small == move or move in frequencies):
        return False
    return True

paths = set()
queue = deque()
queue.append(&quot;start&quot;)
while len(queue) != 0:
    check = queue.popleft()
    last_node = check.split(&quot;,&quot;)[-1]
    if last_node == &quot;end&quot;:
        paths.add(check)
        continue
    for move in connections[last_node]:
        if valid_path(check, move) or move.isupper():
            queue.append(&quot;{},{}&quot;.format(check, move))

print(&quot;Total Unique Paths: {}&quot;.format(len(paths)))</code></pre><figcaption>Valid paths is a little more complicated</figcaption></figure><p>There are optimizations to be made here but the results speak for themselves.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; python3 solution12.py example
Total Unique Paths: 36
&#x276F; python3 solution12.py example2
Total Unique Paths: 103
&#x276F; python3 solution12.py example3
Total Unique Paths: 3509
&#x276F; time python3 solution12.py input12
Total Unique Paths: 149220
python3 solution12.py input12  6.79s user 0.06s system 98% cpu 6.950 total</code></pre><figcaption>Solutions taking longer means it was getting closer to Christmas day hehe</figcaption></figure>]]></content:encoded></item></channel></rss>