368 lines
32 KiB
HTML
368 lines
32 KiB
HTML
|
||
<!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.1.1 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> |