Thun/docs/sphinx_docs/_build/html/notebooks/Advent of Code 2017 Decembe...

288 lines
23 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Advent of Code 2017 &#8212; Thun 0.2.0 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="advent-of-code-2017">
<h1>Advent of Code 2017<a class="headerlink" href="#advent-of-code-2017" title="Permalink to this headline"></a></h1>
<div class="section" id="december-1st">
<h2>December 1st<a class="headerlink" href="#december-1st" title="Permalink to this headline"></a></h2>
<p>[Given] a sequence of digits (your puzzle input) and find the sum of all
digits that match the next digit in the list. The list is circular, so
the digit after the last digit is the first digit in the list.</p>
<p>For example:</p>
<ul class="simple">
<li>1122 produces a sum of 3 (1 + 2) because the first digit (1) matches
the second digit and the third digit (2) matches the fourth digit.</li>
<li>1111 produces 4 because each digit (all 1) matches the next.</li>
<li>1234 produces 0 because no digit matches the next.</li>
<li>91212129 produces 9 because the only digit that matches the next one
is the last digit, 9.</li>
</ul>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="k">import</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
</pre></div>
</div>
<p>Ill assume the input is a Joy sequence of integers (as opposed to a
string or something else.)</p>
<p>We might proceed by creating a word that makes a copy of the sequence
with the first item moved to the last, and zips it with the original to
make a list of pairs, and a another word that adds (one of) each pair to
a total if the pair matches.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">AoC2017</span><span class="o">.</span><span class="mi">1</span> <span class="o">==</span> <span class="n">pair_up</span> <span class="n">total_matches</span>
</pre></div>
</div>
<p>Lets derive <code class="docutils literal notranslate"><span class="pre">pair_up</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span><span class="p">]</span> <span class="n">pair_up</span>
<span class="o">-------------------------</span>
<span class="p">[[</span><span class="n">a</span> <span class="n">b</span><span class="p">]</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span><span class="p">]</span> <span class="p">[</span><span class="n">c</span> <span class="n">a</span><span class="p">]]</span>
</pre></div>
</div>
<p>Straightforward (although the order of each pair is reversed, due to the
way <code class="docutils literal notranslate"><span class="pre">zip</span></code> works, but it doesnt matter for this program):</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span><span class="p">]</span> <span class="n">dup</span>
<span class="p">[</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span><span class="p">]</span> <span class="p">[</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span><span class="p">]</span> <span class="n">uncons</span> <span class="n">swap</span>
<span class="p">[</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span><span class="p">]</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span><span class="p">]</span> <span class="n">a</span> <span class="n">unit</span> <span class="n">concat</span>
<span class="p">[</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span><span class="p">]</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">a</span><span class="p">]</span> <span class="nb">zip</span>
<span class="p">[[</span><span class="n">b</span> <span class="n">a</span><span class="p">]</span> <span class="p">[</span><span class="n">c</span> <span class="n">b</span><span class="p">]</span> <span class="p">[</span><span class="n">a</span> <span class="n">c</span><span class="p">]]</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;pair_up == dup uncons swap unit concat zip&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 2 3] pair_up&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="mi">2</span> <span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">3</span><span class="p">]]</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 2 2 3] pair_up&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="mi">2</span> <span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">3</span><span class="p">]]</span>
</pre></div>
</div>
<p>Now we need to derive <code class="docutils literal notranslate"><span class="pre">total_matches</span></code>. It will be a <code class="docutils literal notranslate"><span class="pre">step</span></code> function:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">total_matches</span> <span class="o">==</span> <span class="mi">0</span> <span class="n">swap</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">step</span>
</pre></div>
</div>
<p>Where <code class="docutils literal notranslate"><span class="pre">F</span></code> will have the pair to work with, and it will basically be a
<code class="docutils literal notranslate"><span class="pre">branch</span></code> or <code class="docutils literal notranslate"><span class="pre">ifte</span></code>.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">total</span> <span class="p">[</span><span class="n">n</span> <span class="n">m</span><span class="p">]</span> <span class="n">F</span>
</pre></div>
</div>
<p>It will probably be easier to write if we dequote the pair:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> total [n m] i F
----------------------
total n m F
</pre></div>
</div>
<p>Now <code class="docutils literal notranslate"><span class="pre">F</span></code> becomes just:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">total</span> <span class="n">n</span> <span class="n">m</span> <span class="p">[</span><span class="o">=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="o">+</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span><span class="p">]</span> <span class="n">ifte</span>
</pre></div>
</div>
<p>So:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">F</span> <span class="o">==</span> <span class="n">i</span> <span class="p">[</span><span class="o">=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="o">+</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span><span class="p">]</span> <span class="n">ifte</span>
</pre></div>
</div>
<p>And thus:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">total_matches</span> <span class="o">==</span> <span class="mi">0</span> <span class="n">swap</span> <span class="p">[</span><span class="n">i</span> <span class="p">[</span><span class="o">=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="o">+</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span><span class="p">]</span> <span class="n">ifte</span><span class="p">]</span> <span class="n">step</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;total_matches == 0 swap [i [=] [pop +] [popop] ifte] step&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 2 3] pair_up total_matches&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 2 2 3] pair_up total_matches&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span>
</pre></div>
</div>
<p>Now we can define our main program and evaluate it on the examples.</p>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;AoC2017.1 == pair_up total_matches&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 1 2 2] AoC2017.1&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 1 1 1] AoC2017.1&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">4</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 2 3 4] AoC2017.1&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[9 1 2 1 2 1 2 9] AoC2017.1&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">9</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[9 1 2 1 2 1 2 9] AoC2017.1&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">9</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">pair_up</span> <span class="o">==</span> <span class="n">dup</span> <span class="n">uncons</span> <span class="n">swap</span> <span class="n">unit</span> <span class="n">concat</span> <span class="nb">zip</span>
<span class="n">total_matches</span> <span class="o">==</span> <span class="mi">0</span> <span class="n">swap</span> <span class="p">[</span><span class="n">i</span> <span class="p">[</span><span class="o">=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="o">+</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span><span class="p">]</span> <span class="n">ifte</span><span class="p">]</span> <span class="n">step</span>
<span class="n">AoC2017</span><span class="o">.</span><span class="mi">1</span> <span class="o">==</span> <span class="n">pair_up</span> <span class="n">total_matches</span>
</pre></div>
</div>
<p>Now the paired digit is “halfway” round.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">dup</span> <span class="n">size</span> <span class="mi">2</span> <span class="o">/</span> <span class="p">[</span><span class="n">drop</span><span class="p">]</span> <span class="p">[</span><span class="n">take</span> <span class="n">reverse</span><span class="p">]</span> <span class="n">cleave</span> <span class="n">concat</span> <span class="nb">zip</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 2 3 4] dup size 2 / [drop] [take reverse] cleave concat zip&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="mi">3</span> <span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">4</span><span class="p">]]</span>
</pre></div>
</div>
<p>I realized that each pair is repeated…</p>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 2 3 4] dup size 2 / [drop] [take reverse] cleave zip&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="p">[[</span><span class="mi">1</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">4</span><span class="p">]]</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;AoC2017.1.extra == dup size 2 / [drop] [take reverse] cleave zip swap pop total_matches 2 *&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 2 1 2] AoC2017.1.extra&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">6</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 2 2 1] AoC2017.1.extra&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span>
</pre></div>
</div>
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 2 3 4 2 5] AoC2017.1.extra&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">4</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="refactor-ftw">
<h1>Refactor FTW<a class="headerlink" href="#refactor-ftw" title="Permalink to this headline"></a></h1>
<p>With Joy a great deal of the heuristics from Forth programming carry
over nicely. For example, refactoring into small, well-scoped commands
with mnemonic names…</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">rotate_seq</span> <span class="o">==</span> <span class="n">uncons</span> <span class="n">swap</span> <span class="n">unit</span> <span class="n">concat</span>
<span class="n">pair_up</span> <span class="o">==</span> <span class="n">dup</span> <span class="n">rotate_seq</span> <span class="nb">zip</span>
<span class="n">add_if_match</span> <span class="o">==</span> <span class="p">[</span><span class="o">=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="o">+</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span><span class="p">]</span> <span class="n">ifte</span>
<span class="n">total_matches</span> <span class="o">==</span> <span class="p">[</span><span class="n">i</span> <span class="n">add_if_match</span><span class="p">]</span> <span class="n">step_zero</span>
<span class="n">AoC2017</span><span class="o">.</span><span class="mi">1</span> <span class="o">==</span> <span class="n">pair_up</span> <span class="n">total_matches</span>
<span class="n">half_of_size</span> <span class="o">==</span> <span class="n">dup</span> <span class="n">size</span> <span class="mi">2</span> <span class="o">/</span>
<span class="n">split_at</span> <span class="o">==</span> <span class="p">[</span><span class="n">drop</span><span class="p">]</span> <span class="p">[</span><span class="n">take</span> <span class="n">reverse</span><span class="p">]</span> <span class="n">cleave</span>
<span class="n">pair_up</span><span class="o">.</span><span class="n">extra</span> <span class="o">==</span> <span class="n">half_of_size</span> <span class="n">split_at</span> <span class="nb">zip</span> <span class="n">swap</span> <span class="n">pop</span>
<span class="n">AoC2017</span><span class="o">.</span><span class="mf">1.</span><span class="n">extra</span> <span class="o">==</span> <span class="n">pair_up</span><span class="o">.</span><span class="n">extra</span> <span class="n">total_matches</span> <span class="mi">2</span> <span class="o">*</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h3><a href="../index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Advent of Code 2017</a><ul>
<li><a class="reference internal" href="#december-1st">December 1st</a></li>
</ul>
</li>
<li><a class="reference internal" href="#refactor-ftw">Refactor FTW</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
<div role="note" aria-label="source link">
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="../_sources/notebooks/Advent of Code 2017 December 1st.rst.txt"
rel="nofollow">Show Source</a></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer" role="contentinfo">
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">
<img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" />
</a>
<br />
<span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">Thun Documentation</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="https://joypy.osdn.io/" property="cc:attributionName" rel="cc:attributionURL">Simon Forman</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.<br />Based on a work at <a xmlns:dct="http://purl.org/dc/terms/" href="https://osdn.net/projects/joypy/" rel="dct:source">https://osdn.net/projects/joypy/</a>.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.7.3.
</div>
</body>
</html>