Removing old html.
This commit is contained in:
@@ -1,288 +0,0 @@
|
||||
|
||||
<!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 — 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>I’ll 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>Let’s 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 doesn’t 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">'pair_up == dup uncons swap unit concat zip'</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">'[1 2 3] pair_up'</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">'[1 2 2 3] pair_up'</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">'total_matches == 0 swap [i [=] [pop +] [popop] ifte] step'</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">'[1 2 3] pair_up total_matches'</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">'[1 2 2 3] pair_up total_matches'</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">'AoC2017.1 == pair_up total_matches'</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">'[1 1 2 2] AoC2017.1'</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">'[1 1 1 1] AoC2017.1'</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">'[1 2 3 4] AoC2017.1'</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">'[9 1 2 1 2 1 2 9] AoC2017.1'</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">'[9 1 2 1 2 1 2 9] AoC2017.1'</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">'[1 2 3 4] dup size 2 / [drop] [take reverse] cleave concat zip'</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">'[1 2 3 4] dup size 2 / [drop] [take reverse] cleave zip'</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">'AoC2017.1.extra == dup size 2 / [drop] [take reverse] cleave zip swap pop total_matches 2 *'</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">'[1 2 1 2] AoC2017.1.extra'</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">'[1 2 2 1] AoC2017.1.extra'</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">'[1 2 3 4 2 5] AoC2017.1.extra'</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>
|
||||
@@ -1,436 +0,0 @@
|
||||
|
||||
<!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 — 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-2nd">
|
||||
<h2>December 2nd<a class="headerlink" href="#december-2nd" title="Permalink to this headline">¶</a></h2>
|
||||
<p>For each row, determine the difference between the largest value and the
|
||||
smallest value; the checksum is the sum of all of these differences.</p>
|
||||
<p>For example, given the following spreadsheet:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">5</span> <span class="mi">1</span> <span class="mi">9</span> <span class="mi">5</span>
|
||||
<span class="mi">7</span> <span class="mi">5</span> <span class="mi">3</span>
|
||||
<span class="mi">2</span> <span class="mi">4</span> <span class="mi">6</span> <span class="mi">8</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<ul class="simple">
|
||||
<li>The first row’s largest and smallest values are 9 and 1, and their
|
||||
difference is 8.</li>
|
||||
<li>The second row’s largest and smallest values are 7 and 3, and their
|
||||
difference is 4.</li>
|
||||
<li>The third row’s difference is 6.</li>
|
||||
</ul>
|
||||
<p>In this example, the spreadsheet’s checksum would be 8 + 4 + 6 = 18.</p>
|
||||
<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>I’ll assume the input is a Joy sequence of sequences of integers.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="mi">5</span> <span class="mi">1</span> <span class="mi">9</span> <span class="mi">5</span><span class="p">]</span>
|
||||
<span class="p">[</span><span class="mi">7</span> <span class="mi">5</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="mi">6</span> <span class="mi">8</span><span class="p">]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>So, obviously, the initial form 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">AoC2017</span><span class="o">.</span><span class="mi">2</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="o">+</span><span class="p">]</span> <span class="n">step</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>This function <code class="docutils literal notranslate"><span class="pre">F</span></code> must get the <code class="docutils literal notranslate"><span class="pre">max</span></code> and <code class="docutils literal notranslate"><span class="pre">min</span></code> of a row of numbers
|
||||
and subtract. We can define a helper function <code class="docutils literal notranslate"><span class="pre">maxmin</span></code> which does
|
||||
this:</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">'maxmin == [max] [min] cleave'</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">'[1 2 3] maxmin'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span> <span class="mi">1</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Then <code class="docutils literal notranslate"><span class="pre">F</span></code> just does that then subtracts the min from the max:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">F</span> <span class="o">==</span> <span class="n">maxmin</span> <span class="o">-</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>So:</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">'AoC2017.2 == [maxmin - +] step_zero'</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">'''</span>
|
||||
|
||||
<span class="s1">[[5 1 9 5]</span>
|
||||
<span class="s1"> [7 5 3]</span>
|
||||
<span class="s1"> [2 4 6 8]] AoC2017.2</span>
|
||||
|
||||
<span class="s1">'''</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">18</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>…find the only two numbers in each row where one evenly divides the
|
||||
other - that is, where the result of the division operation is a whole
|
||||
number. They would like you to find those numbers on each line, divide
|
||||
them, and add up each line’s result.</p>
|
||||
<p>For example, given the following spreadsheet:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">5</span> <span class="mi">9</span> <span class="mi">2</span> <span class="mi">8</span>
|
||||
<span class="mi">9</span> <span class="mi">4</span> <span class="mi">7</span> <span class="mi">3</span>
|
||||
<span class="mi">3</span> <span class="mi">8</span> <span class="mi">6</span> <span class="mi">5</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<ul class="simple">
|
||||
<li>In the first row, the only two numbers that evenly divide are 8 and
|
||||
2; the result of this division is 4.</li>
|
||||
<li>In the second row, the two numbers are 9 and 3; the result is 3.</li>
|
||||
<li>In the third row, the result is 2.</li>
|
||||
</ul>
|
||||
<p>In this example, the sum of the results would be 4 + 3 + 2 = 9.</p>
|
||||
<p>What is the sum of each row’s result in your puzzle input?</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">'[5 9 2 8] sort reverse'</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">9</span> <span class="mi">8</span> <span class="mi">5</span> <span class="mi">2</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">'[9 8 5 2] uncons [swap [divmod] cons] dupdip'</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">8</span> <span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">5</span> <span class="mi">2</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">9</span> <span class="mi">8</span> <span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="n">uncons</span> <span class="p">[</span><span class="n">swap</span> <span class="p">[</span><span class="nb">divmod</span><span class="p">]</span> <span class="n">cons</span> <span class="n">F</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">G</span>
|
||||
<span class="p">[</span><span class="mi">8</span> <span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="n">F</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="n">G</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'[8 5 2] [9 divmod] [uncons swap] dip dup [i not] dip'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="p">[</span><span class="mi">8</span> <span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="p">[</span><span class="n">uncons</span> <span class="n">swap</span><span class="p">]</span> <span class="n">dip</span> <span class="n">dup</span> <span class="p">[</span><span class="n">i</span> <span class="ow">not</span><span class="p">]</span> <span class="n">dip</span>
|
||||
<span class="p">[</span><span class="mi">8</span> <span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="o">.</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="p">[</span><span class="n">uncons</span> <span class="n">swap</span><span class="p">]</span> <span class="n">dip</span> <span class="n">dup</span> <span class="p">[</span><span class="n">i</span> <span class="ow">not</span><span class="p">]</span> <span class="n">dip</span>
|
||||
<span class="p">[</span><span class="mi">8</span> <span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="o">.</span> <span class="p">[</span><span class="n">uncons</span> <span class="n">swap</span><span class="p">]</span> <span class="n">dip</span> <span class="n">dup</span> <span class="p">[</span><span class="n">i</span> <span class="ow">not</span><span class="p">]</span> <span class="n">dip</span>
|
||||
<span class="p">[</span><span class="mi">8</span> <span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="p">[</span><span class="n">uncons</span> <span class="n">swap</span><span class="p">]</span> <span class="o">.</span> <span class="n">dip</span> <span class="n">dup</span> <span class="p">[</span><span class="n">i</span> <span class="ow">not</span><span class="p">]</span> <span class="n">dip</span>
|
||||
<span class="p">[</span><span class="mi">8</span> <span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="o">.</span> <span class="n">uncons</span> <span class="n">swap</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="n">dup</span> <span class="p">[</span><span class="n">i</span> <span class="ow">not</span><span class="p">]</span> <span class="n">dip</span>
|
||||
<span class="mi">8</span> <span class="p">[</span><span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="o">.</span> <span class="n">swap</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="n">dup</span> <span class="p">[</span><span class="n">i</span> <span class="ow">not</span><span class="p">]</span> <span class="n">dip</span>
|
||||
<span class="p">[</span><span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">8</span> <span class="o">.</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="n">dup</span> <span class="p">[</span><span class="n">i</span> <span class="ow">not</span><span class="p">]</span> <span class="n">dip</span>
|
||||
<span class="p">[</span><span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">8</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="o">.</span> <span class="n">dup</span> <span class="p">[</span><span class="n">i</span> <span class="ow">not</span><span class="p">]</span> <span class="n">dip</span>
|
||||
<span class="p">[</span><span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">8</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="o">.</span> <span class="p">[</span><span class="n">i</span> <span class="ow">not</span><span class="p">]</span> <span class="n">dip</span>
|
||||
<span class="p">[</span><span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">8</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="p">[</span><span class="n">i</span> <span class="ow">not</span><span class="p">]</span> <span class="o">.</span> <span class="n">dip</span>
|
||||
<span class="p">[</span><span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">8</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="o">.</span> <span class="n">i</span> <span class="ow">not</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span>
|
||||
<span class="p">[</span><span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">8</span> <span class="o">.</span> <span class="mi">9</span> <span class="nb">divmod</span> <span class="ow">not</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span>
|
||||
<span class="p">[</span><span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">8</span> <span class="mi">9</span> <span class="o">.</span> <span class="nb">divmod</span> <span class="ow">not</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span>
|
||||
<span class="p">[</span><span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">1</span> <span class="mi">1</span> <span class="o">.</span> <span class="ow">not</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span>
|
||||
<span class="p">[</span><span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">1</span> <span class="kc">False</span> <span class="o">.</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span>
|
||||
<span class="p">[</span><span class="mi">5</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">1</span> <span class="kc">False</span> <span class="p">[</span><span class="mi">9</span> <span class="nb">divmod</span><span class="p">]</span> <span class="o">.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="tricky">
|
||||
<h2>Tricky<a class="headerlink" href="#tricky" title="Permalink to this headline">¶</a></h2>
|
||||
<p>Let’s think.</p>
|
||||
<p>Given a <em>sorted</em> sequence (from highest to lowest) we want to * for
|
||||
head, tail in sequence * for term in tail: * check if the head % term
|
||||
== 0 * if so compute head / term and terminate loop * else continue</p>
|
||||
<div class="section" id="so-we-want-a-loop-i-think">
|
||||
<h3>So we want a <code class="docutils literal notranslate"><span class="pre">loop</span></code> I think<a class="headerlink" href="#so-we-want-a-loop-i-think" title="Permalink to this headline">¶</a></h3>
|
||||
<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="kc">True</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">loop</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">Q</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">loop</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p><code class="docutils literal notranslate"><span class="pre">Q</span></code> should either leave the result and False, or the <code class="docutils literal notranslate"><span class="pre">rest</span></code> and
|
||||
True.</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">Q</span>
|
||||
<span class="o">-----------------</span>
|
||||
<span class="n">result</span> <span class="mi">0</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">Q</span>
|
||||
<span class="o">-----------------</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="mi">1</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>This suggests that <code class="docutils literal notranslate"><span class="pre">Q</span></code> should start with:</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">uncons</span> <span class="n">dup</span> <span class="n">roll</span><span class="o"><</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Now we just have to <code class="docutils literal notranslate"><span class="pre">pop</span></code> it if we don’t need it.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="p">[</span><span class="n">P</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">cons</span><span class="p">]</span> <span class="n">app2</span> <span class="n">popdd</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="n">primrec</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">a</span> <span class="n">P</span><span class="p">]</span> <span class="p">[</span><span class="n">a</span> <span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="n">primrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<hr class="docutils" />
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">w</span><span class="o">/</span> <span class="n">Q</span> <span class="o">==</span> <span class="p">[</span><span class="o">%</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">primrec</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">uncons</span>
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">tuck</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">uncons</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="n">b</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">roll</span><span class="o">></span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="n">b</span> <span class="n">Q</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="n">b</span> <span class="p">[</span><span class="o">%</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">primrec</span>
|
||||
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="n">b</span> <span class="n">T</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="n">b</span> <span class="o">/</span> <span class="n">roll</span><span class="o">></span> <span class="n">popop</span> <span class="mi">0</span>
|
||||
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="n">b</span> <span class="n">F</span> <span class="n">Q</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="n">b</span> <span class="n">pop</span> <span class="n">swap</span> <span class="n">uncons</span> <span class="o">...</span> <span class="n">Q</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="n">swap</span> <span class="n">uncons</span> <span class="o">...</span> <span class="n">Q</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">uncons</span> <span class="o">...</span> <span class="n">Q</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="n">c</span> <span class="p">[</span><span class="n">d</span><span class="p">]</span> <span class="n">roll</span><span class="o">></span> <span class="n">Q</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="n">c</span> <span class="n">Q</span>
|
||||
|
||||
<span class="n">Q</span> <span class="o">==</span> <span class="p">[</span><span class="o">%</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="o">/</span> <span class="n">roll</span><span class="o">></span> <span class="n">popop</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">swap</span> <span class="n">uncons</span> <span class="n">roll</span><span class="o">></span><span class="p">]</span> <span class="n">primrec</span>
|
||||
|
||||
<span class="n">uncons</span> <span class="n">tuck</span> <span class="n">uncons</span> <span class="n">roll</span><span class="o">></span> <span class="n">Q</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">'[8 5 3 2] 9 [swap] [% not] [cons] app2 popdd'</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">8</span> <span class="mi">5</span> <span class="mi">3</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">9</span> <span class="n">swap</span><span class="p">]</span> <span class="p">[</span><span class="mi">9</span> <span class="o">%</span> <span class="ow">not</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<hr class="docutils" />
|
||||
<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">uncons</span>
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">tuck</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">ifte</span>
|
||||
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="p">[]</span> <span class="n">popop</span> <span class="mi">1</span>
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="mi">1</span>
|
||||
|
||||
<span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">a</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">Q</span>
|
||||
|
||||
|
||||
<span class="n">a</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">Q</span>
|
||||
<span class="o">---------------</span>
|
||||
<span class="n">result</span> <span class="mi">0</span>
|
||||
|
||||
<span class="n">a</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">Q</span>
|
||||
<span class="o">---------------</span>
|
||||
<span class="mi">1</span>
|
||||
|
||||
|
||||
<span class="n">w</span><span class="o">/</span> <span class="n">Q</span> <span class="o">==</span> <span class="p">[</span><span class="n">first</span> <span class="o">%</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span> <span class="o">/</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">rest</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="mi">1</span><span class="p">]]</span> <span class="p">[</span><span class="n">ifte</span><span class="p">]</span>
|
||||
|
||||
|
||||
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span> <span class="o">%</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span> <span class="o">/</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">rest</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="mi">1</span><span class="p">]]</span> <span class="p">[</span><span class="n">ifte</span><span class="p">]</span>
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">first</span> <span class="o">%</span> <span class="ow">not</span>
|
||||
<span class="n">a</span> <span class="n">b</span> <span class="o">%</span> <span class="ow">not</span>
|
||||
<span class="n">a</span><span class="o">%</span><span class="n">b</span> <span class="ow">not</span>
|
||||
<span class="nb">bool</span><span class="p">(</span><span class="n">a</span><span class="o">%</span><span class="n">b</span><span class="p">)</span>
|
||||
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span> <span class="o">%</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span> <span class="o">/</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">rest</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="mi">1</span><span class="p">]]</span> <span class="p">[</span><span class="n">ifte</span><span class="p">]</span>
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">first</span> <span class="o">/</span> <span class="mi">0</span>
|
||||
<span class="n">a</span> <span class="n">b</span> <span class="o">/</span> <span class="mi">0</span>
|
||||
<span class="n">a</span><span class="o">/</span><span class="n">b</span> <span class="mi">0</span>
|
||||
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span> <span class="o">%</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span> <span class="o">/</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">rest</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="mi">1</span><span class="p">]]</span> <span class="p">[</span><span class="n">ifte</span><span class="p">]</span>
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">b</span> <span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">rest</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">ifte</span>
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">ifte</span>
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">ifte</span>
|
||||
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">ifte</span>
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="ow">not</span>
|
||||
|
||||
<span class="n">a</span> <span class="p">[]</span> <span class="n">popop</span> <span class="mi">1</span>
|
||||
<span class="mi">1</span>
|
||||
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">c</span> <span class="n">d</span><span class="p">]</span> <span class="n">Q</span>
|
||||
|
||||
|
||||
<span class="n">uncons</span> <span class="n">tuck</span> <span class="p">[</span><span class="n">first</span> <span class="o">%</span> <span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">first</span> <span class="o">/</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">rest</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="mi">1</span><span class="p">]]</span> <span class="p">[</span><span class="n">ifte</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="i-finally-sat-down-with-a-piece-of-paper-and-blocked-it-out">
|
||||
<h3>I finally sat down with a piece of paper and blocked it out.<a class="headerlink" href="#i-finally-sat-down-with-a-piece-of-paper-and-blocked-it-out" title="Permalink to this headline">¶</a></h3>
|
||||
<p>First, I made a function <code class="docutils literal notranslate"><span class="pre">G</span></code> that expects a number and a sequence of
|
||||
candidates and return the result or zero:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">n</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">G</span>
|
||||
<span class="o">---------------</span>
|
||||
<span class="n">result</span>
|
||||
|
||||
<span class="n">n</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">G</span>
|
||||
<span class="o">---------------</span>
|
||||
<span class="mi">0</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>It’s a recursive function that conditionally executes the recursive part
|
||||
of its recursive branch</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">Pg</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span> <span class="p">[</span><span class="n">Pi</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="p">]]</span> <span class="p">[</span><span class="n">ifte</span><span class="p">]</span> <span class="n">genrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>The recursive branch is the else-part of the inner <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">G</span> <span class="o">==</span> <span class="p">[</span><span class="n">Pg</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span> <span class="p">[</span><span class="n">Pi</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="p">]]</span> <span class="p">[</span><span class="n">ifte</span><span class="p">]</span> <span class="n">genrec</span>
|
||||
<span class="o">==</span> <span class="p">[</span><span class="n">Pg</span><span class="p">]</span> <span class="p">[</span><span class="n">E</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span> <span class="p">[</span><span class="n">Pi</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">G</span><span class="p">]</span> <span class="n">ifte</span><span class="p">]</span> <span class="n">ifte</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>But this is in hindsight. Going forward I derived:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">G</span> <span class="o">==</span> <span class="p">[</span><span class="n">first</span> <span class="o">%</span> <span class="ow">not</span><span class="p">]</span>
|
||||
<span class="p">[</span><span class="n">first</span> <span class="o">/</span><span class="p">]</span>
|
||||
<span class="p">[</span><span class="n">rest</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="mi">0</span><span class="p">]]</span>
|
||||
<span class="p">[</span><span class="n">ifte</span><span class="p">]</span> <span class="n">genrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>The predicate detects if the <code class="docutils literal notranslate"><span class="pre">n</span></code> can be evenly divided by the
|
||||
<code class="docutils literal notranslate"><span class="pre">first</span></code> item in the list. If so, the then-part returns the result.
|
||||
Otherwise, we have:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">n</span> <span class="p">[</span><span class="n">m</span> <span class="o">...</span><span class="p">]</span> <span class="n">rest</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">G</span><span class="p">]</span> <span class="n">ifte</span>
|
||||
<span class="n">n</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="ow">not</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="n">G</span><span class="p">]</span> <span class="n">ifte</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>This <code class="docutils literal notranslate"><span class="pre">ifte</span></code> guards against empty sequences and returns zero in that
|
||||
case, otherwise it executes <code class="docutils literal notranslate"><span class="pre">G</span></code>.</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">'G == [first % not] [first /] [rest [not] [popop 0]] [ifte] genrec'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Now we need a word that uses <code class="docutils literal notranslate"><span class="pre">G</span></code> on each (head, tail) pair of a
|
||||
sequence until it finds a (non-zero) result. It’s going to be designed
|
||||
to work on a stack that has some candidate <code class="docutils literal notranslate"><span class="pre">n</span></code>, a sequence of possible
|
||||
divisors, and a result that is zero to signal to continue (a non-zero
|
||||
value implies that it is the discovered result):</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">n</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">p</span> <span class="n">find</span><span class="o">-</span><span class="n">result</span>
|
||||
<span class="o">---------------------------</span>
|
||||
<span class="n">result</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>It applies <code class="docutils literal notranslate"><span class="pre">G</span></code> using <code class="docutils literal notranslate"><span class="pre">nullary</span></code> because if it fails with one
|
||||
candidate it needs the list to get the next one (the list is otherwise
|
||||
consumed by <code class="docutils literal notranslate"><span class="pre">G</span></code>.)</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">find</span><span class="o">-</span><span class="n">result</span> <span class="o">==</span> <span class="p">[</span><span class="mi">0</span> <span class="o">></span><span class="p">]</span> <span class="p">[</span><span class="n">roll</span><span class="o">></span> <span class="n">popop</span><span class="p">]</span> <span class="p">[</span><span class="n">roll</span><span class="o"><</span> <span class="n">popop</span> <span class="n">uncons</span> <span class="p">[</span><span class="n">G</span><span class="p">]</span> <span class="n">nullary</span><span class="p">]</span> <span class="n">primrec</span>
|
||||
|
||||
<span class="n">n</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">p</span> <span class="p">[</span><span class="mi">0</span> <span class="o">></span><span class="p">]</span> <span class="p">[</span><span class="n">roll</span><span class="o">></span> <span class="n">popop</span><span class="p">]</span> <span class="p">[</span><span class="n">roll</span><span class="o"><</span> <span class="n">popop</span> <span class="n">uncons</span> <span class="p">[</span><span class="n">G</span><span class="p">]</span> <span class="n">nullary</span><span class="p">]</span> <span class="n">primrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>The base-case is trivial, return the (non-zero) result. The recursive
|
||||
branch…</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">n</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">p</span> <span class="n">roll</span><span class="o"><</span> <span class="n">popop</span> <span class="n">uncons</span> <span class="p">[</span><span class="n">G</span><span class="p">]</span> <span class="n">nullary</span> <span class="n">find</span><span class="o">-</span><span class="n">result</span>
|
||||
<span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">p</span> <span class="n">n</span> <span class="n">popop</span> <span class="n">uncons</span> <span class="p">[</span><span class="n">G</span><span class="p">]</span> <span class="n">nullary</span> <span class="n">find</span><span class="o">-</span><span class="n">result</span>
|
||||
<span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">uncons</span> <span class="p">[</span><span class="n">G</span><span class="p">]</span> <span class="n">nullary</span> <span class="n">find</span><span class="o">-</span><span class="n">result</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">G</span><span class="p">]</span> <span class="n">nullary</span> <span class="n">find</span><span class="o">-</span><span class="n">result</span>
|
||||
<span class="n">m</span> <span class="p">[</span><span class="o">..</span><span class="p">]</span> <span class="n">p</span> <span class="n">find</span><span class="o">-</span><span class="n">result</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>The puzzle states that the input is well-formed, meaning that we can
|
||||
expect a result before the row sequence empties and so do not need to
|
||||
guard the <code class="docutils literal notranslate"><span class="pre">uncons</span></code>.</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">'find-result == [0 >] [roll> popop] [roll< popop uncons [G] nullary] primrec'</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">'[11 9 8 7 3 2] 0 tuck find-result'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">3.0</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>In order to get the thing started, we need to <code class="docutils literal notranslate"><span class="pre">sort</span></code> the list in
|
||||
descending order, then prime the <code class="docutils literal notranslate"><span class="pre">find-result</span></code> function with a dummy
|
||||
candidate value and zero (“continue”) flag.</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">'prep-row == sort reverse 0 tuck'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Now we can define our program.</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">'AoC20017.2.extra == [prep-row find-result +] step_zero'</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">'''</span>
|
||||
|
||||
<span class="s1">[[5 9 2 8]</span>
|
||||
<span class="s1"> [9 4 7 3]</span>
|
||||
<span class="s1"> [3 8 6 5]] AoC20017.2.extra</span>
|
||||
|
||||
<span class="s1">'''</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">9.0</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</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-2nd">December 2nd</a></li>
|
||||
<li><a class="reference internal" href="#tricky">Tricky</a><ul>
|
||||
<li><a class="reference internal" href="#so-we-want-a-loop-i-think">So we want a <code class="docutils literal notranslate"><span class="pre">loop</span></code> I think</a></li>
|
||||
<li><a class="reference internal" href="#i-finally-sat-down-with-a-piece-of-paper-and-blocked-it-out">I finally sat down with a piece of paper and blocked it out.</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</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 2nd.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>
|
||||
@@ -1,787 +0,0 @@
|
||||
|
||||
<!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 — 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-3rd">
|
||||
<h2>December 3rd<a class="headerlink" href="#december-3rd" title="Permalink to this headline">¶</a></h2>
|
||||
<p>You come across an experimental new kind of memory stored on an infinite
|
||||
two-dimensional grid.</p>
|
||||
<p>Each square on the grid is allocated in a spiral pattern starting at a
|
||||
location marked 1 and then counting up while spiraling outward. For
|
||||
example, the first few squares are allocated like this:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">17</span> <span class="mi">16</span> <span class="mi">15</span> <span class="mi">14</span> <span class="mi">13</span>
|
||||
<span class="mi">18</span> <span class="mi">5</span> <span class="mi">4</span> <span class="mi">3</span> <span class="mi">12</span>
|
||||
<span class="mi">19</span> <span class="mi">6</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">11</span>
|
||||
<span class="mi">20</span> <span class="mi">7</span> <span class="mi">8</span> <span class="mi">9</span> <span class="mi">10</span>
|
||||
<span class="mi">21</span> <span class="mi">22</span> <span class="mi">23</span><span class="o">---></span> <span class="o">...</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>While this is very space-efficient (no squares are skipped), requested
|
||||
data must be carried back to square 1 (the location of the only access
|
||||
port for this memory system) by programs that can only move up, down,
|
||||
left, or right. They always take the shortest path: the Manhattan
|
||||
Distance between the location of the data and square 1.</p>
|
||||
<p>For example:</p>
|
||||
<ul class="simple">
|
||||
<li>Data from square 1 is carried 0 steps, since it’s at the access port.</li>
|
||||
<li>Data from square 12 is carried 3 steps, such as: down, left, left.</li>
|
||||
<li>Data from square 23 is carried only 2 steps: up twice.</li>
|
||||
<li>Data from square 1024 must be carried 31 steps.</li>
|
||||
</ul>
|
||||
<p>How many steps are required to carry the data from the square identified
|
||||
in your puzzle input all the way to the access port?</p>
|
||||
<div class="section" id="analysis">
|
||||
<h3>Analysis<a class="headerlink" href="#analysis" title="Permalink to this headline">¶</a></h3>
|
||||
<p>I freely admit that I worked out the program I wanted to write using
|
||||
graph paper and some Python doodles. There’s no point in trying to write
|
||||
a Joy program until I’m sure I understand the problem well enough.</p>
|
||||
<p>The first thing I did was to write a column of numbers from 1 to n (32
|
||||
as it happens) and next to them the desired output number, to look for
|
||||
patterns directly:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="mi">0</span>
|
||||
<span class="mi">2</span> <span class="mi">1</span>
|
||||
<span class="mi">3</span> <span class="mi">2</span>
|
||||
<span class="mi">4</span> <span class="mi">1</span>
|
||||
<span class="mi">5</span> <span class="mi">2</span>
|
||||
<span class="mi">6</span> <span class="mi">1</span>
|
||||
<span class="mi">7</span> <span class="mi">2</span>
|
||||
<span class="mi">8</span> <span class="mi">1</span>
|
||||
<span class="mi">9</span> <span class="mi">2</span>
|
||||
<span class="mi">10</span> <span class="mi">3</span>
|
||||
<span class="mi">11</span> <span class="mi">2</span>
|
||||
<span class="mi">12</span> <span class="mi">3</span>
|
||||
<span class="mi">13</span> <span class="mi">4</span>
|
||||
<span class="mi">14</span> <span class="mi">3</span>
|
||||
<span class="mi">15</span> <span class="mi">2</span>
|
||||
<span class="mi">16</span> <span class="mi">3</span>
|
||||
<span class="mi">17</span> <span class="mi">4</span>
|
||||
<span class="mi">18</span> <span class="mi">3</span>
|
||||
<span class="mi">19</span> <span class="mi">2</span>
|
||||
<span class="mi">20</span> <span class="mi">3</span>
|
||||
<span class="mi">21</span> <span class="mi">4</span>
|
||||
<span class="mi">22</span> <span class="mi">3</span>
|
||||
<span class="mi">23</span> <span class="mi">2</span>
|
||||
<span class="mi">24</span> <span class="mi">3</span>
|
||||
<span class="mi">25</span> <span class="mi">4</span>
|
||||
<span class="mi">26</span> <span class="mi">5</span>
|
||||
<span class="mi">27</span> <span class="mi">4</span>
|
||||
<span class="mi">28</span> <span class="mi">3</span>
|
||||
<span class="mi">29</span> <span class="mi">4</span>
|
||||
<span class="mi">30</span> <span class="mi">5</span>
|
||||
<span class="mi">31</span> <span class="mi">6</span>
|
||||
<span class="mi">32</span> <span class="mi">5</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>There are four groups repeating for a given “rank”, then the pattern
|
||||
enlarges and four groups repeat again, etc.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="mi">1</span> <span class="mi">2</span>
|
||||
<span class="mi">3</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span>
|
||||
<span class="mi">5</span> <span class="mi">4</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span>
|
||||
<span class="mi">7</span> <span class="mi">6</span> <span class="mi">5</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span> <span class="mi">8</span>
|
||||
<span class="mi">9</span> <span class="mi">8</span> <span class="mi">7</span> <span class="mi">6</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span> <span class="mi">8</span> <span class="mi">9</span> <span class="mi">10</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Four of this pyramid interlock to tile the plane extending from the
|
||||
initial “1” square.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="mi">2</span> <span class="mi">3</span> <span class="o">|</span> <span class="mi">4</span> <span class="mi">5</span> <span class="o">|</span> <span class="mi">6</span> <span class="mi">7</span> <span class="o">|</span> <span class="mi">8</span> <span class="mi">9</span>
|
||||
<span class="mi">10</span> <span class="mi">11</span> <span class="mi">12</span> <span class="mi">13</span><span class="o">|</span><span class="mi">14</span> <span class="mi">15</span> <span class="mi">16</span> <span class="mi">17</span><span class="o">|</span><span class="mi">18</span> <span class="mi">19</span> <span class="mi">20</span> <span class="mi">21</span><span class="o">|</span><span class="mi">22</span> <span class="mi">23</span> <span class="mi">24</span> <span class="mi">25</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>And so on.</p>
|
||||
<p>We can figure out the pattern for a row of the pyramid at a given “rank”
|
||||
<span class="math notranslate nohighlight">\(k\)</span>:</p>
|
||||
<p><span class="math notranslate nohighlight">\(2k - 1, 2k - 2, ..., k, k + 1, k + 2, ..., 2k\)</span></p>
|
||||
<p>or</p>
|
||||
<p><span class="math notranslate nohighlight">\(k + (k - 1), k + (k - 2), ..., k, k + 1, k + 2, ..., k + k\)</span></p>
|
||||
<p>This shows that the series consists at each place of <span class="math notranslate nohighlight">\(k\)</span> plus some
|
||||
number that begins at <span class="math notranslate nohighlight">\(k - 1\)</span>, decreases to zero, then increases
|
||||
to <span class="math notranslate nohighlight">\(k\)</span>. Each row has <span class="math notranslate nohighlight">\(2k\)</span> members.</p>
|
||||
<p>Let’s figure out how, given an index into a row, we can calculate the
|
||||
value there. The index will be from 0 to <span class="math notranslate nohighlight">\(k - 1\)</span>.</p>
|
||||
<p>Let’s look at an example, with <span class="math notranslate nohighlight">\(k = 4\)</span>:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span>
|
||||
<span class="mi">7</span> <span class="mi">6</span> <span class="mi">5</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span> <span class="mi">8</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">k</span> <span class="o">=</span> <span class="mi">4</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Subtract <span class="math notranslate nohighlight">\(k\)</span> from the index and take the absolute value:</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">k</span><span class="p">):</span>
|
||||
<span class="nb">print</span> <span class="nb">abs</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="n">k</span><span class="p">),</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">4</span> <span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Not quite. Subtract <span class="math notranslate nohighlight">\(k - 1\)</span> from the index and take the absolute
|
||||
value:</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">k</span><span class="p">):</span>
|
||||
<span class="nb">print</span> <span class="nb">abs</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)),</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span> <span class="mi">2</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Great, now add <span class="math notranslate nohighlight">\(k\)</span>…</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">k</span><span class="p">):</span>
|
||||
<span class="nb">print</span> <span class="nb">abs</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="n">k</span><span class="p">,</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">7</span> <span class="mi">6</span> <span class="mi">5</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span> <span class="mi">8</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>So to write a function that can give us the value of a row at a given
|
||||
index:</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">row_value</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
|
||||
<span class="n">i</span> <span class="o">%=</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">k</span><span class="p">)</span> <span class="c1"># wrap the index at the row boundary.</span>
|
||||
<span class="k">return</span> <span class="nb">abs</span><span class="p">(</span><span class="n">i</span> <span class="o">-</span> <span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="n">k</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">k</span> <span class="o">=</span> <span class="mi">5</span>
|
||||
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">k</span><span class="p">):</span>
|
||||
<span class="nb">print</span> <span class="n">row_value</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">i</span><span class="p">),</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">9</span> <span class="mi">8</span> <span class="mi">7</span> <span class="mi">6</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span> <span class="mi">8</span> <span class="mi">9</span> <span class="mi">10</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>(I’m leaving out details of how I figured this all out and just giving
|
||||
the relevent bits. It took a little while to zero in of the aspects of
|
||||
the pattern that were important for the task.)</p>
|
||||
</div>
|
||||
<div class="section" id="finding-the-rank-and-offset-of-a-number">
|
||||
<h3>Finding the rank and offset of a number.<a class="headerlink" href="#finding-the-rank-and-offset-of-a-number" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Now that we can compute the desired output value for a given rank and
|
||||
the offset (index) into that rank, we need to determine how to find the
|
||||
rank and offset of a number.</p>
|
||||
<p>The rank is easy to find by iteratively stripping off the amount already
|
||||
covered by previous ranks until you find the one that brackets the
|
||||
target number. Because each row is <span class="math notranslate nohighlight">\(2k\)</span> places and there are
|
||||
<span class="math notranslate nohighlight">\(4\)</span> per rank each rank contains <span class="math notranslate nohighlight">\(8k\)</span> places. Counting the
|
||||
initial square we have:</p>
|
||||
<p><span class="math notranslate nohighlight">\(corner_k = 1 + \sum_{n=1}^k 8n\)</span></p>
|
||||
<p>I’m not mathematically sophisticated enough to turn this directly into a
|
||||
formula (but Sympy is, see below.) I’m going to write a simple Python
|
||||
function to iterate and search:</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">rank_and_offset</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
|
||||
<span class="k">assert</span> <span class="n">n</span> <span class="o">>=</span> <span class="mi">2</span> <span class="c1"># Guard the domain.</span>
|
||||
<span class="n">n</span> <span class="o">-=</span> <span class="mi">2</span> <span class="c1"># Subtract two,</span>
|
||||
<span class="c1"># one for the initial square,</span>
|
||||
<span class="c1"># and one because we are counting from 1 instead of 0.</span>
|
||||
<span class="n">k</span> <span class="o">=</span> <span class="mi">1</span>
|
||||
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
||||
<span class="n">m</span> <span class="o">=</span> <span class="mi">8</span> <span class="o">*</span> <span class="n">k</span> <span class="c1"># The number of places total in this rank, 4(2k).</span>
|
||||
<span class="k">if</span> <span class="n">n</span> <span class="o"><</span> <span class="n">m</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="n">k</span><span class="p">,</span> <span class="n">n</span> <span class="o">%</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">k</span><span class="p">)</span>
|
||||
<span class="n">n</span> <span class="o">-=</span> <span class="n">m</span> <span class="c1"># Remove this rank's worth.</span>
|
||||
<span class="n">k</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">51</span><span class="p">):</span>
|
||||
<span class="nb">print</span> <span class="n">n</span><span class="p">,</span> <span class="n">rank_and_offset</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
<span class="mi">3</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
<span class="mi">4</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
<span class="mi">5</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
<span class="mi">6</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
<span class="mi">7</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
<span class="mi">8</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
<span class="mi">9</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
<span class="mi">10</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
<span class="mi">11</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
<span class="mi">12</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
|
||||
<span class="mi">13</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
|
||||
<span class="mi">14</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
<span class="mi">15</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
<span class="mi">16</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
|
||||
<span class="mi">17</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
|
||||
<span class="mi">18</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
<span class="mi">19</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
<span class="mi">20</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
|
||||
<span class="mi">21</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
|
||||
<span class="mi">22</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
<span class="mi">23</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
<span class="mi">24</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
|
||||
<span class="mi">25</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
|
||||
<span class="mi">26</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
<span class="mi">27</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
<span class="mi">28</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
|
||||
<span class="mi">29</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
|
||||
<span class="mi">30</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
|
||||
<span class="mi">31</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
|
||||
<span class="mi">32</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
<span class="mi">33</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
<span class="mi">34</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
|
||||
<span class="mi">35</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
|
||||
<span class="mi">36</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
|
||||
<span class="mi">37</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
|
||||
<span class="mi">38</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
<span class="mi">39</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
<span class="mi">40</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
|
||||
<span class="mi">41</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
|
||||
<span class="mi">42</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
|
||||
<span class="mi">43</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
|
||||
<span class="mi">44</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
<span class="mi">45</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||
<span class="mi">46</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
|
||||
<span class="mi">47</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
|
||||
<span class="mi">48</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
|
||||
<span class="mi">49</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
|
||||
<span class="mi">50</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">51</span><span class="p">):</span>
|
||||
<span class="n">k</span><span class="p">,</span> <span class="n">i</span> <span class="o">=</span> <span class="n">rank_and_offset</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
|
||||
<span class="nb">print</span> <span class="n">n</span><span class="p">,</span> <span class="n">row_value</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span> <span class="mi">1</span>
|
||||
<span class="mi">3</span> <span class="mi">2</span>
|
||||
<span class="mi">4</span> <span class="mi">1</span>
|
||||
<span class="mi">5</span> <span class="mi">2</span>
|
||||
<span class="mi">6</span> <span class="mi">1</span>
|
||||
<span class="mi">7</span> <span class="mi">2</span>
|
||||
<span class="mi">8</span> <span class="mi">1</span>
|
||||
<span class="mi">9</span> <span class="mi">2</span>
|
||||
<span class="mi">10</span> <span class="mi">3</span>
|
||||
<span class="mi">11</span> <span class="mi">2</span>
|
||||
<span class="mi">12</span> <span class="mi">3</span>
|
||||
<span class="mi">13</span> <span class="mi">4</span>
|
||||
<span class="mi">14</span> <span class="mi">3</span>
|
||||
<span class="mi">15</span> <span class="mi">2</span>
|
||||
<span class="mi">16</span> <span class="mi">3</span>
|
||||
<span class="mi">17</span> <span class="mi">4</span>
|
||||
<span class="mi">18</span> <span class="mi">3</span>
|
||||
<span class="mi">19</span> <span class="mi">2</span>
|
||||
<span class="mi">20</span> <span class="mi">3</span>
|
||||
<span class="mi">21</span> <span class="mi">4</span>
|
||||
<span class="mi">22</span> <span class="mi">3</span>
|
||||
<span class="mi">23</span> <span class="mi">2</span>
|
||||
<span class="mi">24</span> <span class="mi">3</span>
|
||||
<span class="mi">25</span> <span class="mi">4</span>
|
||||
<span class="mi">26</span> <span class="mi">5</span>
|
||||
<span class="mi">27</span> <span class="mi">4</span>
|
||||
<span class="mi">28</span> <span class="mi">3</span>
|
||||
<span class="mi">29</span> <span class="mi">4</span>
|
||||
<span class="mi">30</span> <span class="mi">5</span>
|
||||
<span class="mi">31</span> <span class="mi">6</span>
|
||||
<span class="mi">32</span> <span class="mi">5</span>
|
||||
<span class="mi">33</span> <span class="mi">4</span>
|
||||
<span class="mi">34</span> <span class="mi">3</span>
|
||||
<span class="mi">35</span> <span class="mi">4</span>
|
||||
<span class="mi">36</span> <span class="mi">5</span>
|
||||
<span class="mi">37</span> <span class="mi">6</span>
|
||||
<span class="mi">38</span> <span class="mi">5</span>
|
||||
<span class="mi">39</span> <span class="mi">4</span>
|
||||
<span class="mi">40</span> <span class="mi">3</span>
|
||||
<span class="mi">41</span> <span class="mi">4</span>
|
||||
<span class="mi">42</span> <span class="mi">5</span>
|
||||
<span class="mi">43</span> <span class="mi">6</span>
|
||||
<span class="mi">44</span> <span class="mi">5</span>
|
||||
<span class="mi">45</span> <span class="mi">4</span>
|
||||
<span class="mi">46</span> <span class="mi">3</span>
|
||||
<span class="mi">47</span> <span class="mi">4</span>
|
||||
<span class="mi">48</span> <span class="mi">5</span>
|
||||
<span class="mi">49</span> <span class="mi">6</span>
|
||||
<span class="mi">50</span> <span class="mi">7</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="putting-it-all-together">
|
||||
<h3>Putting it all together<a class="headerlink" href="#putting-it-all-together" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">row_value</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="nb">abs</span><span class="p">(</span><span class="n">i</span> <span class="o">-</span> <span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="n">k</span>
|
||||
|
||||
|
||||
<span class="k">def</span> <span class="nf">rank_and_offset</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
|
||||
<span class="n">n</span> <span class="o">-=</span> <span class="mi">2</span> <span class="c1"># Subtract two,</span>
|
||||
<span class="c1"># one for the initial square,</span>
|
||||
<span class="c1"># and one because we are counting from 1 instead of 0.</span>
|
||||
<span class="n">k</span> <span class="o">=</span> <span class="mi">1</span>
|
||||
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
||||
<span class="n">m</span> <span class="o">=</span> <span class="mi">8</span> <span class="o">*</span> <span class="n">k</span> <span class="c1"># The number of places total in this rank, 4(2k).</span>
|
||||
<span class="k">if</span> <span class="n">n</span> <span class="o"><</span> <span class="n">m</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="n">k</span><span class="p">,</span> <span class="n">n</span> <span class="o">%</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">k</span><span class="p">)</span>
|
||||
<span class="n">n</span> <span class="o">-=</span> <span class="n">m</span> <span class="c1"># Remove this rank's worth.</span>
|
||||
<span class="n">k</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
|
||||
|
||||
<span class="k">def</span> <span class="nf">aoc20173</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
|
||||
<span class="k">if</span> <span class="n">n</span> <span class="o"><=</span> <span class="mi">1</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="mi">0</span>
|
||||
<span class="n">k</span><span class="p">,</span> <span class="n">i</span> <span class="o">=</span> <span class="n">rank_and_offset</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">row_value</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">aoc20173</span><span class="p">(</span><span class="mi">23</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>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">aoc20173</span><span class="p">(</span><span class="mi">23000</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">105</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">aoc20173</span><span class="p">(</span><span class="mi">23000000000000</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">4572225</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="sympy-to-the-rescue">
|
||||
<h1>Sympy to the Rescue<a class="headerlink" href="#sympy-to-the-rescue" title="Permalink to this headline">¶</a></h1>
|
||||
<p>Using e.g. Sympy we can find the rank directly by solving for the roots
|
||||
of an equation. For large numbers this will (eventually) be faster than
|
||||
iterating as <code class="docutils literal notranslate"><span class="pre">rank_and_offset()</span></code> does.</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sympy</span> <span class="k">import</span> <span class="n">floor</span><span class="p">,</span> <span class="n">lambdify</span><span class="p">,</span> <span class="n">solve</span><span class="p">,</span> <span class="n">symbols</span>
|
||||
<span class="kn">from</span> <span class="nn">sympy</span> <span class="k">import</span> <span class="n">init_printing</span>
|
||||
<span class="n">init_printing</span><span class="p">()</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">k</span> <span class="o">=</span> <span class="n">symbols</span><span class="p">(</span><span class="s1">'k'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Since</p>
|
||||
<p><span class="math notranslate nohighlight">\(1 + 2 + 3 + ... + N = \frac{N(N + 1)}{2}\)</span></p>
|
||||
<p>and</p>
|
||||
<p><span class="math notranslate nohighlight">\(\sum_{n=1}^k 8n = 8(\sum_{n=1}^k n) = 8\frac{k(k + 1)}{2}\)</span></p>
|
||||
<p>We want:</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">E</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">8</span> <span class="o">*</span> <span class="n">k</span> <span class="o">*</span> <span class="p">(</span><span class="n">k</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span> <span class="c1"># For the reason for adding 2 see above.</span>
|
||||
|
||||
<span class="n">E</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="math notranslate nohighlight">
|
||||
\[4 k \left(k + 1\right) + 2\]</div>
|
||||
<p>We can write a function to solve for <span class="math notranslate nohighlight">\(k\)</span> given some <span class="math notranslate nohighlight">\(n\)</span>…</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">rank_of</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="n">floor</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="n">solve</span><span class="p">(</span><span class="n">E</span> <span class="o">-</span> <span class="n">n</span><span class="p">,</span> <span class="n">k</span><span class="p">)))</span> <span class="o">+</span> <span class="mi">1</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>First <code class="docutils literal notranslate"><span class="pre">solve()</span></code> for <span class="math notranslate nohighlight">\(E - n = 0\)</span> which has two solutions (because
|
||||
the equation is quadratic so it has two roots) and since we only care
|
||||
about the larger one we use <code class="docutils literal notranslate"><span class="pre">max()</span></code> to select it. It will generally
|
||||
not be a nice integer (unless <span class="math notranslate nohighlight">\(n\)</span> is the number of an end-corner
|
||||
of a rank) so we take the <code class="docutils literal notranslate"><span class="pre">floor()</span></code> and add 1 to get the integer rank
|
||||
of <span class="math notranslate nohighlight">\(n\)</span>. (Taking the <code class="docutils literal notranslate"><span class="pre">ceiling()</span></code> gives off-by-one errors on the
|
||||
rank boundaries. I don’t know why. I’m basically like a monkey doing
|
||||
math here.) =-D</p>
|
||||
<p>It gives correct answers:</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">9</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">49</span><span class="p">,</span> <span class="mi">50</span><span class="p">):</span>
|
||||
<span class="nb">print</span> <span class="n">n</span><span class="p">,</span> <span class="n">rank_of</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">9</span> <span class="mi">1</span>
|
||||
<span class="mi">10</span> <span class="mi">2</span>
|
||||
<span class="mi">25</span> <span class="mi">2</span>
|
||||
<span class="mi">26</span> <span class="mi">3</span>
|
||||
<span class="mi">49</span> <span class="mi">3</span>
|
||||
<span class="mi">50</span> <span class="mi">4</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>And it runs much faster (at least for large numbers):</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">%</span><span class="n">time</span> <span class="n">rank_of</span><span class="p">(</span><span class="mi">23000000000000</span><span class="p">)</span> <span class="c1"># Compare runtime with rank_and_offset()!</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">CPU</span> <span class="n">times</span><span class="p">:</span> <span class="n">user</span> <span class="mi">68</span> <span class="n">ms</span><span class="p">,</span> <span class="n">sys</span><span class="p">:</span> <span class="mi">8</span> <span class="n">ms</span><span class="p">,</span> <span class="n">total</span><span class="p">:</span> <span class="mi">76</span> <span class="n">ms</span>
|
||||
<span class="n">Wall</span> <span class="n">time</span><span class="p">:</span> <span class="mf">73.8</span> <span class="n">ms</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="math notranslate nohighlight">
|
||||
\[2397916\]</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">%</span><span class="n">time</span> <span class="n">rank_and_offset</span><span class="p">(</span><span class="mi">23000000000000</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">CPU</span> <span class="n">times</span><span class="p">:</span> <span class="n">user</span> <span class="mi">308</span> <span class="n">ms</span><span class="p">,</span> <span class="n">sys</span><span class="p">:</span> <span class="mi">0</span> <span class="n">ns</span><span class="p">,</span> <span class="n">total</span><span class="p">:</span> <span class="mi">308</span> <span class="n">ms</span>
|
||||
<span class="n">Wall</span> <span class="n">time</span><span class="p">:</span> <span class="mi">306</span> <span class="n">ms</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="math notranslate nohighlight">
|
||||
\[\left ( 2397916, \quad 223606\right )\]</div>
|
||||
<p>After finding the rank you would still have to find the actual value of
|
||||
the rank’s first corner and subtract it (plus 2) from the number and
|
||||
compute the offset as above and then the final output, but this overhead
|
||||
is partially shared by the other method, and overshadowed by the time it
|
||||
(the other iterative method) would take for really big inputs.</p>
|
||||
<p>The fun thing to do here would be to graph the actual runtime of both
|
||||
methods against each other to find the trade-off point.</p>
|
||||
<p>Sympy is a <em>symbolic</em> math library, and it supports symbolic
|
||||
manipulation of equations. I can put in <span class="math notranslate nohighlight">\(y\)</span> (instead of a value)
|
||||
and ask it to solve for <span class="math notranslate nohighlight">\(k\)</span>.</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">y</span> <span class="o">=</span> <span class="n">symbols</span><span class="p">(</span><span class="s1">'y'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">g</span><span class="p">,</span> <span class="n">f</span> <span class="o">=</span> <span class="n">solve</span><span class="p">(</span><span class="n">E</span> <span class="o">-</span> <span class="n">y</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>The equation is quadratic so there are two roots, we are interested in
|
||||
the greater one…</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">g</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="math notranslate nohighlight">
|
||||
\[- \frac{1}{2} \sqrt{y - 1} - \frac{1}{2}\]</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">f</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="math notranslate nohighlight">
|
||||
\[\frac{1}{2} \sqrt{y - 1} - \frac{1}{2}\]</div>
|
||||
<p>Now we can take the <code class="docutils literal notranslate"><span class="pre">floor()</span></code>, add 1, and <code class="docutils literal notranslate"><span class="pre">lambdify()</span></code> the equation
|
||||
to get a Python function that calculates the rank directly.</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">floor</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="math notranslate nohighlight">
|
||||
\[\lfloor{\frac{1}{2} \sqrt{y - 1} - \frac{1}{2}}\rfloor + 1\]</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">F</span> <span class="o">=</span> <span class="n">lambdify</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">floor</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">9</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">49</span><span class="p">,</span> <span class="mi">50</span><span class="p">):</span>
|
||||
<span class="nb">print</span> <span class="n">n</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">F</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">9</span> <span class="mi">1</span>
|
||||
<span class="mi">10</span> <span class="mi">2</span>
|
||||
<span class="mi">25</span> <span class="mi">2</span>
|
||||
<span class="mi">26</span> <span class="mi">3</span>
|
||||
<span class="mi">49</span> <span class="mi">3</span>
|
||||
<span class="mi">50</span> <span class="mi">4</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>It’s pretty fast.</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">%</span><span class="n">time</span> <span class="nb">int</span><span class="p">(</span><span class="n">F</span><span class="p">(</span><span class="mi">23000000000000</span><span class="p">))</span> <span class="c1"># The clear winner.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">CPU</span> <span class="n">times</span><span class="p">:</span> <span class="n">user</span> <span class="mi">0</span> <span class="n">ns</span><span class="p">,</span> <span class="n">sys</span><span class="p">:</span> <span class="mi">0</span> <span class="n">ns</span><span class="p">,</span> <span class="n">total</span><span class="p">:</span> <span class="mi">0</span> <span class="n">ns</span>
|
||||
<span class="n">Wall</span> <span class="n">time</span><span class="p">:</span> <span class="mf">11.9</span> <span class="n">µs</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="math notranslate nohighlight">
|
||||
\[2397916\]</div>
|
||||
<p>Knowing the equation we could write our own function manually, but the
|
||||
speed is no better.</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">math</span> <span class="k">import</span> <span class="n">floor</span> <span class="k">as</span> <span class="n">mfloor</span><span class="p">,</span> <span class="n">sqrt</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">mrank_of</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">mfloor</span><span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">23000000000000</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">%</span><span class="n">time</span> <span class="n">mrank_of</span><span class="p">(</span><span class="mi">23000000000000</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">CPU</span> <span class="n">times</span><span class="p">:</span> <span class="n">user</span> <span class="mi">0</span> <span class="n">ns</span><span class="p">,</span> <span class="n">sys</span><span class="p">:</span> <span class="mi">0</span> <span class="n">ns</span><span class="p">,</span> <span class="n">total</span><span class="p">:</span> <span class="mi">0</span> <span class="n">ns</span>
|
||||
<span class="n">Wall</span> <span class="n">time</span><span class="p">:</span> <span class="mf">12.9</span> <span class="n">µs</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="math notranslate nohighlight">
|
||||
\[2397916\]</div>
|
||||
<p>Now that we have a fast way to get the rank, we still need to use it to
|
||||
compute the offset into a pyramid row.</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">offset_of</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">k</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">k</span> <span class="o">*</span> <span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> <span class="o">%</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">k</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>(Note the sneaky way the sign changes from <span class="math notranslate nohighlight">\(k(k + 1)\)</span> to
|
||||
<span class="math notranslate nohighlight">\(k(k - 1)\)</span>. This is because we want to subract the
|
||||
<span class="math notranslate nohighlight">\((k - 1)\)</span>th rank’s total places (its own and those of lesser
|
||||
rank) from our <span class="math notranslate nohighlight">\(n\)</span> of rank <span class="math notranslate nohighlight">\(k\)</span>. Substituting <span class="math notranslate nohighlight">\(k - 1\)</span>
|
||||
for <span class="math notranslate nohighlight">\(k\)</span> in <span class="math notranslate nohighlight">\(k(k + 1)\)</span> gives <span class="math notranslate nohighlight">\((k - 1)(k - 1 + 1)\)</span>,
|
||||
which of course simplifies to <span class="math notranslate nohighlight">\(k(k - 1)\)</span>.)</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">offset_of</span><span class="p">(</span><span class="mi">23000000000000</span><span class="p">,</span> <span class="mi">2397916</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="math notranslate nohighlight">
|
||||
\[223606\]</div>
|
||||
<p>So, we can compute the rank, then the offset, then the row value.</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">rank_of</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">mfloor</span><span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
|
||||
|
||||
|
||||
<span class="k">def</span> <span class="nf">offset_of</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">k</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">k</span> <span class="o">*</span> <span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> <span class="o">%</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">k</span><span class="p">)</span>
|
||||
|
||||
|
||||
<span class="k">def</span> <span class="nf">row_value</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="nb">abs</span><span class="p">(</span><span class="n">i</span> <span class="o">-</span> <span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="n">k</span>
|
||||
|
||||
|
||||
<span class="k">def</span> <span class="nf">aoc20173</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
|
||||
<span class="n">k</span> <span class="o">=</span> <span class="n">rank_of</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
|
||||
<span class="n">i</span> <span class="o">=</span> <span class="n">offset_of</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">row_value</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">aoc20173</span><span class="p">(</span><span class="mi">23</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="math notranslate nohighlight">
|
||||
\[2\]</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">aoc20173</span><span class="p">(</span><span class="mi">23000</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="math notranslate nohighlight">
|
||||
\[105\]</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">aoc20173</span><span class="p">(</span><span class="mi">23000000000000</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="math notranslate nohighlight">
|
||||
\[4572225\]</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">%</span><span class="n">time</span> <span class="n">aoc20173</span><span class="p">(</span><span class="mi">23000000000000000000000000</span><span class="p">)</span> <span class="c1"># Fast for large values.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">CPU</span> <span class="n">times</span><span class="p">:</span> <span class="n">user</span> <span class="mi">0</span> <span class="n">ns</span><span class="p">,</span> <span class="n">sys</span><span class="p">:</span> <span class="mi">0</span> <span class="n">ns</span><span class="p">,</span> <span class="n">total</span><span class="p">:</span> <span class="mi">0</span> <span class="n">ns</span>
|
||||
<span class="n">Wall</span> <span class="n">time</span><span class="p">:</span> <span class="mi">20</span> <span class="n">µs</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="math notranslate nohighlight">
|
||||
\[2690062495969\]</div>
|
||||
</div>
|
||||
<div class="section" id="a-joy-version">
|
||||
<h1>A Joy Version<a class="headerlink" href="#a-joy-version" title="Permalink to this headline">¶</a></h1>
|
||||
<p>At this point I feel confident that I can implement a concise version of
|
||||
this code in Joy. ;-)</p>
|
||||
<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>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">n</span> <span class="n">rank_of</span>
|
||||
<span class="o">---------------</span>
|
||||
<span class="n">k</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>The translation is straightforward.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="nb">int</span><span class="p">(</span><span class="n">floor</span><span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
|
||||
|
||||
<span class="n">rank_of</span> <span class="o">==</span> <span class="o">--</span> <span class="n">sqrt</span> <span class="mi">2</span> <span class="o">/</span> <span class="mf">0.5</span> <span class="o">-</span> <span class="n">floor</span> <span class="o">++</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">'rank_of == -- sqrt 2 / 0.5 - floor ++'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">n</span> <span class="n">k</span> <span class="n">offset_of</span>
|
||||
<span class="o">-------------------</span>
|
||||
<span class="n">i</span>
|
||||
|
||||
<span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">k</span> <span class="o">*</span> <span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> <span class="o">%</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">k</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>A little tricky…</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">n</span> <span class="n">k</span> <span class="n">dup</span> <span class="mi">2</span> <span class="o">*</span>
|
||||
<span class="n">n</span> <span class="n">k</span> <span class="n">k</span> <span class="mi">2</span> <span class="o">*</span>
|
||||
<span class="n">n</span> <span class="n">k</span> <span class="n">k</span><span class="o">*</span><span class="mi">2</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">dip</span> <span class="o">%</span>
|
||||
<span class="n">n</span> <span class="n">k</span> <span class="n">Q</span> <span class="n">k</span><span class="o">*</span><span class="mi">2</span> <span class="o">%</span>
|
||||
|
||||
<span class="n">n</span> <span class="n">k</span> <span class="n">dup</span> <span class="o">--</span>
|
||||
<span class="n">n</span> <span class="n">k</span> <span class="n">k</span> <span class="o">--</span>
|
||||
<span class="n">n</span> <span class="n">k</span> <span class="n">k</span><span class="o">-</span><span class="mi">1</span> <span class="mi">4</span> <span class="o">*</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span>
|
||||
<span class="n">n</span> <span class="n">k</span><span class="o">*</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="o">*</span><span class="mi">4</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span>
|
||||
<span class="n">n</span> <span class="n">k</span><span class="o">*</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="o">*</span><span class="mi">4</span><span class="o">+</span><span class="mi">2</span> <span class="o">-</span>
|
||||
<span class="n">n</span><span class="o">-</span><span class="n">k</span><span class="o">*</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="o">*</span><span class="mi">4</span><span class="o">+</span><span class="mi">2</span>
|
||||
|
||||
<span class="n">n</span><span class="o">-</span><span class="n">k</span><span class="o">*</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="o">*</span><span class="mi">4</span><span class="o">+</span><span class="mi">2</span> <span class="n">k</span><span class="o">*</span><span class="mi">2</span> <span class="o">%</span>
|
||||
<span class="n">n</span><span class="o">-</span><span class="n">k</span><span class="o">*</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="o">*</span><span class="mi">4</span><span class="o">+</span><span class="mi">2</span><span class="o">%</span><span class="n">k</span><span class="o">*</span><span class="mi">2</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Ergo:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">offset_of</span> <span class="o">==</span> <span class="n">dup</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">[</span><span class="n">dup</span> <span class="o">--</span> <span class="mi">4</span> <span class="o">*</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span><span class="p">]</span> <span class="n">dip</span> <span class="o">%</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">'offset_of == dup 2 * [dup -- 4 * * 2 + -] dip %'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">k</span> <span class="n">i</span> <span class="n">row_value</span>
|
||||
<span class="o">-------------------</span>
|
||||
<span class="n">n</span>
|
||||
|
||||
<span class="nb">abs</span><span class="p">(</span><span class="n">i</span> <span class="o">-</span> <span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="n">k</span>
|
||||
|
||||
<span class="n">k</span> <span class="n">i</span> <span class="n">over</span> <span class="o">--</span> <span class="o">-</span> <span class="nb">abs</span> <span class="o">+</span>
|
||||
<span class="n">k</span> <span class="n">i</span> <span class="n">k</span> <span class="o">--</span> <span class="o">-</span> <span class="nb">abs</span> <span class="o">+</span>
|
||||
<span class="n">k</span> <span class="n">i</span> <span class="n">k</span><span class="o">-</span><span class="mi">1</span> <span class="o">-</span> <span class="nb">abs</span> <span class="o">+</span>
|
||||
<span class="n">k</span> <span class="n">i</span><span class="o">-</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span> <span class="nb">abs</span> <span class="o">+</span>
|
||||
<span class="n">k</span> <span class="o">|</span><span class="n">i</span><span class="o">-</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="o">|</span> <span class="o">+</span>
|
||||
<span class="n">k</span><span class="o">+|</span><span class="n">i</span><span class="o">-</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="o">|</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">'row_value == over -- - abs +'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">n</span> <span class="n">aoc2017</span><span class="o">.</span><span class="mi">3</span>
|
||||
<span class="o">-----------------</span>
|
||||
<span class="n">m</span>
|
||||
|
||||
<span class="n">n</span> <span class="n">dup</span> <span class="n">rank_of</span>
|
||||
<span class="n">n</span> <span class="n">k</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="n">dupdip</span>
|
||||
<span class="n">n</span> <span class="n">k</span> <span class="n">offset_of</span> <span class="n">k</span>
|
||||
<span class="n">i</span> <span class="n">k</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="n">k</span> <span class="n">i</span> <span class="n">row_value</span>
|
||||
<span class="n">m</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">'aoc2017.3 == dup rank_of [offset_of] dupdip swap row_value'</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">'23 aoc2017.3'</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>
|
||||
<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">'23000 aoc2017.3'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">105</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">'23000000000000 aoc2017.3'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="o">.</span> <span class="mi">23000000000000</span> <span class="n">aoc2017</span><span class="o">.</span><span class="mi">3</span>
|
||||
<span class="mi">23000000000000</span> <span class="o">.</span> <span class="n">aoc2017</span><span class="o">.</span><span class="mi">3</span>
|
||||
<span class="mi">23000000000000</span> <span class="o">.</span> <span class="n">dup</span> <span class="n">rank_of</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">23000000000000</span> <span class="o">.</span> <span class="n">rank_of</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">23000000000000</span> <span class="o">.</span> <span class="o">--</span> <span class="n">sqrt</span> <span class="mi">2</span> <span class="o">/</span> <span class="mf">0.5</span> <span class="o">-</span> <span class="n">floor</span> <span class="o">++</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">22999999999999</span> <span class="o">.</span> <span class="n">sqrt</span> <span class="mi">2</span> <span class="o">/</span> <span class="mf">0.5</span> <span class="o">-</span> <span class="n">floor</span> <span class="o">++</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mf">4795831.523312615</span> <span class="o">.</span> <span class="mi">2</span> <span class="o">/</span> <span class="mf">0.5</span> <span class="o">-</span> <span class="n">floor</span> <span class="o">++</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mf">4795831.523312615</span> <span class="mi">2</span> <span class="o">.</span> <span class="o">/</span> <span class="mf">0.5</span> <span class="o">-</span> <span class="n">floor</span> <span class="o">++</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mf">2397915.7616563076</span> <span class="o">.</span> <span class="mf">0.5</span> <span class="o">-</span> <span class="n">floor</span> <span class="o">++</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mf">2397915.7616563076</span> <span class="mf">0.5</span> <span class="o">.</span> <span class="o">-</span> <span class="n">floor</span> <span class="o">++</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mf">2397915.2616563076</span> <span class="o">.</span> <span class="n">floor</span> <span class="o">++</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397915</span> <span class="o">.</span> <span class="o">++</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397916</span> <span class="o">.</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397916</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="o">.</span> <span class="n">dupdip</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397916</span> <span class="o">.</span> <span class="n">offset_of</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397916</span> <span class="o">.</span> <span class="n">dup</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">[</span><span class="n">dup</span> <span class="o">--</span> <span class="mi">4</span> <span class="o">*</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span><span class="p">]</span> <span class="n">dip</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397916</span> <span class="mi">2397916</span> <span class="o">.</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">[</span><span class="n">dup</span> <span class="o">--</span> <span class="mi">4</span> <span class="o">*</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span><span class="p">]</span> <span class="n">dip</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397916</span> <span class="mi">2397916</span> <span class="mi">2</span> <span class="o">.</span> <span class="o">*</span> <span class="p">[</span><span class="n">dup</span> <span class="o">--</span> <span class="mi">4</span> <span class="o">*</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span><span class="p">]</span> <span class="n">dip</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397916</span> <span class="mi">4795832</span> <span class="o">.</span> <span class="p">[</span><span class="n">dup</span> <span class="o">--</span> <span class="mi">4</span> <span class="o">*</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span><span class="p">]</span> <span class="n">dip</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397916</span> <span class="mi">4795832</span> <span class="p">[</span><span class="n">dup</span> <span class="o">--</span> <span class="mi">4</span> <span class="o">*</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span><span class="p">]</span> <span class="o">.</span> <span class="n">dip</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397916</span> <span class="o">.</span> <span class="n">dup</span> <span class="o">--</span> <span class="mi">4</span> <span class="o">*</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span> <span class="mi">4795832</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397916</span> <span class="mi">2397916</span> <span class="o">.</span> <span class="o">--</span> <span class="mi">4</span> <span class="o">*</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span> <span class="mi">4795832</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397916</span> <span class="mi">2397915</span> <span class="o">.</span> <span class="mi">4</span> <span class="o">*</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span> <span class="mi">4795832</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397916</span> <span class="mi">2397915</span> <span class="mi">4</span> <span class="o">.</span> <span class="o">*</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span> <span class="mi">4795832</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">2397916</span> <span class="mi">9591660</span> <span class="o">.</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span> <span class="mi">4795832</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">22999994980560</span> <span class="o">.</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span> <span class="mi">4795832</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">22999994980560</span> <span class="mi">2</span> <span class="o">.</span> <span class="o">+</span> <span class="o">-</span> <span class="mi">4795832</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">23000000000000</span> <span class="mi">22999994980562</span> <span class="o">.</span> <span class="o">-</span> <span class="mi">4795832</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">5019438</span> <span class="o">.</span> <span class="mi">4795832</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">5019438</span> <span class="mi">4795832</span> <span class="o">.</span> <span class="o">%</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">223606</span> <span class="o">.</span> <span class="mi">2397916</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">223606</span> <span class="mi">2397916</span> <span class="o">.</span> <span class="n">swap</span> <span class="n">row_value</span>
|
||||
<span class="mi">2397916</span> <span class="mi">223606</span> <span class="o">.</span> <span class="n">row_value</span>
|
||||
<span class="mi">2397916</span> <span class="mi">223606</span> <span class="o">.</span> <span class="n">over</span> <span class="o">--</span> <span class="o">-</span> <span class="nb">abs</span> <span class="o">+</span>
|
||||
<span class="mi">2397916</span> <span class="mi">223606</span> <span class="mi">2397916</span> <span class="o">.</span> <span class="o">--</span> <span class="o">-</span> <span class="nb">abs</span> <span class="o">+</span>
|
||||
<span class="mi">2397916</span> <span class="mi">223606</span> <span class="mi">2397915</span> <span class="o">.</span> <span class="o">-</span> <span class="nb">abs</span> <span class="o">+</span>
|
||||
<span class="mi">2397916</span> <span class="o">-</span><span class="mi">2174309</span> <span class="o">.</span> <span class="nb">abs</span> <span class="o">+</span>
|
||||
<span class="mi">2397916</span> <span class="mi">2174309</span> <span class="o">.</span> <span class="o">+</span>
|
||||
<span class="mi">4572225</span> <span class="o">.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">rank_of</span> <span class="o">==</span> <span class="o">--</span> <span class="n">sqrt</span> <span class="mi">2</span> <span class="o">/</span> <span class="mf">0.5</span> <span class="o">-</span> <span class="n">floor</span> <span class="o">++</span>
|
||||
<span class="n">offset_of</span> <span class="o">==</span> <span class="n">dup</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">[</span><span class="n">dup</span> <span class="o">--</span> <span class="mi">4</span> <span class="o">*</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="o">-</span><span class="p">]</span> <span class="n">dip</span> <span class="o">%</span>
|
||||
<span class="n">row_value</span> <span class="o">==</span> <span class="n">over</span> <span class="o">--</span> <span class="o">-</span> <span class="nb">abs</span> <span class="o">+</span>
|
||||
|
||||
<span class="n">aoc2017</span><span class="o">.</span><span class="mi">3</span> <span class="o">==</span> <span class="n">dup</span> <span class="n">rank_of</span> <span class="p">[</span><span class="n">offset_of</span><span class="p">]</span> <span class="n">dupdip</span> <span class="n">swap</span> <span class="n">row_value</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-3rd">December 3rd</a><ul>
|
||||
<li><a class="reference internal" href="#analysis">Analysis</a></li>
|
||||
<li><a class="reference internal" href="#finding-the-rank-and-offset-of-a-number">Finding the rank and offset of a number.</a></li>
|
||||
<li><a class="reference internal" href="#putting-it-all-together">Putting it all together</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#sympy-to-the-rescue">Sympy to the Rescue</a></li>
|
||||
<li><a class="reference internal" href="#a-joy-version">A Joy Version</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 3rd.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>
|
||||
@@ -1,144 +0,0 @@
|
||||
|
||||
<!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 — 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-4th">
|
||||
<h2>December 4th<a class="headerlink" href="#december-4th" title="Permalink to this headline">¶</a></h2>
|
||||
<p>To ensure security, a valid passphrase must contain no duplicate words.</p>
|
||||
<p>For example:</p>
|
||||
<ul class="simple">
|
||||
<li>aa bb cc dd ee is valid.</li>
|
||||
<li>aa bb cc dd aa is not valid - the word aa appears more than once.</li>
|
||||
<li>aa bb cc dd aaa is valid - aa and aaa count as different words.</li>
|
||||
</ul>
|
||||
<p>The system’s full passphrase list is available as your puzzle input. How
|
||||
many passphrases are valid?</p>
|
||||
<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>I’ll assume the input is a Joy sequence of sequences of integers.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[[</span><span class="mi">5</span> <span class="mi">1</span> <span class="mi">9</span> <span class="mi">5</span><span class="p">]</span>
|
||||
<span class="p">[</span><span class="mi">7</span> <span class="mi">5</span> <span class="mi">4</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="mi">6</span> <span class="mi">8</span><span class="p">]]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>So, obviously, the initial form 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">AoC2017</span><span class="o">.</span><span class="mi">4</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="o">+</span><span class="p">]</span> <span class="n">step</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">F</span> <span class="o">==</span> <span class="p">[</span><span class="n">size</span><span class="p">]</span> <span class="p">[</span><span class="n">unique</span> <span class="n">size</span><span class="p">]</span> <span class="n">cleave</span> <span class="o">=</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>The <code class="docutils literal notranslate"><span class="pre">step_zero</span></code> combinator includes the <code class="docutils literal notranslate"><span class="pre">0</span> <span class="pre">swap</span></code> that would normally
|
||||
open one of these definitions:</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">'[step_zero] help'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span> <span class="n">roll</span><span class="o">></span> <span class="n">step</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">AoC2017</span><span class="o">.</span><span class="mi">4</span> <span class="o">==</span> <span class="p">[</span><span class="n">F</span> <span class="o">+</span><span class="p">]</span> <span class="n">step_zero</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">'AoC2017.4 == [[size] [unique size] cleave = +] step_zero'</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">'''</span>
|
||||
|
||||
<span class="s1">[[5 1 9 5]</span>
|
||||
<span class="s1"> [7 5 4 3]</span>
|
||||
<span class="s1"> [2 4 6 8]] AoC2017.4</span>
|
||||
|
||||
<span class="s1">'''</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>
|
||||
</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-4th">December 4th</a></li>
|
||||
</ul>
|
||||
</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 4th.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>
|
||||
@@ -1,368 +0,0 @@
|
||||
|
||||
<!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 — 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-5th">
|
||||
<h2>December 5th<a class="headerlink" href="#december-5th" title="Permalink to this headline">¶</a></h2>
|
||||
<p>…a list of the offsets for each jump. Jumps are relative: -1 moves to
|
||||
the previous instruction, and 2 skips the next one. Start at the first
|
||||
instruction in the list. The goal is to follow the jumps until one leads
|
||||
outside the list.</p>
|
||||
<p>In addition, these instructions are a little strange; after each jump,
|
||||
the offset of that instruction increases by 1. So, if you come across an
|
||||
offset of 3, you would move three instructions forward, but change it to
|
||||
a 4 for the next time it is encountered.</p>
|
||||
<p>For example, consider the following list of jump offsets:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span>
|
||||
<span class="mi">3</span>
|
||||
<span class="mi">0</span>
|
||||
<span class="mi">1</span>
|
||||
<span class="o">-</span><span class="mi">3</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Positive jumps (“forward”) move downward; negative jumps move upward.
|
||||
For legibility in this example, these offset values will be written all
|
||||
on one line, with the current instruction marked in parentheses. The
|
||||
following steps would be taken before an exit is found:</p>
|
||||
<ul class="simple">
|
||||
<li><ol class="first arabic" start="0">
|
||||
<li>3 0 1 -3 - before we have taken any steps.</li>
|
||||
</ol>
|
||||
</li>
|
||||
<li><ol class="first arabic">
|
||||
<li>3 0 1 -3 - jump with offset 0 (that is, don’t jump at all).
|
||||
Fortunately, the instruction is then incremented to 1.</li>
|
||||
</ol>
|
||||
</li>
|
||||
<li>2 (3) 0 1 -3 - step forward because of the instruction we just
|
||||
modified. The first instruction is incremented again, now to 2.</li>
|
||||
<li>2 4 0 1 (-3) - jump all the way to the end; leave a 4 behind.</li>
|
||||
<li>2 (4) 0 1 -2 - go back to where we just were; increment -3 to -2.</li>
|
||||
<li>2 5 0 1 -2 - jump 4 steps forward, escaping the maze.</li>
|
||||
</ul>
|
||||
<p>In this example, the exit is reached in 5 steps.</p>
|
||||
<p>How many steps does it take to reach the exit?</p>
|
||||
</div>
|
||||
<div class="section" id="breakdown">
|
||||
<h2>Breakdown<a class="headerlink" href="#breakdown" title="Permalink to this headline">¶</a></h2>
|
||||
<p>For now, I’m going to assume a starting state with the size of the
|
||||
sequence pre-computed. We need it to define the exit condition and it is
|
||||
a trivial preamble to generate it. We then need and <code class="docutils literal notranslate"><span class="pre">index</span></code> and a
|
||||
<code class="docutils literal notranslate"><span class="pre">step-count</span></code>, which are both initially zero. Then we have the sequence
|
||||
itself, and some recursive function <code class="docutils literal notranslate"><span class="pre">F</span></code> that does the work.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">size</span> <span class="n">index</span> <span class="n">step</span><span class="o">-</span><span class="n">count</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">F</span>
|
||||
<span class="o">-----------------------------------</span>
|
||||
<span class="n">step</span><span class="o">-</span><span class="n">count</span>
|
||||
|
||||
<span class="n">F</span> <span class="o">==</span> <span class="p">[</span><span class="n">P</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="p">[</span><span class="n">R2</span><span class="p">]</span> <span class="n">genrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Later on I was thinking about it and the Forth heuristic came to mind,
|
||||
to wit: four things on the stack are kind of much. Immediately I
|
||||
realized that the size properly belongs in the predicate of <code class="docutils literal notranslate"><span class="pre">F</span></code>! D’oh!</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">index</span> <span class="n">step</span><span class="o">-</span><span class="n">count</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">F</span>
|
||||
<span class="o">------------------------------</span>
|
||||
<span class="n">step</span><span class="o">-</span><span class="n">count</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>So, let’s start by nailing down the predicate:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">F</span> <span class="o">==</span> <span class="p">[</span><span class="n">P</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span><span class="p">]</span> <span class="p">[</span><span class="n">R2</span><span class="p">]</span> <span class="n">genrec</span>
|
||||
<span class="o">==</span> <span class="p">[</span><span class="n">P</span><span class="p">]</span> <span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="p">[</span><span class="n">R1</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">R2</span><span class="p">]</span> <span class="n">ifte</span>
|
||||
|
||||
<span class="mi">0</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">3</span> <span class="mi">0</span> <span class="mi">1</span> <span class="o">-</span><span class="mi">3</span><span class="p">]</span> <span class="n">popop</span> <span class="mi">5</span> <span class="o">>=</span>
|
||||
|
||||
<span class="n">P</span> <span class="o">==</span> <span class="n">popop</span> <span class="mi">5</span> <span class="o">>=</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Now we need the else-part:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">index</span> <span class="n">step</span><span class="o">-</span><span class="n">count</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">3</span> <span class="mi">0</span> <span class="mi">1</span> <span class="o">-</span><span class="mi">3</span><span class="p">]</span> <span class="n">roll</span><span class="o"><</span> <span class="n">popop</span>
|
||||
|
||||
<span class="n">E</span> <span class="o">==</span> <span class="n">roll</span><span class="o"><</span> <span class="n">popop</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Last but not least, the recursive branch</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">3</span> <span class="mi">0</span> <span class="mi">1</span> <span class="o">-</span><span class="mi">3</span><span class="p">]</span> <span class="n">R1</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">R2</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>The <code class="docutils literal notranslate"><span class="pre">R1</span></code> function has a big job:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">R1</span> <span class="o">==</span> <span class="n">get</span> <span class="n">the</span> <span class="n">value</span> <span class="n">at</span> <span class="n">index</span>
|
||||
<span class="n">increment</span> <span class="n">the</span> <span class="n">value</span> <span class="n">at</span> <span class="n">the</span> <span class="n">index</span>
|
||||
<span class="n">add</span> <span class="n">the</span> <span class="n">value</span> <span class="n">gotten</span> <span class="n">to</span> <span class="n">the</span> <span class="n">index</span>
|
||||
<span class="n">increment</span> <span class="n">the</span> <span class="n">step</span> <span class="n">count</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>The only tricky thing there is incrementing an integer in the sequence.
|
||||
Joy sequences are not particularly good for random access. We could
|
||||
encode the list of jump offsets in a big integer and use math to do the
|
||||
processing for a good speed-up, but it still wouldn’t beat the
|
||||
performance of e.g. a mutable array. This is just one of those places
|
||||
where “plain vanilla” Joypy doesn’t shine (in default performance. The
|
||||
legendary <em>Sufficiently-Smart Compiler</em> would of course rewrite this
|
||||
function to use an array “under the hood”.)</p>
|
||||
<p>In the meantime, I’m going to write a primitive function that just does
|
||||
what we need.</p>
|
||||
<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">D</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
|
||||
<span class="kn">from</span> <span class="nn">joy.library</span> <span class="k">import</span> <span class="n">SimpleFunctionWrapper</span>
|
||||
<span class="kn">from</span> <span class="nn">joy.utils.stack</span> <span class="k">import</span> <span class="n">list_to_stack</span>
|
||||
|
||||
|
||||
<span class="nd">@SimpleFunctionWrapper</span>
|
||||
<span class="k">def</span> <span class="nf">incr_at</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
||||
<span class="sd">'''Given a index and a sequence of integers, increment the integer at the index.</span>
|
||||
|
||||
<span class="sd"> E.g.:</span>
|
||||
|
||||
<span class="sd"> 3 [0 1 2 3 4 5] incr_at</span>
|
||||
<span class="sd"> -----------------------------</span>
|
||||
<span class="sd"> [0 1 2 4 4 5]</span>
|
||||
|
||||
<span class="sd"> '''</span>
|
||||
<span class="n">sequence</span><span class="p">,</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">stack</span><span class="p">)</span> <span class="o">=</span> <span class="n">stack</span>
|
||||
<span class="n">mem</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
<span class="k">while</span> <span class="n">i</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">:</span>
|
||||
<span class="n">term</span><span class="p">,</span> <span class="n">sequence</span> <span class="o">=</span> <span class="n">sequence</span>
|
||||
<span class="n">mem</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">term</span><span class="p">)</span>
|
||||
<span class="n">i</span> <span class="o">-=</span> <span class="mi">1</span>
|
||||
<span class="n">mem</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
<span class="k">return</span> <span class="n">list_to_stack</span><span class="p">(</span><span class="n">mem</span><span class="p">,</span> <span class="n">sequence</span><span class="p">),</span> <span class="n">stack</span>
|
||||
|
||||
|
||||
<span class="n">D</span><span class="p">[</span><span class="s1">'incr_at'</span><span class="p">]</span> <span class="o">=</span> <span class="n">incr_at</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">'3 [0 1 2 3 4 5] incr_at'</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">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">4</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="section" id="get-the-value-at-index">
|
||||
<h3>get the value at index<a class="headerlink" href="#get-the-value-at-index" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</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="n">roll</span><span class="o"><</span> <span class="n">at</span><span class="p">]</span> <span class="n">nullary</span>
|
||||
<span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="n">n</span> <span class="mi">4</span><span class="p">]</span> <span class="n">n</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="increment-the-value-at-the-index">
|
||||
<h3>increment the value at the index<a class="headerlink" href="#increment-the-value-at-the-index" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="n">n</span> <span class="mi">4</span><span class="p">]</span> <span class="n">n</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">dip</span>
|
||||
<span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="n">n</span> <span class="mi">4</span><span class="p">]</span> <span class="n">Q</span> <span class="n">n</span>
|
||||
<span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="n">n</span> <span class="mi">4</span><span class="p">]</span> <span class="p">[</span><span class="n">popd</span> <span class="n">incr_at</span><span class="p">]</span> <span class="n">unary</span> <span class="n">n</span>
|
||||
<span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span> <span class="mi">4</span><span class="p">]</span> <span class="n">n</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="add-the-value-gotten-to-the-index">
|
||||
<h3>add the value gotten to the index<a class="headerlink" href="#add-the-value-gotten-to-the-index" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span> <span class="mi">4</span><span class="p">]</span> <span class="n">n</span> <span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">cons</span> <span class="n">dipd</span>
|
||||
<span class="mi">3</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span> <span class="mi">4</span><span class="p">]</span> <span class="p">[</span><span class="n">n</span> <span class="o">+</span><span class="p">]</span> <span class="n">dipd</span>
|
||||
<span class="mi">3</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span> <span class="mi">4</span><span class="p">]</span>
|
||||
<span class="mi">3</span><span class="o">+</span><span class="n">n</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span> <span class="mi">4</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="increment-the-step-count">
|
||||
<h3>increment the step count<a class="headerlink" href="#increment-the-step-count" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">3</span><span class="o">+</span><span class="n">n</span> <span class="mi">0</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span> <span class="mi">4</span><span class="p">]</span> <span class="p">[</span><span class="o">++</span><span class="p">]</span> <span class="n">dip</span>
|
||||
<span class="mi">3</span><span class="o">+</span><span class="n">n</span> <span class="mi">1</span> <span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">2</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span> <span class="mi">4</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="all-together-now">
|
||||
<h3>All together now…<a class="headerlink" href="#all-together-now" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>get_value == [roll< at] nullary
|
||||
incr_value == [[popd incr_at] unary] dip
|
||||
add_value == [+] cons dipd
|
||||
incr_step_count == [++] dip
|
||||
|
||||
R1 == get_value incr_value add_value incr_step_count
|
||||
|
||||
F == [P] [T] [R1] primrec
|
||||
|
||||
F == [popop !size! >=] [roll< pop] [get_value incr_value add_value incr_step_count] primrec
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.library</span> <span class="k">import</span> <span class="n">DefinitionWrapper</span>
|
||||
|
||||
|
||||
<span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
||||
|
||||
<span class="s1"> get_value == [roll< at] nullary</span>
|
||||
<span class="s1"> incr_value == [[popd incr_at] unary] dip</span>
|
||||
<span class="s1"> add_value == [+] cons dipd</span>
|
||||
<span class="s1">incr_step_count == [++] dip</span>
|
||||
|
||||
<span class="s1"> AoC2017.5.0 == get_value incr_value add_value incr_step_count</span>
|
||||
|
||||
<span class="s1">'''</span><span class="p">,</span> <span class="n">D</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">'F == [popop 5 >=] [roll< popop] [AoC2017.5.0] primrec'</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">'0 0 [0 3 0 1 -3] F'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">5</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="preamble-for-setting-up-predicate-index-and-step-count">
|
||||
<h3>Preamble for setting up predicate, <code class="docutils literal notranslate"><span class="pre">index</span></code>, and <code class="docutils literal notranslate"><span class="pre">step-count</span></code><a class="headerlink" href="#preamble-for-setting-up-predicate-index-and-step-count" title="Permalink to this headline">¶</a></h3>
|
||||
<p>We want to go from this to this:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">AoC2017</span><span class="o">.</span><span class="mf">5.</span><span class="n">preamble</span>
|
||||
<span class="o">------------------------------</span>
|
||||
<span class="mi">0</span> <span class="mi">0</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="n">n</span> <span class="o">>=</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Where <code class="docutils literal notranslate"><span class="pre">n</span></code> is the size of the sequence.</p>
|
||||
<p>The first part is obviously <code class="docutils literal notranslate"><span class="pre">0</span> <span class="pre">0</span> <span class="pre">roll<</span></code>, then <code class="docutils literal notranslate"><span class="pre">dup</span> <span class="pre">size</span></code>:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="mi">0</span> <span class="mi">0</span> <span class="n">roll</span><span class="o"><</span> <span class="n">dup</span> <span class="n">size</span>
|
||||
<span class="mi">0</span> <span class="mi">0</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">n</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Then:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">0</span> <span class="mi">0</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">n</span> <span class="p">[</span><span class="o">>=</span><span class="p">]</span> <span class="n">cons</span> <span class="p">[</span><span class="n">popop</span><span class="p">]</span> <span class="n">swoncat</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>So:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">init</span><span class="o">-</span><span class="n">index</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">step</span><span class="o">-</span><span class="n">count</span> <span class="o">==</span> <span class="mi">0</span> <span class="mi">0</span> <span class="n">roll</span><span class="o"><</span>
|
||||
<span class="n">prepare</span><span class="o">-</span><span class="n">predicate</span> <span class="o">==</span> <span class="n">dup</span> <span class="n">size</span> <span class="p">[</span><span class="o">>=</span><span class="p">]</span> <span class="n">cons</span> <span class="p">[</span><span class="n">popop</span><span class="p">]</span> <span class="n">swoncat</span>
|
||||
|
||||
<span class="n">AoC2017</span><span class="o">.</span><span class="mf">5.</span><span class="n">preamble</span> <span class="o">==</span> <span class="n">init</span><span class="o">-</span><span class="n">index</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">step</span><span class="o">-</span><span class="n">count</span> <span class="n">prepare</span><span class="o">-</span><span class="n">predicate</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_definitions</span><span class="p">(</span><span class="s1">'''</span>
|
||||
|
||||
<span class="s1">init-index-and-step-count == 0 0 roll<</span>
|
||||
<span class="s1"> prepare-predicate == dup size [>=] cons [popop] swoncat</span>
|
||||
|
||||
<span class="s1"> AoC2017.5.preamble == init-index-and-step-count prepare-predicate</span>
|
||||
|
||||
<span class="s1"> AoC2017.5 == AoC2017.5.preamble [roll< popop] [AoC2017.5.0] primrec</span>
|
||||
|
||||
<span class="s1">'''</span><span class="p">,</span> <span class="n">D</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">'[0 3 0 1 -3] AoC2017.5'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">5</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">AoC2017</span><span class="o">.</span><span class="mi">5</span> <span class="o">==</span> <span class="n">AoC2017</span><span class="o">.</span><span class="mf">5.</span><span class="n">preamble</span> <span class="p">[</span><span class="n">roll</span><span class="o"><</span> <span class="n">popop</span><span class="p">]</span> <span class="p">[</span><span class="n">AoC2017</span><span class="o">.</span><span class="mf">5.0</span><span class="p">]</span> <span class="n">primrec</span>
|
||||
|
||||
<span class="n">AoC2017</span><span class="o">.</span><span class="mf">5.0</span> <span class="o">==</span> <span class="n">get_value</span> <span class="n">incr_value</span> <span class="n">add_value</span> <span class="n">incr_step_count</span>
|
||||
<span class="n">AoC2017</span><span class="o">.</span><span class="mf">5.</span><span class="n">preamble</span> <span class="o">==</span> <span class="n">init</span><span class="o">-</span><span class="n">index</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">step</span><span class="o">-</span><span class="n">count</span> <span class="n">prepare</span><span class="o">-</span><span class="n">predicate</span>
|
||||
|
||||
<span class="n">get_value</span> <span class="o">==</span> <span class="p">[</span><span class="n">roll</span><span class="o"><</span> <span class="n">at</span><span class="p">]</span> <span class="n">nullary</span>
|
||||
<span class="n">incr_value</span> <span class="o">==</span> <span class="p">[[</span><span class="n">popd</span> <span class="n">incr_at</span><span class="p">]</span> <span class="n">unary</span><span class="p">]</span> <span class="n">dip</span>
|
||||
<span class="n">add_value</span> <span class="o">==</span> <span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">cons</span> <span class="n">dipd</span>
|
||||
<span class="n">incr_step_count</span> <span class="o">==</span> <span class="p">[</span><span class="o">++</span><span class="p">]</span> <span class="n">dip</span>
|
||||
|
||||
<span class="n">init</span><span class="o">-</span><span class="n">index</span><span class="o">-</span><span class="ow">and</span><span class="o">-</span><span class="n">step</span><span class="o">-</span><span class="n">count</span> <span class="o">==</span> <span class="mi">0</span> <span class="mi">0</span> <span class="n">roll</span><span class="o"><</span>
|
||||
<span class="n">prepare</span><span class="o">-</span><span class="n">predicate</span> <span class="o">==</span> <span class="n">dup</span> <span class="n">size</span> <span class="p">[</span><span class="o">>=</span><span class="p">]</span> <span class="n">cons</span> <span class="p">[</span><span class="n">popop</span><span class="p">]</span> <span class="n">swoncat</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>This is by far the largest program I have yet written in Joy. Even with
|
||||
the <code class="docutils literal notranslate"><span class="pre">incr_at</span></code> function it is still a bear. There may be an arrangement
|
||||
of the parameters that would permit more elegant definitions, but it
|
||||
still wouldn’t be as efficient as something written in assembly, C, or
|
||||
even Python.</p>
|
||||
</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-5th">December 5th</a></li>
|
||||
<li><a class="reference internal" href="#breakdown">Breakdown</a><ul>
|
||||
<li><a class="reference internal" href="#get-the-value-at-index">get the value at index</a></li>
|
||||
<li><a class="reference internal" href="#increment-the-value-at-the-index">increment the value at the index</a></li>
|
||||
<li><a class="reference internal" href="#add-the-value-gotten-to-the-index">add the value gotten to the index</a></li>
|
||||
<li><a class="reference internal" href="#increment-the-step-count">increment the step count</a></li>
|
||||
<li><a class="reference internal" href="#all-together-now">All together now…</a></li>
|
||||
<li><a class="reference internal" href="#preamble-for-setting-up-predicate-index-and-step-count">Preamble for setting up predicate, <code class="docutils literal notranslate"><span class="pre">index</span></code>, and <code class="docutils literal notranslate"><span class="pre">step-count</span></code></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</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 5th.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>
|
||||
@@ -1,323 +0,0 @@
|
||||
|
||||
<!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 — 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-6th">
|
||||
<h2>December 6th<a class="headerlink" href="#december-6th" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">0</span> <span class="mi">2</span> <span class="mi">7</span> <span class="mi">0</span><span class="p">]</span> <span class="n">dup</span> <span class="nb">max</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<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">D</span><span class="p">,</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>
|
||||
<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">'[0 2 7 0] dup max'</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">0</span> <span class="mi">2</span> <span class="mi">7</span> <span class="mi">0</span><span class="p">]</span> <span class="mi">7</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.library</span> <span class="k">import</span> <span class="n">SimpleFunctionWrapper</span>
|
||||
<span class="kn">from</span> <span class="nn">joy.utils.stack</span> <span class="k">import</span> <span class="n">list_to_stack</span>
|
||||
|
||||
|
||||
<span class="nd">@SimpleFunctionWrapper</span>
|
||||
<span class="k">def</span> <span class="nf">index_of</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
||||
<span class="sd">'''Given a sequence and a item, return the index of the item, or -1 if not found.</span>
|
||||
|
||||
<span class="sd"> E.g.:</span>
|
||||
|
||||
<span class="sd"> [a b c] a index_of</span>
|
||||
<span class="sd"> ------------------------</span>
|
||||
<span class="sd"> 0</span>
|
||||
|
||||
<span class="sd"> [a b c] d index_of</span>
|
||||
<span class="sd"> ------------------------</span>
|
||||
<span class="sd"> -1</span>
|
||||
|
||||
<span class="sd"> '''</span>
|
||||
<span class="n">item</span><span class="p">,</span> <span class="p">(</span><span class="n">sequence</span><span class="p">,</span> <span class="n">stack</span><span class="p">)</span> <span class="o">=</span> <span class="n">stack</span>
|
||||
<span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
|
||||
<span class="k">while</span> <span class="n">sequence</span><span class="p">:</span>
|
||||
<span class="n">term</span><span class="p">,</span> <span class="n">sequence</span> <span class="o">=</span> <span class="n">sequence</span>
|
||||
<span class="k">if</span> <span class="n">term</span> <span class="o">==</span> <span class="n">item</span><span class="p">:</span>
|
||||
<span class="k">break</span>
|
||||
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
<span class="k">else</span><span class="p">:</span>
|
||||
<span class="n">i</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
|
||||
<span class="k">return</span> <span class="n">i</span><span class="p">,</span> <span class="n">stack</span>
|
||||
|
||||
|
||||
<span class="n">D</span><span class="p">[</span><span class="s1">'index_of'</span><span class="p">]</span> <span class="o">=</span> <span class="n">index_of</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">'[0 2 7 0] 7 index_of'</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>
|
||||
<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">'[0 2 7 0] 23 index_of'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">-</span><span class="mi">1</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Starting at <code class="docutils literal notranslate"><span class="pre">index</span></code> distribute <code class="docutils literal notranslate"><span class="pre">count</span></code> “blocks” to the “banks” in
|
||||
the sequence.</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">count</span> <span class="n">index</span> <span class="n">distribute</span>
|
||||
<span class="o">----------------------------</span>
|
||||
<span class="p">[</span><span class="o">...</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>This seems like it would be a PITA to implement in Joypy…</p>
|
||||
<div class="code ipython2 highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">joy.utils.stack</span> <span class="k">import</span> <span class="n">iter_stack</span><span class="p">,</span> <span class="n">list_to_stack</span>
|
||||
|
||||
|
||||
<span class="nd">@SimpleFunctionWrapper</span>
|
||||
<span class="k">def</span> <span class="nf">distribute</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
|
||||
<span class="sd">'''Starting at index+1 distribute count "blocks" to the "banks" in the sequence.</span>
|
||||
|
||||
<span class="sd"> [...] count index distribute</span>
|
||||
<span class="sd"> ----------------------------</span>
|
||||
<span class="sd"> [...]</span>
|
||||
|
||||
<span class="sd"> '''</span>
|
||||
<span class="n">index</span><span class="p">,</span> <span class="p">(</span><span class="n">count</span><span class="p">,</span> <span class="p">(</span><span class="n">sequence</span><span class="p">,</span> <span class="n">stack</span><span class="p">))</span> <span class="o">=</span> <span class="n">stack</span>
|
||||
<span class="k">assert</span> <span class="n">count</span> <span class="o">>=</span> <span class="mi">0</span>
|
||||
<span class="n">cheat</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">iter_stack</span><span class="p">(</span><span class="n">sequence</span><span class="p">))</span>
|
||||
<span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">cheat</span><span class="p">)</span>
|
||||
<span class="k">assert</span> <span class="n">index</span> <span class="o"><</span> <span class="n">n</span>
|
||||
<span class="n">cheat</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
|
||||
<span class="k">while</span> <span class="n">count</span><span class="p">:</span>
|
||||
<span class="n">index</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
<span class="n">index</span> <span class="o">%=</span> <span class="n">n</span>
|
||||
<span class="n">cheat</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||
<span class="n">count</span> <span class="o">-=</span> <span class="mi">1</span>
|
||||
<span class="k">return</span> <span class="n">list_to_stack</span><span class="p">(</span><span class="n">cheat</span><span class="p">),</span> <span class="n">stack</span>
|
||||
|
||||
|
||||
<span class="n">D</span><span class="p">[</span><span class="s1">'distribute'</span><span class="p">]</span> <span class="o">=</span> <span class="n">distribute</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">'[0 2 7 0] dup max [index_of] nullary distribute'</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">4</span> <span class="mi">1</span> <span class="mi">2</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">'[2 4 1 2] dup max [index_of] nullary distribute'</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="mi">2</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">'[3 1 2 3] dup max [index_of] nullary distribute'</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">0</span> <span class="mi">2</span> <span class="mi">3</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">J</span><span class="p">(</span><span class="s1">'[0 2 3 4] dup max [index_of] nullary distribute'</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">3</span> <span class="mi">4</span> <span class="mi">1</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">'[1 3 4 1] dup max [index_of] nullary distribute'</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">4</span> <span class="mi">1</span> <span class="mi">2</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="section" id="recalling-generator-programs">
|
||||
<h3>Recalling “Generator Programs”<a class="headerlink" href="#recalling-generator-programs" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">a</span> <span class="n">F</span><span class="p">]</span> <span class="n">x</span>
|
||||
<span class="p">[</span><span class="n">a</span> <span class="n">F</span><span class="p">]</span> <span class="n">a</span> <span class="n">F</span>
|
||||
|
||||
<span class="p">[</span><span class="n">a</span> <span class="n">F</span><span class="p">]</span> <span class="n">a</span> <span class="n">swap</span> <span class="p">[</span><span class="n">C</span><span class="p">]</span> <span class="n">dip</span> <span class="n">rest</span> <span class="n">cons</span>
|
||||
<span class="n">a</span> <span class="p">[</span><span class="n">a</span> <span class="n">F</span><span class="p">]</span> <span class="p">[</span><span class="n">C</span><span class="p">]</span> <span class="n">dip</span> <span class="n">rest</span> <span class="n">cons</span>
|
||||
<span class="n">a</span> <span class="n">C</span> <span class="p">[</span><span class="n">a</span> <span class="n">F</span><span class="p">]</span> <span class="n">rest</span> <span class="n">cons</span>
|
||||
<span class="n">a</span> <span class="n">C</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">cons</span>
|
||||
|
||||
<span class="n">w</span><span class="o">/</span> <span class="n">C</span> <span class="o">==</span> <span class="n">dup</span> <span class="n">G</span>
|
||||
|
||||
<span class="n">a</span> <span class="n">dup</span> <span class="n">G</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">cons</span>
|
||||
<span class="n">a</span> <span class="n">a</span> <span class="n">G</span> <span class="p">[</span><span class="n">F</span><span class="p">]</span> <span class="n">cons</span>
|
||||
|
||||
<span class="n">w</span><span class="o">/</span> <span class="n">G</span> <span class="o">==</span> <span class="n">dup</span> <span class="nb">max</span> <span class="p">[</span><span class="n">index_of</span><span class="p">]</span> <span class="n">nullary</span> <span class="n">distribute</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">'direco == dip rest cons'</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">'G == [direco] cons [swap] swoncat cons'</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">'make_distributor == [dup dup max [index_of] nullary distribute] G'</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">'[0 2 7 0] make_distributor 6 [x] times pop'</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">0</span> <span class="mi">2</span> <span class="mi">7</span> <span class="mi">0</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">4</span> <span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">0</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="mi">4</span> <span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">4</span> <span class="mi">1</span> <span class="mi">2</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="a-function-to-drive-a-generator-and-count-how-many-states-before-a-repeat">
|
||||
<h3>A function to drive a generator and count how many states before a repeat.<a class="headerlink" href="#a-function-to-drive-a-generator-and-count-how-many-states-before-a-repeat" title="Permalink to this headline">¶</a></h3>
|
||||
<p>First draft:</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="p">[</span><span class="n">GEN</span><span class="p">]</span> <span class="n">x</span> <span class="p">[</span><span class="n">pop</span> <span class="n">index_of</span> <span class="mi">0</span> <span class="o">>=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">size</span> <span class="o">--</span><span class="p">]</span> <span class="p">[[</span><span class="n">swons</span><span class="p">]</span> <span class="n">dip</span> <span class="n">x</span><span class="p">]</span> <span class="n">primrec</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>(?)</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="p">[</span><span class="n">GEN</span><span class="p">]</span> <span class="n">x</span> <span class="p">[</span><span class="n">pop</span> <span class="n">index_of</span> <span class="mi">0</span> <span class="o">>=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">size</span> <span class="o">--</span><span class="p">]</span> <span class="p">[[</span><span class="n">swons</span><span class="p">]</span> <span class="n">dip</span> <span class="n">x</span><span class="p">]</span> <span class="n">primrec</span>
|
||||
<span class="p">[]</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">GEN</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">index_of</span> <span class="mi">0</span> <span class="o">>=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">size</span> <span class="o">--</span><span class="p">]</span> <span class="p">[[</span><span class="n">swons</span><span class="p">]</span> <span class="n">dip</span> <span class="n">x</span><span class="p">]</span> <span class="n">primrec</span>
|
||||
<span class="p">[]</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">GEN</span><span class="p">]</span> <span class="n">pop</span> <span class="n">index_of</span> <span class="mi">0</span> <span class="o">>=</span>
|
||||
<span class="p">[]</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">index_of</span> <span class="mi">0</span> <span class="o">>=</span>
|
||||
<span class="o">-</span><span class="mi">1</span> <span class="mi">0</span> <span class="o">>=</span>
|
||||
<span class="kc">False</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Base case</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">GEN</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">index_of</span> <span class="mi">0</span> <span class="o">>=</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">size</span> <span class="o">--</span><span class="p">]</span> <span class="p">[[</span><span class="n">swons</span><span class="p">]</span> <span class="n">dip</span> <span class="n">x</span><span class="p">]</span> <span class="n">primrec</span>
|
||||
<span class="p">[]</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">GEN</span><span class="p">]</span> <span class="n">pop</span> <span class="n">size</span> <span class="o">--</span>
|
||||
<span class="p">[]</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">size</span> <span class="o">--</span>
|
||||
<span class="p">[]</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">size</span> <span class="o">--</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>A mistake, <code class="docutils literal notranslate"><span class="pre">popop</span></code> and no need for <code class="docutils literal notranslate"><span class="pre">--</span></code></p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">GEN</span><span class="p">]</span> <span class="n">popop</span> <span class="n">size</span>
|
||||
<span class="p">[]</span> <span class="n">size</span>
|
||||
<span class="n">n</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>Recursive case</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[]</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">GEN</span><span class="p">]</span> <span class="p">[</span><span class="n">pop</span> <span class="n">index_of</span> <span class="mi">0</span> <span class="o">>=</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="n">size</span><span class="p">]</span> <span class="p">[[</span><span class="n">swons</span><span class="p">]</span> <span class="n">dip</span> <span class="n">x</span><span class="p">]</span> <span class="n">primrec</span>
|
||||
<span class="p">[]</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">GEN</span><span class="p">]</span> <span class="p">[</span><span class="n">swons</span><span class="p">]</span> <span class="n">dip</span> <span class="n">x</span> <span class="n">F</span>
|
||||
<span class="p">[]</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="n">swons</span> <span class="p">[</span><span class="n">GEN</span><span class="p">]</span> <span class="n">x</span> <span class="n">F</span>
|
||||
<span class="p">[[</span><span class="o">...</span><span class="p">]]</span> <span class="p">[</span><span class="n">GEN</span><span class="p">]</span> <span class="n">x</span> <span class="n">F</span>
|
||||
<span class="p">[[</span><span class="o">...</span><span class="p">]]</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">GEN</span><span class="p">]</span> <span class="n">F</span>
|
||||
|
||||
<span class="p">[[</span><span class="o">...</span><span class="p">]]</span> <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">GEN</span><span class="p">]</span> <span class="n">F</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>What have we learned?</p>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">F</span> <span class="o">==</span> <span class="p">[</span><span class="n">pop</span> <span class="n">index_of</span> <span class="mi">0</span> <span class="o">>=</span><span class="p">]</span> <span class="p">[</span><span class="n">popop</span> <span class="n">size</span><span class="p">]</span> <span class="p">[[</span><span class="n">swons</span><span class="p">]</span> <span class="n">dip</span> <span class="n">x</span><span class="p">]</span> <span class="n">primrec</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">'count_states == [] swap x [pop index_of 0 >=] [popop size] [[swons] dip x] primrec'</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">'AoC2017.6 == make_distributor count_states'</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">'[0 2 7 0] AoC2017.6'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">5</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">'[1 1 1] AoC2017.6'</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">'[8 0 0 0 0 0] AoC2017.6'</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">15</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</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-6th">December 6th</a><ul>
|
||||
<li><a class="reference internal" href="#recalling-generator-programs">Recalling “Generator Programs”</a></li>
|
||||
<li><a class="reference internal" href="#a-function-to-drive-a-generator-and-count-how-many-states-before-a-repeat">A function to drive a generator and count how many states before a repeat.</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</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 6th.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>
|
||||
File diff suppressed because one or more lines are too long
-2561
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user