Done day 21
[advent-of-code-19.git] / problems / day21.html
1 <!DOCTYPE html>
2 <html lang="en-us">
3 <head>
4 <meta charset="utf-8"/>
5 <title>Day 21 - Advent of Code 2019</title>
6 <!--[if lt IE 9]><script src="/static/html5.js"></script><![endif]-->
7 <link href='//fonts.googleapis.com/css?family=Source+Code+Pro:300&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
8 <link rel="stylesheet" type="text/css" href="/static/style.css?24"/>
9 <link rel="stylesheet alternate" type="text/css" href="/static/highcontrast.css?0" title="High Contrast"/>
10 <link rel="shortcut icon" href="/favicon.png"/>
11 </head><!--
12
13
14
15
16 Oh, hello! Funny seeing you here.
17
18 I appreciate your enthusiasm, but you aren't going to find much down here.
19 There certainly aren't clues to any of the puzzles. The best surprises don't
20 even appear in the source until you unlock them for real.
21
22 Please be careful with automated requests; I'm not a massive company, and I can
23 only take so much traffic. Please be considerate so that everyone gets to play.
24
25 If you're curious about how Advent of Code works, it's running on some custom
26 Perl code. Other than a few integrations (auth, analytics, ads, social media),
27 I built the whole thing myself, including the design, animations, prose, and
28 all of the puzzles.
29
30 The puzzles are most of the work; preparing a new calendar and a new set of
31 puzzles each year takes all of my free time for 4-5 months. A lot of effort
32 went into building this thing - I hope you're enjoying playing it as much as I
33 enjoyed making it for you!
34
35 If you'd like to hang out, I'm @ericwastl on Twitter.
36
37 - Eric Wastl
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 -->
89 <body>
90 <header><div><h1 class="title-global"><a href="/">Advent of Code</a></h1><nav><ul><li><a href="/2019/about">[About]</a></li><li><a href="/2019/events">[Events]</a></li><li><a href="https://teespring.com/adventofcode-2019" target="_blank">[Shop]</a></li><li><a href="/2019/settings">[Settings]</a></li><li><a href="/2019/auth/logout">[Log Out]</a></li></ul></nav><div class="user">Neil Smith <a href="/2019/support" class="supporter-badge" title="Advent of Code Supporter">(AoC++)</a> <span class="star-count">42*</span></div></div><div><h1 class="title-event">&nbsp;&nbsp;&nbsp;<span class="title-event-wrap">int y=</span><a href="/2019">2019</a><span class="title-event-wrap">;</span></h1><nav><ul><li><a href="/2019">[Calendar]</a></li><li><a href="/2019/support">[AoC++]</a></li><li><a href="/2019/sponsors">[Sponsors]</a></li><li><a href="/2019/leaderboard">[Leaderboard]</a></li><li><a href="/2019/stats">[Stats]</a></li></ul></nav></div></header>
91
92 <div id="sidebar">
93 <div id="sponsor"><div class="quiet">Our <a href="/2019/sponsors">sponsors</a> help make Advent of Code possible:</div><div class="sponsor"><a href="https://xandr.att.jobs/search-jobs" target="_blank" onclick="if(ga)ga('send','event','sponsor','sidebar',this.href);" rel="noopener">Xandr</a> - Improving advertising for brands and consumers.</div></div>
94 </div><!--/sidebar-->
95
96 <main>
97 <script>window.addEventListener('click', function(e,s,r){if(e.target.nodeName==='CODE'&&e.detail===3){s=window.getSelection();s.removeAllRanges();r=document.createRange();r.selectNodeContents(e.target);s.addRange(r);}});</script>
98 <article class="day-desc"><h2>--- Day 21: Springdroid Adventure ---</h2><p>You lift off from Pluto and start flying in the direction of Santa.</p>
99 <p>While experimenting further with the tractor beam, you accidentally pull an asteroid directly into your ship! It deals significant damage to your hull and causes your ship to begin tumbling violently.</p>
100 <p>You can send a droid out to investigate, but the tumbling is causing enough <a href="https://en.wikipedia.org/wiki/Artificial_gravity">artificial gravity</a> that one wrong step could send the droid through a hole in the hull and flying out into space.</p>
101 <p>The clear choice for this mission is a <span title="I picture the Bouncy enemy from Kirby games.">droid</span> that can <em>jump</em> over the holes in the hull - a <em>springdroid</em>.</p>
102 <p>You can use an <a href="9">Intcode</a> program (your puzzle input) running on an <a href="17">ASCII-capable</a> computer to <a href="https://en.wikipedia.org/wiki/Programmable_read-only_memory">program</a> the springdroid. However, springdroids don't run Intcode; instead, they run a simplified assembly language called <em>springscript</em>.</p>
103 <p>While a springdroid is certainly capable of navigating the artificial gravity and giant holes, it has one downside: it can only remember at most <em>15</em> springscript instructions.</p>
104 <p>The springdroid will move forward automatically, constantly thinking about <em>whether to jump</em>. The springscript program defines the logic for this decision.</p>
105 <p>Springscript programs only use <a href="https://en.wikipedia.org/wiki/Boolean_data_type">Boolean values</a>, not numbers or strings. Two registers are available: <code>T</code>, the <em>temporary value</em> register, and <code>J</code>, the <em>jump</em> register. If the jump register is <em>true</em> at the end of the springscript program, the springdroid will try to jump. Both of these registers start with the value <em>false</em>.</p>
106 <p>Springdroids have a sensor that can detect <em>whether there is ground</em> at various distances in the direction it is facing; these values are provided in <em>read-only registers</em>. Your springdroid can detect ground at four distances: one tile away (<code>A</code>), two tiles away (<code>B</code>), three tiles away (<code>C</code>), and four tiles away (<code>D</code>). If there is ground at the given distance, the register will be <em>true</em>; if there is a hole, the register will be <em>false</em>.</p>
107 <p>There are only <em>three instructions</em> available in springscript:</p>
108 <ul>
109 <li><code>AND X Y</code> sets <code>Y</code> to <em>true</em> if both <code>X</code> and <code>Y</code> are <em>true</em>; otherwise, it sets <code>Y</code> to <em>false</em>.</li>
110 <li><code>OR X Y</code> sets <code>Y</code> to <em>true</em> if at least one of <code>X</code> or <code>Y</code> is <em>true</em>; otherwise, it sets <code>Y</code> to <em>false</em>.</li>
111 <li><code>NOT X Y</code> sets <code>Y</code> to <em>true</em> if <code>X</code> is <em>false</em>; otherwise, it sets <code>Y</code> to <em>false</em>.</li>
112 </ul>
113 <p>In all three instructions, the second argument (<code>Y</code>) needs to be a <em>writable register</em> (either <code>T</code> or <code>J</code>). The first argument (<code>X</code>) can be <em>any register</em> (including <code>A</code>, <code>B</code>, <code>C</code>, or <code>D</code>).</p>
114 <p>For example, the one-instruction program <code>NOT A J</code> means "if the tile immediately in front of me is not ground, jump".</p>
115 <p>Or, here is a program that jumps if a three-tile-wide hole (with ground on the other side of the hole) is detected:</p>
116 <pre><code>NOT A J
117 NOT B T
118 AND T J
119 NOT C T
120 AND T J
121 AND D J
122 </code></pre>
123 <p>The Intcode program expects ASCII inputs and outputs. It will begin by displaying a prompt; then, input the desired instructions one per line. End each line with a newline (ASCII code <code>10</code>). <em>When you have finished entering your program</em>, provide the command <code>WALK</code> followed by a newline to instruct the springdroid to begin surveying the hull.</p>
124 <p>If the springdroid <em>falls into space</em>, an ASCII rendering of the last moments of its life will be produced. In these, <code>@</code> is the springdroid, <code>#</code> is hull, and <code>.</code> is empty space. For example, suppose you program the springdroid like this:
125 <pre><code>NOT D J
126 WALK
127 </code></pre>
128 <p>This one-instruction program sets <code>J</code> to <em>true</em> if and only if there is no ground four tiles away. In other words, it attempts to jump into any hole it finds:</p>
129 <pre><code>.................
130 .................
131 <em>@</em>................
132 #####.###########
133
134 .................
135 .................
136 .<em>@</em>...............
137 #####.###########
138
139 .................
140 ..<em>@</em>..............
141 .................
142 #####.###########
143
144 ...<em>@</em>.............
145 .................
146 .................
147 #####.###########
148
149 .................
150 ....<em>@</em>............
151 .................
152 #####.###########
153
154 .................
155 .................
156 .....<em>@</em>...........
157 #####.###########
158
159 .................
160 .................
161 .................
162 #####<em>@</em>###########
163 </code></pre>
164 <p>However, if the springdroid successfully makes it across, it will use an output instruction to indicate the <em>amount of damage to the hull</em> as a single giant integer outside the normal ASCII range.</p>
165 <p>Program the springdroid with logic that allows it to survey the hull without falling into space. <em>What amount of hull damage does it report?</em></p>
166 </article>
167 <p>Your puzzle answer was <code>19349530</code>.</p><article class="day-desc"><h2 id="part2">--- Part Two ---</h2><p>There are many areas the springdroid can't reach. You flip through the manual and discover a way to <em>increase its sensor range</em>.</p>
168 <p>Instead of ending your springcode program with <code>WALK</code>, use <code>RUN</code>. Doing this will enable <em>extended sensor mode</em>, capable of sensing ground up to <em>nine tiles away</em>. This data is available in <em>five new read-only registers</em>:</p>
169 <ul>
170 <li>Register <code>E</code> indicates whether there is ground <em>five</em> tiles away.</li>
171 <li>Register <code>F</code> indicates whether there is ground <em>six</em> tiles away.</li>
172 <li>Register <code>G</code> indicates whether there is ground <em>seven</em> tiles away.</li>
173 <li>Register <code>H</code> indicates whether there is ground <em>eight</em> tiles away.</li>
174 <li>Register <code>I</code> indicates whether there is ground <em>nine</em> tiles away.</li>
175 </ul>
176 <p>All other functions remain the same.</p>
177 <p>Successfully survey the rest of the hull by ending your program with <code>RUN</code>. <em>What amount of hull damage does the springdroid now report?</em></p>
178 </article>
179 <p>Your puzzle answer was <code>1142805439</code>.</p><p class="day-success">Both parts of this puzzle are complete! They provide two gold stars: **</p>
180 <p>At this point, you should <a href="/2019">return to your Advent calendar</a> and try another puzzle.</p>
181 <p>If you still want to see it, you can <a href="21/input" target="_blank">get your puzzle input</a>.</p>
182 <p>You can also <span class="share">[Share<span class="share-content">on
183 <a href="https://twitter.com/intent/tweet?text=I%27ve+completed+%22Springdroid+Adventure%22+%2D+Day+21+%2D+Advent+of+Code+2019&amp;url=https%3A%2F%2Fadventofcode%2Ecom%2F2019%2Fday%2F21&amp;related=ericwastl&amp;hashtags=AdventOfCode" target="_blank">Twitter</a>
184 <a href="javascript:void(0);" onclick="var mastodon_instance=prompt('Mastodon Instance / Server Name?'); if(typeof mastodon_instance==='string' && mastodon_instance.length){this.href='https://'+mastodon_instance+'/share?text=I%27ve+completed+%22Springdroid+Adventure%22+%2D+Day+21+%2D+Advent+of+Code+2019+%23AdventOfCode+https%3A%2F%2Fadventofcode%2Ecom%2F2019%2Fday%2F21'}else{return false;}" target="_blank">Mastodon</a
185 ></span>]</span> this puzzle.</p>
186 </main>
187
188 <!-- ga -->
189 <script>
190 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
191 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
192 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
193 })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
194 ga('create', 'UA-69522494-1', 'auto');
195 ga('set', 'anonymizeIp', true);
196 ga('send', 'pageview');
197 </script>
198 <!-- /ga -->
199 </body>
200 </html>