<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://maebli.github.io/feed/archive.xml" rel="self" type="application/atom+xml" /><link href="https://maebli.github.io/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-07-26T19:53:57+00:00</updated><id>https://maebli.github.io/feed/archive.xml</id><title type="html">Michael Aebli’s Pages | Archive</title><subtitle>Notes on embedded development, Rust, and the M-Bus protocol, by Michael Aebli.</subtitle><author><name>Michael Aebli</name></author><entry><title type="html">Rust challenge 100/100 - aoc2024 day 21</title><link href="https://maebli.github.io/archive/2024-12-20-100rust-100/" rel="alternate" type="text/html" title="Rust challenge 100/100 - aoc2024 day 21" /><published>2025-01-13T12:08:00+00:00</published><updated>2025-01-13T12:08:00+00:00</updated><id>https://maebli.github.io/archive/100rust-100</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-20-100rust-100/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#100th-challenge">100th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="100th-challenge">100th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>I was able to finish the 100 challenge. Not in 100 days, but I’m happy with the result.
As well as this, I finished my first full year of advent of code- which I am also proud of.</p>

<p>When I get time, I will clean up the blog, maybe give it a new look at a more compact layout for the challenge, to archive it.
I also want to just uplaod my solutions as a git repo.</p>

<p>Anyways, as the 100th challenge I did the hardest of this year’s challenge, wich was day 21. I have to admit, I had to look at the
some solutions and it took me a while to figure it out. The proplem seems quite simple superficially, but it’s actually quite complex.</p>

<h3 id="solution">Solution</h3>

<p>My initial attempt was to use dijkstra’s algorithm, but soon found out that what is an optimal path for the first robot is not optimal for the second robot.
I also did a little doodle of the problem for part 1 to raise my creativity.</p>

<p><img src="/assets/img/aoc2024day21.jpeg" alt="" /></p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">uuse</span> <span class="nn">cached</span><span class="p">::</span><span class="nn">proc_macro</span><span class="p">::</span><span class="n">cached</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">itertools</span><span class="p">::</span><span class="n">Itertools</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashMap</span><span class="p">;</span>

<span class="nd">#[derive(Clone,</span> <span class="nd">Copy,</span> <span class="nd">Debug,</span> <span class="nd">Eq,</span> <span class="nd">Hash,</span> <span class="nd">PartialEq)]</span>
<span class="k">struct</span> <span class="nf">Pos</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">);</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0u64</span><span class="p">;</span>
    <span class="k">for</span> <span class="n">line</span> <span class="k">in</span> <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">num</span> <span class="o">=</span> <span class="n">line</span>
            <span class="nf">.chars</span><span class="p">()</span>
            <span class="nf">.take</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
            <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">String</span><span class="o">&gt;</span><span class="p">()</span>
            <span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span>
            <span class="nf">.unwrap</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">seq</span> <span class="o">=</span> <span class="nd">format!</span><span class="p">(</span><span class="s">"A{}"</span><span class="p">,</span> <span class="n">line</span><span class="p">);</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">complexity_sum</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">for</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">in</span> <span class="n">seq</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.tuple_windows</span><span class="p">()</span> <span class="p">{</span>
            <span class="n">complexity_sum</span> <span class="o">+=</span> <span class="nf">complexity</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="mi">26</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="n">res</span> <span class="o">+=</span> <span class="n">complexity_sum</span> <span class="o">*</span> <span class="n">num</span><span class="p">;</span>

        <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">complexity_sum</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">res</span><span class="p">);</span>
<span class="p">}</span>
<span class="nd">#[cached]</span>
<span class="k">fn</span> <span class="nf">complexity</span><span class="p">(</span><span class="n">from</span><span class="p">:</span> <span class="nb">char</span><span class="p">,</span> <span class="n">to</span><span class="p">:</span> <span class="nb">char</span><span class="p">,</span> <span class="k">mut</span> <span class="n">robot_count</span><span class="p">:</span> <span class="nb">i32</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span> <span class="p">{</span>
    <span class="n">robot_count</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">;</span>

    <span class="nd">#[rustfmt::skip]</span>
    <span class="k">let</span> <span class="n">dir_layout</span><span class="p">:</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="nb">char</span><span class="p">,</span> <span class="n">Pos</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">[</span>
                          <span class="p">(</span><span class="sc">'^'</span><span class="p">,</span> <span class="nf">Pos</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="p">(</span><span class="sc">'A'</span><span class="p">,</span> <span class="nf">Pos</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="p">(</span><span class="sc">'&lt;'</span><span class="p">,</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)),</span> <span class="p">(</span><span class="sc">'v'</span><span class="p">,</span> <span class="nf">Pos</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="p">(</span><span class="sc">'&gt;'</span><span class="p">,</span> <span class="nf">Pos</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="p">]</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.collect</span><span class="p">();</span>

    <span class="nd">#[rustfmt::skip]</span>
    <span class="k">let</span> <span class="n">num_layout</span><span class="p">:</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="nb">char</span><span class="p">,</span> <span class="n">Pos</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">[</span>
        <span class="p">(</span><span class="sc">'7'</span><span class="p">,</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)),</span> <span class="p">(</span><span class="sc">'8'</span><span class="p">,</span> <span class="nf">Pos</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="p">(</span><span class="sc">'9'</span><span class="p">,</span> <span class="nf">Pos</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="p">(</span><span class="sc">'4'</span><span class="p">,</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">)),</span> <span class="p">(</span><span class="sc">'5'</span><span class="p">,</span> <span class="nf">Pos</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="p">(</span><span class="sc">'6'</span><span class="p">,</span> <span class="nf">Pos</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="p">(</span><span class="sc">'1'</span><span class="p">,</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">)),</span> <span class="p">(</span><span class="sc">'2'</span><span class="p">,</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">)),</span> <span class="p">(</span><span class="sc">'3'</span><span class="p">,</span> <span class="nf">Pos</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="p">(</span><span class="sc">'0'</span><span class="p">,</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">)),</span> <span class="p">(</span><span class="sc">'A'</span><span class="p">,</span> <span class="nf">Pos</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="p">]</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.collect</span><span class="p">();</span>

    <span class="k">let</span> <span class="n">layout</span> <span class="o">=</span> <span class="k">if</span> <span class="n">dir_layout</span><span class="nf">.contains_key</span><span class="p">(</span><span class="o">&amp;</span><span class="n">from</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">dir_layout</span><span class="nf">.contains_key</span><span class="p">(</span><span class="o">&amp;</span><span class="n">to</span><span class="p">)</span> <span class="p">{</span>
        <span class="o">&amp;</span><span class="n">dir_layout</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="o">&amp;</span><span class="n">num_layout</span>
    <span class="p">};</span>

    <span class="k">let</span> <span class="n">start</span> <span class="o">=</span> <span class="n">layout</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="n">from</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
    <span class="k">let</span> <span class="n">end</span> <span class="o">=</span> <span class="n">layout</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="n">to</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>

    <span class="k">let</span> <span class="n">dx</span> <span class="o">=</span> <span class="n">end</span><span class="na">.0</span> <span class="o">-</span> <span class="n">start</span><span class="na">.0</span><span class="p">;</span>
    <span class="k">let</span> <span class="n">dy</span> <span class="o">=</span> <span class="n">end</span><span class="na">.1</span> <span class="o">-</span> <span class="n">start</span><span class="na">.1</span><span class="p">;</span>
    <span class="c1">// Directions to move</span>
    <span class="k">let</span> <span class="n">dx_dir</span> <span class="o">=</span> <span class="k">if</span> <span class="n">dx</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">{</span> <span class="s">"&gt;"</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="s">"&lt;"</span> <span class="p">};</span>
    <span class="k">let</span> <span class="n">dy_dir</span> <span class="o">=</span> <span class="k">if</span> <span class="n">dy</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">{</span> <span class="s">"v"</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="s">"^"</span> <span class="p">};</span>

    <span class="c1">// Create the steps vector</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">steps</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>
    <span class="k">for</span> <span class="n">_</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">dx</span><span class="nf">.abs</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">steps</span><span class="nf">.push</span><span class="p">(</span><span class="n">dx_dir</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">for</span> <span class="n">_</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">dy</span><span class="nf">.abs</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">steps</span><span class="nf">.push</span><span class="p">(</span><span class="n">dy_dir</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">paths</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">stack</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[(</span><span class="nd">vec!</span><span class="p">[],</span> <span class="n">steps</span><span class="nf">.clone</span><span class="p">())];</span>

    <span class="k">while</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">((</span><span class="k">mut</span> <span class="n">current_path</span><span class="p">,</span> <span class="n">remaining_steps</span><span class="p">))</span> <span class="o">=</span> <span class="n">stack</span><span class="nf">.pop</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">if</span> <span class="n">remaining_steps</span><span class="nf">.is_empty</span><span class="p">()</span> <span class="p">{</span>
            <span class="n">current_path</span><span class="nf">.push</span><span class="p">(</span><span class="s">"A"</span><span class="p">);</span> <span class="c1">// Add termination symbol</span>
            <span class="n">paths</span><span class="nf">.push</span><span class="p">(</span><span class="n">current_path</span><span class="nf">.join</span><span class="p">(</span><span class="s">""</span><span class="p">));</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">remaining_steps</span><span class="nf">.len</span><span class="p">()</span> <span class="p">{</span>
                <span class="k">let</span> <span class="k">mut</span> <span class="n">next_path</span> <span class="o">=</span> <span class="n">current_path</span><span class="nf">.clone</span><span class="p">();</span>
                <span class="n">next_path</span><span class="nf">.push</span><span class="p">(</span><span class="n">remaining_steps</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>

                <span class="k">let</span> <span class="k">mut</span> <span class="n">next_steps</span> <span class="o">=</span> <span class="n">remaining_steps</span><span class="nf">.clone</span><span class="p">();</span>
                <span class="n">next_steps</span><span class="nf">.remove</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>

                <span class="n">stack</span><span class="nf">.push</span><span class="p">((</span><span class="n">next_path</span><span class="p">,</span> <span class="n">next_steps</span><span class="p">));</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="n">paths</span> <span class="o">=</span> <span class="n">paths</span>
        <span class="nf">.iter</span><span class="p">()</span>
        <span class="nf">.map</span><span class="p">(|</span><span class="n">path</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">current_pos</span> <span class="o">=</span> <span class="o">*</span><span class="n">start</span><span class="p">;</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">valid</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>

            <span class="k">for</span> <span class="n">c</span> <span class="k">in</span> <span class="n">path</span><span class="nf">.chars</span><span class="p">()</span> <span class="p">{</span>
                <span class="nd">println!</span><span class="p">(</span><span class="s">" pos {:?} c {}"</span><span class="p">,</span> <span class="n">current_pos</span><span class="p">,</span> <span class="n">c</span><span class="p">);</span>
                <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
                    <span class="sc">'^'</span> <span class="k">=&gt;</span> <span class="n">current_pos</span><span class="na">.1</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="sc">'v'</span> <span class="k">=&gt;</span> <span class="n">current_pos</span><span class="na">.1</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="sc">'&lt;'</span> <span class="k">=&gt;</span> <span class="n">current_pos</span><span class="na">.0</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="sc">'&gt;'</span> <span class="k">=&gt;</span> <span class="n">current_pos</span><span class="na">.0</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">(),</span>
                <span class="p">}</span>
                <span class="k">if</span> <span class="o">!</span><span class="n">layout</span><span class="nf">.values</span><span class="p">()</span><span class="nf">.any</span><span class="p">(|</span><span class="o">&amp;</span><span class="n">pos</span><span class="p">|</span> <span class="n">pos</span> <span class="o">==</span> <span class="n">current_pos</span><span class="p">)</span> <span class="p">{</span>
                    <span class="nd">println!</span><span class="p">(</span><span class="s">"invalid pos {:?}"</span><span class="p">,</span> <span class="n">current_pos</span><span class="p">);</span>
                    <span class="n">valid</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>
                    <span class="k">break</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span>
            <span class="p">(</span><span class="n">valid</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
        <span class="p">})</span>
        <span class="nf">.filter</span><span class="p">(|(</span><span class="n">valid</span><span class="p">,</span> <span class="n">_</span><span class="p">)|</span> <span class="o">*</span><span class="n">valid</span><span class="p">)</span>
        <span class="nf">.map</span><span class="p">(|(</span><span class="n">_</span><span class="p">,</span> <span class="n">path</span><span class="p">)|</span> <span class="n">path</span><span class="nf">.clone</span><span class="p">())</span>
        <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">String</span><span class="o">&gt;&gt;</span><span class="p">();</span>

    <span class="k">if</span> <span class="n">dx</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">dy</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
        <span class="n">paths</span><span class="nf">.push</span><span class="p">(</span><span class="s">"A"</span><span class="nf">.to_string</span><span class="p">());</span>
    <span class="p">}</span>

    <span class="k">if</span> <span class="n">robot_count</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">paths</span>
            <span class="nf">.iter</span><span class="p">()</span>
            <span class="nf">.map</span><span class="p">(|</span><span class="n">path</span><span class="p">|</span> <span class="p">{</span>
                <span class="c1">// prepend 'A' to the path</span>
                <span class="k">let</span> <span class="n">path</span> <span class="o">=</span> <span class="nd">format!</span><span class="p">(</span><span class="s">"A{}"</span><span class="p">,</span> <span class="n">path</span><span class="p">);</span>
                <span class="n">path</span><span class="nf">.chars</span><span class="p">()</span>
                    <span class="nf">.tuple_windows</span><span class="p">()</span>
                    <span class="nf">.map</span><span class="p">(|(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)|</span> <span class="nf">complexity</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">robot_count</span><span class="p">))</span>
                    <span class="py">.sum</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span>
            <span class="p">})</span>
            <span class="nf">.min</span><span class="p">()</span>
            <span class="nf">.expect</span><span class="p">(</span><span class="s">"Problem finding min"</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="n">paths</span>
        <span class="nf">.iter</span><span class="p">()</span>
        <span class="nf">.map</span><span class="p">(|</span><span class="n">path</span><span class="p">|</span> <span class="n">path</span><span class="nf">.len</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">)</span>
        <span class="nf">.min</span><span class="p">()</span>
        <span class="nf">.expect</span><span class="p">(</span><span class="s">"Problem finding min"</span><span class="p">)</span>
<span class="p">}</span>


</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 99/100 - aoc2024 day 23</title><link href="https://maebli.github.io/archive/2024-12-20-100rust-99/" rel="alternate" type="text/html" title="Rust challenge 99/100 - aoc2024 day 23" /><published>2024-12-23T12:08:00+00:00</published><updated>2024-12-23T12:08:00+00:00</updated><id>https://maebli.github.io/archive/100rust-99</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-20-100rust-99/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#99th-challenge">99th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="99th-challenge">99th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today’s challenge is day 23 of advent of code 2024.</p>

<h3 id="solution">Solution</h3>

<p>Today’s challenge was graph theory related<a href="https://adventofcode.com/2024/day/23">day 23 of advent of code 2024</a>. 
I looked for a crate that could help and found <a href="https://docs.rs/graphrs/latest/graphrs/index.html">graphrs crate</a>. 
The crate counts traingles. So I counted traingles with and without ‘t’ <strong>at the beginning of the name</strong> (first I just checked any where in the name) and then subtracted the two. 
Note, because each node counts traingles for its self and the other nodes, I had to divide by 3.</p>

<p>For the second part I’m not exactly sure what I did yet. I didn’t find functions that count maximum cliques so I looked ath other functions in graphrs. 
I found the function <code class="language-plaintext highlighter-rouge">generalized_degree</code> and I found a condition for its output that matches maximum clique size of the graph. 
I’m not sure why though, and I’m not sure if it works on other inputs as well.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">graphrs</span><span class="p">::{</span><span class="nn">algorithms</span><span class="p">::</span><span class="n">cluster</span><span class="p">,</span> <span class="n">Edge</span><span class="p">,</span> <span class="n">Graph</span><span class="p">,</span> <span class="n">GraphSpecs</span><span class="p">};</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">graph_with_t</span><span class="p">:</span> <span class="n">Graph</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="p">,</span> <span class="p">()</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nn">Graph</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="nn">GraphSpecs</span><span class="p">::</span><span class="nf">undirected_create_missing</span><span class="p">());</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">graph_without_t</span><span class="p">:</span> <span class="n">Graph</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="p">,</span> <span class="p">()</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nn">Graph</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="nn">GraphSpecs</span><span class="p">::</span><span class="nf">undirected_create_missing</span><span class="p">());</span>

    <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.for_each</span><span class="p">(|</span><span class="n">line</span><span class="p">|</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">parts</span> <span class="o">=</span> <span class="n">line</span><span class="nf">.split</span><span class="p">(</span><span class="s">"-"</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">n1</span> <span class="o">=</span> <span class="n">parts</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">n2</span> <span class="o">=</span> <span class="n">parts</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>

        <span class="k">let</span> <span class="n">edge</span> <span class="o">=</span> <span class="nn">Edge</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="n">n1</span><span class="p">,</span> <span class="n">n2</span><span class="p">);</span>
        <span class="n">graph_with_t</span><span class="nf">.add_edge</span><span class="p">(</span><span class="n">edge</span><span class="nf">.clone</span><span class="p">())</span><span class="nf">.unwrap</span><span class="p">();</span>

        <span class="k">if</span> <span class="o">!</span><span class="n">n1</span><span class="nf">.starts_with</span><span class="p">(</span><span class="s">"t"</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">n2</span><span class="nf">.starts_with</span><span class="p">(</span><span class="s">"t"</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">graph_without_t</span><span class="nf">.add_edge</span><span class="p">(</span><span class="n">edge</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
        <span class="p">}</span>
    <span class="p">});</span>

    <span class="k">let</span> <span class="n">triangles_with_t</span> <span class="o">=</span> <span class="nn">cluster</span><span class="p">::</span><span class="nf">triangles</span><span class="p">(</span><span class="o">&amp;</span><span class="n">graph_with_t</span><span class="p">,</span> <span class="nb">None</span><span class="p">);</span>
    <span class="k">let</span> <span class="n">triangles_without_t</span> <span class="o">=</span> <span class="nn">cluster</span><span class="p">::</span><span class="nf">triangles</span><span class="p">(</span><span class="o">&amp;</span><span class="n">graph_without_t</span><span class="p">,</span> <span class="nb">None</span><span class="p">);</span>

    <span class="k">if</span> <span class="k">let</span> <span class="p">(</span><span class="nf">Ok</span><span class="p">(</span><span class="n">with_t</span><span class="p">),</span> <span class="nf">Ok</span><span class="p">(</span><span class="n">without_t</span><span class="p">))</span> <span class="o">=</span> <span class="p">(</span><span class="n">triangles_with_t</span><span class="p">,</span> <span class="n">triangles_without_t</span><span class="p">)</span> <span class="p">{</span>
        <span class="nd">println!</span><span class="p">(</span>
            <span class="s">"result part1: {:?}"</span><span class="p">,</span>
            <span class="n">with_t</span><span class="nf">.values</span><span class="p">()</span><span class="py">.sum</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">usize</span><span class="o">&gt;</span><span class="p">()</span> <span class="o">/</span> <span class="mi">3</span> <span class="o">-</span> <span class="n">without_t</span><span class="nf">.values</span><span class="p">()</span><span class="py">.sum</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">usize</span><span class="o">&gt;</span><span class="p">()</span> <span class="o">/</span> <span class="mi">3</span>
        <span class="p">);</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="n">g</span> <span class="o">=</span> <span class="n">graph_with_t</span><span class="p">;</span>

    <span class="k">let</span> <span class="n">c</span> <span class="o">=</span> <span class="nn">cluster</span><span class="p">::</span><span class="nf">generalized_degree</span><span class="p">(</span><span class="o">&amp;</span><span class="n">g</span><span class="p">,</span> <span class="nb">None</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">pass</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>
    <span class="k">if</span> <span class="k">let</span> <span class="nf">Ok</span><span class="p">(</span><span class="n">clustering</span><span class="p">)</span> <span class="o">=</span> <span class="n">c</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">max</span> <span class="o">=</span> <span class="n">clustering</span>
            <span class="nf">.iter</span><span class="p">()</span>
            <span class="nf">.map</span><span class="p">(|(</span><span class="n">_node</span><span class="p">,</span> <span class="n">cluster_map</span><span class="p">)|</span> <span class="p">{</span>
                <span class="n">cluster_map</span>
                    <span class="nf">.iter</span><span class="p">()</span>
                    <span class="nf">.filter</span><span class="p">(|(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)|</span> <span class="o">**</span><span class="n">key</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">==</span> <span class="o">**</span><span class="n">value</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">)</span>
                    <span class="nf">.map</span><span class="p">(|(</span><span class="n">key</span><span class="p">,</span> <span class="n">_value</span><span class="p">)|</span> <span class="n">key</span><span class="p">)</span>
                    <span class="nf">.max</span><span class="p">()</span>
                    <span class="nf">.unwrap_or</span><span class="p">(</span><span class="o">&amp;</span><span class="mi">0</span><span class="p">)</span>
            <span class="p">})</span>
            <span class="nf">.max</span><span class="p">()</span>
            <span class="nf">.unwrap</span><span class="p">();</span>

        <span class="nd">println!</span><span class="p">(</span><span class="s">"max: {:?}"</span><span class="p">,</span> <span class="n">max</span><span class="p">);</span>

        <span class="k">for</span> <span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">cluster_map</span><span class="p">)</span> <span class="k">in</span> <span class="n">clustering</span><span class="nf">.iter</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">for</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="k">in</span> <span class="n">cluster_map</span><span class="nf">.iter</span><span class="p">()</span> <span class="p">{</span>
                <span class="c1">// key and value are values for clustring hashmap where key is max and value is 1+max</span>
                <span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="n">max</span> <span class="o">&amp;&amp;</span> <span class="n">value</span> <span class="o">==</span> <span class="o">&amp;</span><span class="p">(</span><span class="n">max</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
                    <span class="n">pass</span><span class="nf">.push</span><span class="p">(</span><span class="n">node</span><span class="nf">.clone</span><span class="p">());</span>
                    <span class="k">break</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="n">pass</span><span class="nf">.sort</span><span class="p">();</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"result part2: {:?}"</span><span class="p">,</span> <span class="n">pass</span><span class="nf">.join</span><span class="p">(</span><span class="s">","</span><span class="p">));</span>
<span class="p">}</span>


</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 98/100 - aoc2024 day 22</title><link href="https://maebli.github.io/archive/2024-12-20-100rust-98/" rel="alternate" type="text/html" title="Rust challenge 98/100 - aoc2024 day 22" /><published>2024-12-22T15:08:00+00:00</published><updated>2024-12-22T15:08:00+00:00</updated><id>https://maebli.github.io/archive/100rust-98</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-20-100rust-98/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#98th-challenge">98th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="98th-challenge">98th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today’s challenge is day 22 of advent of code 2024.</p>

<h3 id="solution">Solution</h3>

<p>Today’s challenge was relatively straight forward <a href="https://adventofcode.com/2024/day/22">day 22 of advent of code 2024</a>. But it could probably have been done more memory efficient.</p>

<p>The function “evolve_repeated_loop” seems something that could have been done nicely with <a href="https://en.wikipedia.org/wiki/Tail_call">tail recursion</a>. However
<code class="language-plaintext highlighter-rouge">Rust – tail-call optimization may be done in limited circumstances, but is not guaranteed</code> - wikipedia</p>

<p>I was initally intending to this in Ocaml, where this <a href="https://abitofocaml.weebly.com/131-tail-recursion.html">feature is supported</a></p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashMap</span><span class="p">;</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">seq</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span>
        <span class="mi">123</span><span class="p">,</span> <span class="mi">15887950</span><span class="p">,</span> <span class="mi">16495136</span><span class="p">,</span> <span class="mi">527345</span><span class="p">,</span> <span class="mi">704524</span><span class="p">,</span> <span class="mi">1553684</span><span class="p">,</span> <span class="mi">12683156</span><span class="p">,</span> <span class="mi">11100544</span><span class="p">,</span> <span class="mi">12249484</span><span class="p">,</span> <span class="mi">7753432</span><span class="p">,</span>
        <span class="mi">5908254</span><span class="p">,</span>
    <span class="p">];</span>

    <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">seq</span><span class="nf">.len</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">{</span>
        <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">evolve_once</span><span class="p">(</span><span class="n">seq</span><span class="p">[</span><span class="n">i</span><span class="p">]),</span> <span class="n">seq</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]);</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="k">let</span> <span class="n">secrets</span> <span class="o">=</span> <span class="n">input</span>
        <span class="nf">.lines</span><span class="p">()</span>
        <span class="nf">.map</span><span class="p">(|</span><span class="n">line</span><span class="p">|</span> <span class="n">line</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span>
        <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;&gt;</span><span class="p">();</span>

    <span class="k">let</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">secrets</span>
        <span class="nf">.iter</span><span class="p">()</span>
        <span class="nf">.map</span><span class="p">(|</span><span class="o">&amp;</span><span class="n">secret</span><span class="p">|</span> <span class="nf">evolve_repeated_loop</span><span class="p">(</span><span class="n">secret</span><span class="p">,</span> <span class="mi">2000</span><span class="p">))</span>
        <span class="py">.sum</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i64</span><span class="o">&gt;</span><span class="p">();</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"solution part 1: {}"</span><span class="p">,</span> <span class="n">sum</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">banana_count</span> <span class="o">=</span> <span class="nn">HashMap</span><span class="p">::</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i64</span><span class="p">,</span> <span class="nb">i64</span><span class="p">,</span> <span class="nb">i64</span><span class="p">,</span> <span class="nb">i64</span><span class="p">),</span> <span class="nb">i64</span><span class="o">&gt;</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>

    <span class="k">let</span> <span class="n">sol</span> <span class="o">=</span> <span class="n">secrets</span>
        <span class="nf">.iter</span><span class="p">()</span>
        <span class="nf">.fold</span><span class="p">(</span><span class="o">&amp;</span> <span class="k">mut</span> <span class="n">banana_count</span><span class="p">,</span> <span class="p">|</span> <span class="n">current_banana_count</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">secret</span><span class="p">|</span> <span class="p">{</span>
            <span class="nf">evolution</span><span class="p">(</span><span class="n">current_banana_count</span><span class="p">,</span> <span class="n">secret</span><span class="p">,</span> <span class="mi">2000</span><span class="p">)</span>
        <span class="p">})</span>
        <span class="nf">.iter</span><span class="p">()</span>
        <span class="nf">.max_by_key</span><span class="p">(|</span><span class="o">&amp;</span><span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">count</span><span class="p">)|</span> <span class="n">count</span><span class="p">)</span>
        <span class="nf">.unwrap</span><span class="p">();</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"solution part 2: {:?}"</span><span class="p">,</span> <span class="n">sol</span><span class="p">);</span>


<span class="p">}</span>

<span class="k">fn</span> <span class="nf">evolve_once</span><span class="p">(</span><span class="k">mut</span> <span class="n">secret_number</span><span class="p">:</span> <span class="nb">i64</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">i64</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">secret_number</span><span class="nf">.wrapping_mul</span><span class="p">(</span><span class="mi">64</span><span class="p">);</span>
    <span class="n">secret_number</span> <span class="o">^=</span> <span class="n">tmp</span><span class="p">;</span>
    <span class="n">secret_number</span> <span class="o">%=</span> <span class="mi">16777216</span><span class="p">;</span>

    <span class="k">let</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">secret_number</span> <span class="o">/</span> <span class="mi">32</span><span class="p">;</span>
    <span class="n">secret_number</span> <span class="o">^=</span> <span class="n">tmp</span><span class="p">;</span>
    <span class="n">secret_number</span> <span class="o">%=</span> <span class="mi">16777216</span><span class="p">;</span>

    <span class="k">let</span> <span class="n">tmp</span> <span class="o">=</span> <span class="n">secret_number</span><span class="nf">.wrapping_mul</span><span class="p">(</span><span class="mi">2048</span><span class="p">);</span>
    <span class="n">secret_number</span> <span class="o">^=</span> <span class="n">tmp</span><span class="p">;</span>
    <span class="n">secret_number</span> <span class="o">%=</span> <span class="mi">16777216</span><span class="p">;</span>

    <span class="n">secret_number</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">evolve_repeated_loop</span><span class="p">(</span><span class="k">mut</span> <span class="n">secret_number</span><span class="p">:</span> <span class="nb">i64</span><span class="p">,</span> <span class="n">times</span><span class="p">:</span> <span class="nb">i64</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">i64</span> <span class="p">{</span>
    <span class="k">for</span> <span class="n">_</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">times</span> <span class="p">{</span>
        <span class="n">secret_number</span> <span class="o">=</span> <span class="nf">evolve_once</span><span class="p">(</span><span class="n">secret_number</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="n">secret_number</span>
<span class="p">}</span>


<span class="k">fn</span> <span class="nf">evolution</span><span class="p">(</span>
    <span class="n">lut</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i64</span><span class="p">,</span> <span class="nb">i64</span><span class="p">,</span> <span class="nb">i64</span><span class="p">,</span> <span class="nb">i64</span><span class="p">),</span> <span class="nb">i64</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="k">mut</span> <span class="n">secret_number</span><span class="p">:</span> <span class="nb">i64</span><span class="p">,</span>
    <span class="n">times</span><span class="p">:</span> <span class="nb">usize</span><span class="p">,</span>
<span class="p">)</span> <span class="k">-&gt;</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i64</span><span class="p">,</span> <span class="nb">i64</span><span class="p">,</span> <span class="nb">i64</span><span class="p">,</span> <span class="nb">i64</span><span class="p">),</span> <span class="nb">i64</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">vec</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">with_capacity</span><span class="p">(</span><span class="n">times</span><span class="p">);</span>
    <span class="k">for</span> <span class="n">_</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">times</span> <span class="p">{</span>
        <span class="n">secret_number</span> <span class="o">=</span> <span class="nf">evolve_once</span><span class="p">(</span><span class="n">secret_number</span><span class="p">);</span>
        <span class="n">vec</span><span class="nf">.push</span><span class="p">(</span><span class="n">secret_number</span> <span class="o">%</span> <span class="mi">10</span><span class="p">);</span>
    <span class="p">}</span>
    
    <span class="k">let</span> <span class="k">mut</span> <span class="n">local_lookup</span> <span class="o">=</span> <span class="nn">HashMap</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
    
    <span class="k">for</span> <span class="n">window</span> <span class="k">in</span> <span class="n">vec</span><span class="nf">.windows</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">key</span> <span class="o">=</span> <span class="p">(</span>
            <span class="n">window</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">window</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
            <span class="n">window</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">-</span> <span class="n">window</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
            <span class="n">window</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">-</span> <span class="n">window</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
            <span class="n">window</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">-</span> <span class="n">window</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span>
        <span class="p">);</span>
        <span class="k">let</span> <span class="n">value</span> <span class="o">=</span> <span class="n">window</span><span class="p">[</span><span class="mi">4</span><span class="p">];</span>
        
        <span class="k">if</span> <span class="o">!</span><span class="n">local_lookup</span><span class="nf">.contains_key</span><span class="p">(</span><span class="o">&amp;</span><span class="n">key</span><span class="p">)</span> <span class="p">{</span>
            <span class="o">*</span><span class="n">lut</span><span class="nf">.entry</span><span class="p">(</span><span class="n">key</span><span class="p">)</span><span class="nf">.or_insert</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">+=</span> <span class="n">value</span><span class="p">;</span>
            <span class="n">local_lookup</span><span class="nf">.insert</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
    
    <span class="n">lut</span>
<span class="p">}</span>

</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 97/100 - aoc2024 day 8</title><link href="https://maebli.github.io/archive/2024-12-19-100rust-97/" rel="alternate" type="text/html" title="Rust challenge 97/100 - aoc2024 day 8" /><published>2024-12-19T22:00:00+00:00</published><updated>2024-12-19T22:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-97</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-19-100rust-97/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#97th-challenge">97th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="97th-challenge">97th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>“Today”’s challenge is day 8 of advent of code 2024.</p>

<h3 id="solution">Solution</h3>

<p>I finally got around to part two of <a href="https://adventofcode.com/2024/day/5">day 8 of advent of code 2024</a>.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::{</span><span class="n">HashMap</span><span class="p">,</span> <span class="n">HashSet</span><span class="p">};</span>

<span class="nd">#[derive(Debug,</span> <span class="nd">Clone,</span> <span class="nd">PartialEq,</span> <span class="nd">Eq,</span> <span class="nd">Hash)]</span>
<span class="k">struct</span> <span class="n">Position</span> <span class="p">{</span>
    <span class="n">x</span><span class="p">:</span> <span class="nb">i64</span><span class="p">,</span>
    <span class="n">y</span><span class="p">:</span> <span class="nb">i64</span><span class="p">,</span>
<span class="p">}</span>

<span class="nd">#[derive(Debug,</span> <span class="nd">Clone)]</span>
<span class="k">struct</span> <span class="n">Roof</span> <span class="p">{</span>
    <span class="n">antennas</span><span class="p">:</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="nb">char</span><span class="p">,</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Position</span><span class="o">&gt;&gt;</span><span class="p">,</span>
    <span class="n">spots</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Position</span><span class="o">&gt;</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0i64</span><span class="p">;</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0i64</span><span class="p">;</span>

    <span class="k">let</span> <span class="n">roof</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span>
        <span class="n">Roof</span> <span class="p">{</span>
            <span class="n">antennas</span><span class="p">:</span> <span class="nn">HashMap</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
            <span class="n">spots</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[],</span>
        <span class="p">},</span>
        <span class="p">|</span><span class="k">mut</span> <span class="n">roof</span><span class="p">,</span> <span class="n">spot</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">match</span> <span class="n">spot</span> <span class="p">{</span>
                <span class="sc">'.'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="n">roof</span><span class="py">.spots</span><span class="nf">.push</span><span class="p">(</span><span class="n">Position</span> <span class="p">{</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="p">});</span>
                    <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="sc">'\n'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
                    <span class="n">y</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="n">spot</span> <span class="k">if</span> <span class="n">spot</span><span class="nf">.is_alphanumeric</span><span class="p">()</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="k">let</span> <span class="n">new_spot</span> <span class="o">=</span> <span class="n">Position</span> <span class="p">{</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="p">};</span>
                    <span class="k">let</span> <span class="n">antenna_positions</span> <span class="o">=</span> <span class="n">roof</span><span class="py">.antennas</span><span class="nf">.entry</span><span class="p">(</span><span class="n">spot</span><span class="p">)</span><span class="nf">.or_insert</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[]);</span>
                    <span class="n">antenna_positions</span><span class="nf">.push</span><span class="p">(</span><span class="n">new_spot</span><span class="nf">.clone</span><span class="p">());</span>
                    <span class="n">roof</span><span class="py">.spots</span><span class="nf">.push</span><span class="p">(</span><span class="n">new_spot</span><span class="p">);</span>
                    <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="n">_</span> <span class="k">=&gt;</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"Invalid character"</span><span class="p">),</span>
            <span class="p">}</span>
            <span class="n">roof</span>
        <span class="p">},</span>
    <span class="p">);</span>

    <span class="k">let</span> <span class="n">anti_nodes</span> <span class="o">=</span>
        <span class="n">roof</span><span class="py">.antennas</span>
            <span class="nf">.into_values</span><span class="p">()</span>
            <span class="nf">.fold</span><span class="p">(</span><span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span> <span class="p">|</span><span class="n">anti_nodes</span><span class="p">,</span> <span class="n">antenna_positions</span><span class="p">|</span> <span class="p">{</span>
                <span class="k">let</span> <span class="n">pairs</span> <span class="o">=</span> <span class="n">antenna_positions</span>
                    <span class="nf">.iter</span><span class="p">()</span>
                    <span class="nf">.enumerate</span><span class="p">()</span>
                    <span class="nf">.flat_map</span><span class="p">(|(</span><span class="n">i</span><span class="p">,</span> <span class="n">a</span><span class="p">)|</span> <span class="n">antenna_positions</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.skip</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span><span class="nf">.map</span><span class="p">(</span><span class="k">move</span> <span class="p">|</span><span class="n">b</span><span class="p">|</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)));</span>

                <span class="k">let</span> <span class="n">new_anti_nodes</span> <span class="o">=</span> <span class="n">pairs</span><span class="nf">.fold</span><span class="p">(</span><span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span> <span class="p">|</span><span class="k">mut</span> <span class="n">new_anti_nodes</span><span class="p">,</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)|</span> <span class="p">{</span>
                    <span class="k">let</span> <span class="k">mut</span> <span class="n">loop_num</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
                    <span class="k">loop</span> <span class="p">{</span>
                        <span class="k">let</span> <span class="n">delta</span> <span class="o">=</span> <span class="n">Position</span> <span class="p">{</span>
                            <span class="n">x</span><span class="p">:</span> <span class="n">b</span><span class="py">.x</span> <span class="o">-</span> <span class="n">a</span><span class="py">.x</span><span class="p">,</span>
                            <span class="n">y</span><span class="p">:</span> <span class="n">b</span><span class="py">.y</span> <span class="o">-</span> <span class="n">a</span><span class="py">.y</span><span class="p">,</span>
                        <span class="p">};</span>
                        <span class="k">let</span> <span class="p">(</span><span class="n">new_a</span><span class="p">,</span> <span class="n">new_b</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span>
                            <span class="n">Position</span> <span class="p">{</span>
                                <span class="n">x</span><span class="p">:</span> <span class="n">a</span><span class="py">.x</span> <span class="o">+</span> <span class="n">delta</span><span class="py">.x</span> <span class="o">*</span> <span class="n">loop_num</span><span class="p">,</span>
                                <span class="n">y</span><span class="p">:</span> <span class="n">a</span><span class="py">.y</span> <span class="o">+</span> <span class="n">delta</span><span class="py">.y</span> <span class="o">*</span> <span class="n">loop_num</span><span class="p">,</span>
                            <span class="p">},</span>
                            <span class="n">Position</span> <span class="p">{</span>
                                <span class="n">x</span><span class="p">:</span> <span class="n">b</span><span class="py">.x</span> <span class="o">-</span> <span class="n">delta</span><span class="py">.x</span> <span class="o">*</span> <span class="n">loop_num</span><span class="p">,</span>
                                <span class="n">y</span><span class="p">:</span> <span class="n">b</span><span class="py">.y</span> <span class="o">-</span> <span class="n">delta</span><span class="py">.y</span> <span class="o">*</span> <span class="n">loop_num</span><span class="p">,</span>
                            <span class="p">},</span>
                        <span class="p">);</span>

                        <span class="k">let</span> <span class="k">mut</span> <span class="n">new_spots</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
                        <span class="k">if</span> <span class="n">roof</span><span class="py">.spots</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_a</span><span class="p">)</span> <span class="p">{</span>
                            <span class="n">new_anti_nodes</span><span class="nf">.insert</span><span class="p">(</span><span class="n">new_a</span><span class="p">);</span>
                            <span class="n">new_spots</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                        <span class="p">}</span>
                        <span class="k">if</span> <span class="n">roof</span><span class="py">.spots</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_b</span><span class="p">)</span> <span class="p">{</span>
                            <span class="n">new_anti_nodes</span><span class="nf">.insert</span><span class="p">(</span><span class="n">new_b</span><span class="p">);</span>
                            <span class="n">new_spots</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                        <span class="p">}</span>

                        <span class="k">if</span> <span class="n">new_spots</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
                            <span class="k">break</span><span class="p">;</span>
                        <span class="p">}</span>

                        <span class="n">loop_num</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                    <span class="p">}</span>
                    <span class="n">new_anti_nodes</span>
                <span class="p">});</span>

                <span class="n">anti_nodes</span><span class="nf">.union</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_anti_nodes</span><span class="p">)</span><span class="nf">.cloned</span><span class="p">()</span><span class="nf">.collect</span><span class="p">()</span>
            <span class="p">});</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">anti_nodes</span><span class="nf">.len</span><span class="p">());</span>
<span class="p">}</span>

</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 96/100 - aoc2024 day 5</title><link href="https://maebli.github.io/archive/2024-12-19-100rust-96/" rel="alternate" type="text/html" title="Rust challenge 96/100 - aoc2024 day 5" /><published>2024-12-19T12:00:00+00:00</published><updated>2024-12-19T12:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-96</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-19-100rust-96/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#96th-challenge">96th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="96th-challenge">96th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>I finally got around to part two of <a href="https://adventofcode.com/2024/day/5">day 5 of advent of code 2024</a>.</p>

<h3 id="solution">Solution</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">cmp</span><span class="p">::</span><span class="n">Ordering</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashMap</span><span class="p">;</span>

<span class="nd">#[derive(PartialEq,</span> <span class="nd">Eq,</span> <span class="nd">Debug)]</span>
<span class="k">struct</span> <span class="n">Update</span><span class="o">&lt;</span><span class="nv">'a</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="n">page_number</span><span class="p">:</span> <span class="nb">u64</span><span class="p">,</span>
    <span class="n">rules</span><span class="p">:</span> <span class="o">&amp;</span><span class="nv">'a</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="nb">u64</span><span class="p">,</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;&gt;</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">impl</span><span class="o">&lt;</span><span class="nv">'a</span><span class="o">&gt;</span> <span class="nb">PartialOrd</span> <span class="k">for</span> <span class="n">Update</span><span class="o">&lt;</span><span class="nv">'a</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">partial_cmp</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">other</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">Self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Option</span><span class="o">&lt;</span><span class="n">Ordering</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="nf">Some</span><span class="p">(</span><span class="k">self</span><span class="nf">.cmp</span><span class="p">(</span><span class="n">other</span><span class="p">))</span>
    <span class="p">}</span>
<span class="p">}</span>
<span class="k">impl</span><span class="o">&lt;</span><span class="nv">'a</span><span class="o">&gt;</span> <span class="nb">Ord</span> <span class="k">for</span> <span class="n">Update</span><span class="o">&lt;</span><span class="nv">'a</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">cmp</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">other</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">Self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Ordering</span> <span class="p">{</span>
        <span class="k">if</span> <span class="k">self</span> <span class="o">==</span> <span class="n">other</span> <span class="p">{</span>
            <span class="nn">Ordering</span><span class="p">::</span><span class="n">Equal</span>
        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="n">rule</span><span class="p">)</span> <span class="o">=</span> <span class="k">self</span><span class="py">.rules</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="py">.page_number</span><span class="p">)</span> <span class="p">{</span>
           <span class="k">if</span> <span class="n">rule</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">other</span><span class="py">.page_number</span><span class="p">)</span> <span class="p">{</span>
               <span class="nn">Ordering</span><span class="p">::</span><span class="n">Less</span>
           <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
               <span class="nn">Ordering</span><span class="p">::</span><span class="n">Greater</span>
           <span class="p">}</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="nn">Ordering</span><span class="p">::</span><span class="n">Greater</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">input</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.split</span><span class="p">(</span><span class="s">"</span><span class="se">\n\n</span><span class="s">"</span><span class="p">);</span>
    <span class="k">let</span> <span class="n">rules</span> <span class="o">=</span> <span class="n">input</span>
        <span class="nf">.next</span><span class="p">()</span>
        <span class="nf">.unwrap</span><span class="p">()</span>
        <span class="nf">.split</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.split</span><span class="p">(</span><span class="s">"|"</span><span class="p">);</span>
            <span class="p">(</span>
                <span class="n">x</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span>
                <span class="n">x</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span>
            <span class="p">)</span>
        <span class="p">})</span>
        <span class="nf">.fold</span><span class="p">(</span><span class="nn">HashMap</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span> <span class="p">|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">:</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="nb">u64</span><span class="p">,</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;&gt;</span><span class="p">,</span> <span class="n">x</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">if</span> <span class="n">acc</span><span class="nf">.contains_key</span><span class="p">(</span><span class="o">&amp;</span><span class="n">x</span><span class="na">.0</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">acc</span><span class="nf">.get_mut</span><span class="p">(</span><span class="o">&amp;</span><span class="n">x</span><span class="na">.0</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.push</span><span class="p">(</span><span class="n">x</span><span class="na">.1</span><span class="p">);</span>
            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                <span class="n">acc</span><span class="nf">.insert</span><span class="p">(</span><span class="n">x</span><span class="na">.0</span><span class="p">,</span> <span class="nd">vec!</span><span class="p">[</span><span class="n">x</span><span class="na">.1</span><span class="p">]);</span>
            <span class="p">};</span>
            <span class="n">acc</span>
        <span class="p">});</span>

    <span class="k">let</span> <span class="n">updates</span> <span class="o">=</span> <span class="n">input</span>
        <span class="nf">.next</span><span class="p">()</span>
        <span class="nf">.unwrap</span><span class="p">()</span>
        <span class="nf">.split</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.split</span><span class="p">(</span><span class="s">","</span><span class="p">);</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">out</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>
            <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="n">x</span> <span class="p">{</span>
                <span class="n">out</span><span class="nf">.push</span><span class="p">(</span><span class="n">Update</span> <span class="p">{</span>
                    <span class="n">page_number</span><span class="p">:</span> <span class="n">i</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span>
                    <span class="n">rules</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">rules</span><span class="p">,</span>
                <span class="p">});</span>
            <span class="p">}</span>
            <span class="n">out</span>
        <span class="p">})</span>
        <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;&gt;</span><span class="p">();</span>


    <span class="k">let</span> <span class="k">mut</span> <span class="n">sum_of_middle_unsorted</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">sum_of_middle_sorted</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span> <span class="k">mut</span> <span class="n">update</span> <span class="k">in</span> <span class="n">updates</span> <span class="p">{</span>

         <span class="k">if</span> <span class="o">!</span><span class="n">update</span><span class="nf">.windows</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="nf">.all</span><span class="p">(|</span><span class="n">w</span><span class="p">|</span> <span class="n">w</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">w</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="p">{</span>
            <span class="n">update</span><span class="nf">.sort</span><span class="p">();</span>
            <span class="k">let</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">update</span><span class="nf">.len</span><span class="p">()</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
            <span class="n">sum_of_middle_sorted</span> <span class="o">+=</span> <span class="n">update</span><span class="p">[</span><span class="n">mid</span><span class="p">]</span><span class="py">.page_number</span><span class="p">;</span>
        <span class="p">}</span> <span class="k">else</span><span class="p">{</span>
            <span class="k">let</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">update</span><span class="nf">.len</span><span class="p">()</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
            <span class="n">sum_of_middle_unsorted</span> <span class="o">+=</span> <span class="n">update</span><span class="p">[</span><span class="n">mid</span><span class="p">]</span><span class="py">.page_number</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">sum_of_middle_unsorted</span><span class="p">);</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">sum_of_middle_sorted</span><span class="p">);</span>
<span class="p">}</span>


</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 95/100 - aoc2024 day 14</title><link href="https://maebli.github.io/archive/2024-12-19-100rust-95/" rel="alternate" type="text/html" title="Rust challenge 95/100 - aoc2024 day 14" /><published>2024-12-19T12:00:00+00:00</published><updated>2024-12-19T12:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-95</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-19-100rust-95/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#95th-challenge">95th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="95th-challenge">95th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>I finally got around to <a href="https://adventofcode.com/2024/day/14">day 14 of advent of code</a>.</p>

<h3 id="solution">Solution</h3>

<p>Part 2 kept me quite busy. Because of the info about quadrants, I kept looking for symmetry. Until I just got annoyed and printed it to file and did a visual search with scrolling.</p>

<p><em>Scroll…scroll…scroll…</em>
<em>Several minutes later</em>
<img src="/assets/img/tree.png" alt="" /></p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">pathfinding</span><span class="p">::</span><span class="nn">prelude</span><span class="p">::{</span><span class="n">count_paths</span><span class="p">};</span>
<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">io</span><span class="p">::</span><span class="n">Write</span><span class="p">;</span>
<span class="nd">#[derive(Debug,</span> <span class="nd">Clone,</span> <span class="nd">PartialOrd,</span> <span class="nd">PartialEq,</span> <span class="nd">Ord,</span> <span class="nd">Eq)]</span>
<span class="k">struct</span> <span class="nf">Pos</span><span class="p">(</span><span class="nb">u32</span><span class="p">,</span> <span class="nb">u32</span><span class="p">);</span>

<span class="nd">#[derive(Debug,</span> <span class="nd">Clone)]</span>
<span class="k">struct</span> <span class="nf">Velocity</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">);</span>

<span class="nd">#[derive(Debug,</span> <span class="nd">Clone)]</span>
<span class="k">struct</span> <span class="n">Robot</span> <span class="p">{</span>
    <span class="n">pos</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span>
    <span class="n">vel</span><span class="p">:</span> <span class="n">Velocity</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">enum</span> <span class="n">Quadrant</span> <span class="p">{</span>
    <span class="n">TopRight</span><span class="p">,</span>
    <span class="n">TopLeft</span><span class="p">,</span>
    <span class="n">BottomRight</span><span class="p">,</span>
    <span class="n">BottomLeft</span><span class="p">,</span>
    <span class="nb">None</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">impl</span> <span class="n">Robot</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">next</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span> <span class="n">max_pos</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Pos</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">max_x</span> <span class="o">=</span> <span class="n">max_pos</span><span class="na">.0</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
        <span class="k">let</span> <span class="n">max_y</span> <span class="o">=</span> <span class="n">max_pos</span><span class="na">.1</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>

        <span class="k">let</span> <span class="n">new_x</span> <span class="o">=</span> <span class="p">(</span><span class="k">self</span><span class="py">.pos</span><span class="na">.0</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">+</span> <span class="k">self</span><span class="py">.vel</span><span class="na">.0</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">)</span><span class="nf">.rem_euclid</span><span class="p">(</span><span class="n">max_x</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u32</span><span class="p">;</span>
        <span class="k">let</span> <span class="n">new_y</span> <span class="o">=</span> <span class="p">(</span><span class="k">self</span><span class="py">.pos</span><span class="na">.1</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">+</span> <span class="k">self</span><span class="py">.vel</span><span class="na">.1</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">)</span><span class="nf">.rem_euclid</span><span class="p">(</span><span class="n">max_y</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u32</span><span class="p">;</span>

        <span class="k">self</span><span class="py">.pos</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">new_x</span><span class="p">,</span> <span class="n">new_y</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">impl</span> <span class="n">Pos</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">get_quadrant</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">max_pos</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Pos</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Quadrant</span> <span class="p">{</span>
        <span class="k">if</span> <span class="k">self</span><span class="na">.0</span> <span class="o">&gt;</span> <span class="n">max_pos</span><span class="na">.0</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">&amp;&amp;</span> <span class="k">self</span><span class="na">.1</span> <span class="o">&gt;</span> <span class="n">max_pos</span><span class="na">.1</span> <span class="o">/</span> <span class="mi">2</span> <span class="p">{</span>
            <span class="nn">Quadrant</span><span class="p">::</span><span class="n">TopRight</span>
        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="k">self</span><span class="na">.0</span> <span class="o">&lt;</span> <span class="n">max_pos</span><span class="na">.0</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">&amp;&amp;</span> <span class="k">self</span><span class="na">.1</span> <span class="o">&gt;</span> <span class="n">max_pos</span><span class="na">.1</span> <span class="o">/</span> <span class="mi">2</span> <span class="p">{</span>
            <span class="nn">Quadrant</span><span class="p">::</span><span class="n">TopLeft</span>
        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="k">self</span><span class="na">.0</span> <span class="o">&gt;</span> <span class="n">max_pos</span><span class="na">.0</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">&amp;&amp;</span> <span class="k">self</span><span class="na">.1</span> <span class="o">&lt;</span> <span class="n">max_pos</span><span class="na">.1</span> <span class="o">/</span> <span class="mi">2</span> <span class="p">{</span>
            <span class="nn">Quadrant</span><span class="p">::</span><span class="n">BottomRight</span>
        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="k">self</span><span class="na">.0</span> <span class="o">&lt;</span> <span class="n">max_pos</span><span class="na">.0</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">&amp;&amp;</span> <span class="k">self</span><span class="na">.1</span> <span class="o">&lt;</span> <span class="n">max_pos</span><span class="na">.1</span> <span class="o">/</span> <span class="mi">2</span> <span class="p">{</span>
            <span class="nn">Quadrant</span><span class="p">::</span><span class="n">BottomLeft</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="nn">Quadrant</span><span class="p">::</span><span class="nb">None</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>


<span class="k">fn</span> <span class="nf">print_bots_to_file</span><span class="p">(</span><span class="n">time</span><span class="p">:</span><span class="nb">i32</span><span class="p">,</span><span class="n">bots</span><span class="p">:</span> <span class="o">&amp;</span><span class="p">[</span><span class="n">Robot</span><span class="p">],</span> <span class="n">max_pos</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Pos</span><span class="p">,</span> <span class="n">file_name</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">grid</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'.'</span><span class="p">;</span> <span class="n">max_pos</span><span class="na">.0</span> <span class="k">as</span> <span class="nb">usize</span> <span class="o">+</span> <span class="mi">1</span><span class="p">];</span> <span class="n">max_pos</span><span class="na">.1</span> <span class="k">as</span> <span class="nb">usize</span> <span class="o">+</span> <span class="mi">1</span><span class="p">];</span>
    <span class="k">for</span> <span class="n">bot</span> <span class="k">in</span> <span class="n">bots</span> <span class="p">{</span>
        <span class="n">grid</span><span class="p">[</span><span class="n">bot</span><span class="py">.pos</span><span class="na">.1</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">][</span><span class="n">bot</span><span class="py">.pos</span><span class="na">.0</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">]</span> <span class="o">=</span> <span class="sc">'#'</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">file</span> <span class="o">=</span> <span class="nn">std</span><span class="p">::</span><span class="nn">fs</span><span class="p">::</span><span class="nn">OpenOptions</span><span class="p">::</span><span class="nf">new</span><span class="p">()</span>
        <span class="nf">.append</span><span class="p">(</span><span class="k">true</span><span class="p">)</span>
        <span class="nf">.create</span><span class="p">(</span><span class="k">true</span><span class="p">)</span>
        <span class="nf">.open</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span>
        <span class="nf">.unwrap</span><span class="p">();</span>
    
    <span class="nd">writeln!</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="s">"{}"</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
    <span class="k">for</span> <span class="n">row</span> <span class="k">in</span> <span class="n">grid</span> <span class="p">{</span>
        <span class="nd">writeln!</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="s">"{}"</span><span class="p">,</span> <span class="n">row</span><span class="nf">.iter</span><span class="p">()</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">String</span><span class="o">&gt;</span><span class="p">())</span><span class="nf">.unwrap</span><span class="p">();</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">bots</span> <span class="o">=</span> <span class="n">input</span>
        <span class="nf">.lines</span><span class="p">()</span>
        <span class="nf">.map</span><span class="p">(|</span><span class="n">line</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">parts</span> <span class="o">=</span> <span class="n">line</span><span class="nf">.split</span><span class="p">(|</span><span class="n">c</span><span class="p">|</span> <span class="n">c</span> <span class="o">==</span> <span class="sc">'='</span> <span class="p">||</span> <span class="n">c</span> <span class="o">==</span> <span class="sc">','</span> <span class="p">||</span> <span class="n">c</span> <span class="o">==</span> <span class="sc">' '</span><span class="p">);</span>
            <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">parts</span><span class="nf">.nth</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
            <span class="k">let</span> <span class="n">y</span> <span class="o">=</span> <span class="n">parts</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
            <span class="k">let</span> <span class="n">vx</span> <span class="o">=</span> <span class="n">parts</span><span class="nf">.nth</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
            <span class="k">let</span> <span class="n">vy</span> <span class="o">=</span> <span class="n">parts</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
            <span class="n">Robot</span> <span class="p">{</span>
                <span class="n">pos</span><span class="p">:</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">),</span>
                <span class="n">vel</span><span class="p">:</span> <span class="nf">Velocity</span><span class="p">(</span><span class="n">vx</span><span class="p">,</span> <span class="n">vy</span><span class="p">),</span>
            <span class="p">}</span>
        <span class="p">})</span>
        <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;&gt;</span><span class="p">();</span>

    <span class="k">let</span> <span class="n">simulation_time</span> <span class="o">=</span> <span class="mi">10_000</span><span class="p">;</span> 
    <span class="k">let</span> <span class="n">max_pos</span> <span class="o">=</span> <span class="o">&amp;</span><span class="nf">Pos</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">102</span><span class="p">);</span>
    <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">simulation_time</span> <span class="p">{</span>
        <span class="k">for</span> <span class="n">bot</span> <span class="k">in</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">bots</span> <span class="p">{</span>
            <span class="n">bot</span><span class="nf">.next</span><span class="p">(</span><span class="n">max_pos</span><span class="p">);</span>
        <span class="p">}</span>

            <span class="k">let</span> <span class="n">quadrant_counts</span> <span class="o">=</span> <span class="n">bots</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.fold</span><span class="p">([</span><span class="mi">0</span><span class="p">;</span> <span class="mi">4</span><span class="p">],</span> <span class="p">|</span><span class="k">mut</span> <span class="n">counts</span><span class="p">,</span> <span class="n">bot</span><span class="p">|</span> <span class="p">{</span>
                <span class="k">match</span> <span class="n">bot</span><span class="py">.pos</span><span class="nf">.get_quadrant</span><span class="p">(</span><span class="n">max_pos</span><span class="p">)</span> <span class="p">{</span>
                    <span class="nn">Quadrant</span><span class="p">::</span><span class="n">TopLeft</span> <span class="k">=&gt;</span> <span class="n">counts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="nn">Quadrant</span><span class="p">::</span><span class="n">TopRight</span> <span class="k">=&gt;</span> <span class="n">counts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="nn">Quadrant</span><span class="p">::</span><span class="n">BottomRight</span> <span class="k">=&gt;</span> <span class="n">counts</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="nn">Quadrant</span><span class="p">::</span><span class="n">BottomLeft</span> <span class="k">=&gt;</span> <span class="n">counts</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="nn">Quadrant</span><span class="p">::</span><span class="nb">None</span> <span class="k">=&gt;</span> <span class="p">(),</span>
                <span class="p">}</span>
                <span class="n">counts</span>
            <span class="p">});</span>
        <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">99</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">quandrant_product</span> <span class="o">=</span> <span class="n">quadrant_counts</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="p">|</span><span class="n">acc</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">count</span><span class="p">|</span> <span class="n">acc</span> <span class="o">*</span> <span class="n">count</span><span class="p">);</span>
            <span class="nd">println!</span><span class="p">(</span><span class="s">"Quadrant product: {}"</span><span class="p">,</span> <span class="n">quandrant_product</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nd">println!</span><span class="p">(</span><span class="s">"Time: {}"</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
        <span class="nf">print_bots_to_file</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="o">&amp;</span><span class="n">bots</span><span class="p">,</span> <span class="n">max_pos</span><span class="p">,</span> <span class="s">"images.txt"</span><span class="p">);</span>

    <span class="p">}</span>
<span class="p">}</span>


</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 94/100 - aoc2024 day 19</title><link href="https://maebli.github.io/archive/2024-12-19-100rust-94/" rel="alternate" type="text/html" title="Rust challenge 94/100 - aoc2024 day 19" /><published>2024-12-19T12:00:00+00:00</published><updated>2024-12-19T12:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-94</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-19-100rust-94/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#94th-challenge">94th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="94th-challenge">94th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Once again, the pathfinding crate does the heavy lifting. In all honesty, this feels a bit like cheating. :D <a href="https://adventofcode.com/2024/day/19">advent of code</a>.</p>

<h3 id="solution">Solution</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">pathfinding</span><span class="p">::</span><span class="nn">prelude</span><span class="p">::{</span><span class="n">count_paths</span><span class="p">};</span>


<span class="nd">#[derive(Debug,</span> <span class="nd">Clone,</span> <span class="nd">Copy,</span> <span class="nd">PartialEq,</span> <span class="nd">Eq,</span> <span class="nd">Hash)]</span>
<span class="k">struct</span> <span class="nf">Pos</span><span class="p">(</span><span class="nb">usize</span><span class="p">);</span>

<span class="k">impl</span> <span class="n">Pos</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">successors</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span><span class="n">parts</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="o">&gt;</span><span class="p">,</span><span class="n">full</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">max_length_parts</span> <span class="o">=</span> <span class="n">parts</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="nf">.len</span><span class="p">())</span><span class="nf">.max</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">result</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
        <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">1</span><span class="o">..</span><span class="n">max_length_parts</span><span class="o">+</span><span class="mi">1</span><span class="p">{</span>
            <span class="k">let</span> <span class="n">next</span> <span class="o">=</span> <span class="n">full</span><span class="nf">.get</span><span class="p">(</span><span class="k">self</span><span class="na">.0</span><span class="o">..</span><span class="k">self</span><span class="na">.0</span><span class="o">+</span><span class="n">i</span><span class="p">);</span>
            <span class="k">if</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="n">next</span><span class="p">)</span> <span class="o">=</span> <span class="n">next</span> <span class="p">{</span>
                <span class="k">for</span> <span class="n">part</span> <span class="k">in</span> <span class="n">parts</span><span class="nf">.iter</span><span class="p">(){</span>
                    <span class="k">if</span> <span class="n">next</span> <span class="o">==</span> <span class="o">*</span><span class="n">part</span> <span class="p">{</span>
                        <span class="n">result</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="k">self</span><span class="na">.0</span><span class="o">+</span><span class="n">i</span><span class="p">));</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="n">result</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">split_input</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.split</span><span class="p">(</span><span class="s">"</span><span class="se">\n\n</span><span class="s">"</span><span class="p">);</span>

    <span class="k">let</span> <span class="n">parts</span> <span class="o">=</span> <span class="n">split_input</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.split</span><span class="p">(</span><span class="s">", "</span><span class="p">)</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;&gt;</span><span class="p">();</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">parts</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">possible_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">possibility_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> 
    <span class="k">for</span> <span class="n">line</span> <span class="k">in</span> <span class="n">split_input</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.lines</span><span class="p">(){</span>

        <span class="k">let</span> <span class="n">n</span> <span class="o">=</span> <span class="nf">count_paths</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="p">|</span><span class="n">p</span><span class="p">|</span> <span class="n">p</span><span class="nf">.successors</span><span class="p">(</span><span class="o">&amp;</span><span class="n">parts</span><span class="p">,</span><span class="o">&amp;</span><span class="n">line</span><span class="p">),</span> <span class="p">|</span><span class="n">p</span><span class="p">|</span> <span class="n">p</span><span class="na">.0</span> <span class="o">==</span> <span class="n">line</span><span class="nf">.len</span><span class="p">());</span>

        <span class="k">if</span> <span class="n">n</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">{</span>
            <span class="n">possible_count</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">possibility_count</span> <span class="o">+=</span> <span class="n">n</span><span class="p">;</span>

    <span class="p">}</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"Possible count: {}"</span><span class="p">,</span> <span class="n">possible_count</span><span class="p">);</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"Possibility count: {}"</span><span class="p">,</span> <span class="n">possibility_count</span><span class="p">);</span>

<span class="p">}</span>


</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 93/100 - aoc2024 day 18</title><link href="https://maebli.github.io/archive/2024-12-18-100rust-93/" rel="alternate" type="text/html" title="Rust challenge 93/100 - aoc2024 day 18" /><published>2024-12-18T15:00:00+00:00</published><updated>2024-12-18T15:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-93</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-18-100rust-93/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#93rd-challenge">93rd Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="93rd-challenge">93rd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I did day18, it was easy :) <a href="https://adventofcode.com/2024/day/18">advent of code</a>.</p>

<h3 id="solution">Solution</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">pathfinding</span><span class="p">::</span><span class="nn">prelude</span><span class="p">::</span><span class="n">dijkstra</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">std</span><span class="p">::{</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashSet</span><span class="p">,</span> <span class="n">vec</span><span class="p">};</span>

<span class="nd">#[derive(Debug,</span> <span class="nd">Clone,</span> <span class="nd">Copy,</span> <span class="nd">PartialEq,</span> <span class="nd">Eq,</span> <span class="nd">Hash)]</span>
<span class="k">struct</span> <span class="nf">Pos</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">);</span>

<span class="k">impl</span> <span class="nb">From</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="o">&gt;</span> <span class="k">for</span> <span class="n">Pos</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">from</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="k">Self</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">parts</span> <span class="o">=</span> <span class="n">s</span><span class="nf">.split</span><span class="p">(</span><span class="sc">','</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">parts</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">y</span> <span class="o">=</span> <span class="n">parts</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
        <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="nd">#[derive(Debug)]</span>
<span class="k">struct</span> <span class="n">Field</span> <span class="p">{</span>
    <span class="n">obstacles</span><span class="p">:</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">start</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span>
    <span class="n">end</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">impl</span> <span class="n">Field</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">legal_move</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">pos</span><span class="p">:</span> <span class="n">Pos</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
        <span class="n">pos</span><span class="na">.0</span> <span class="o">&gt;=</span> <span class="mi">0</span>
            <span class="o">&amp;&amp;</span> <span class="n">pos</span><span class="na">.0</span> <span class="o">&lt;=</span> <span class="k">self</span><span class="py">.end</span><span class="na">.0</span>
            <span class="o">&amp;&amp;</span> <span class="n">pos</span><span class="na">.1</span> <span class="o">&gt;=</span> <span class="mi">0</span>
            <span class="o">&amp;&amp;</span> <span class="n">pos</span><span class="na">.1</span> <span class="o">&lt;=</span> <span class="k">self</span><span class="py">.end</span><span class="na">.1</span>
            <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="k">self</span><span class="py">.obstacles</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">pos</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">impl</span> <span class="n">Pos</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">successors</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">field</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Field</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="n">Pos</span><span class="p">,</span> <span class="nb">usize</span><span class="p">)</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">moves</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>
        <span class="k">for</span> <span class="o">&amp;</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">)</span> <span class="k">in</span> <span class="o">&amp;</span><span class="p">[(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">),</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="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)]</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">new_pos</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="k">self</span><span class="na">.0</span> <span class="o">+</span> <span class="n">dx</span><span class="p">,</span> <span class="k">self</span><span class="na">.1</span> <span class="o">+</span> <span class="n">dy</span><span class="p">);</span>
            <span class="k">if</span> <span class="n">field</span><span class="nf">.legal_move</span><span class="p">(</span><span class="n">new_pos</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">moves</span><span class="nf">.push</span><span class="p">(</span><span class="n">new_pos</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="n">moves</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">p</span><span class="p">|</span> <span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span><span class="nf">.collect</span><span class="p">()</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>
    <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">l</span><span class="p">|</span> <span class="nn">Pos</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">l</span><span class="p">))</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;&gt;</span><span class="p">();</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">obstacles</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.rev</span><span class="p">()</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;&gt;</span><span class="p">();</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">field</span> <span class="o">=</span> <span class="n">Field</span> <span class="p">{</span>
        <span class="n">obstacles</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[]</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.collect</span><span class="p">(),</span>
        <span class="n">start</span><span class="p">:</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
        <span class="n">end</span><span class="p">:</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">70</span><span class="p">,</span> <span class="mi">70</span><span class="p">),</span>
    <span class="p">};</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">next_byte</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
    <span class="k">while</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="n">_</span><span class="p">)</span> <span class="o">=</span> <span class="nf">dijkstra</span><span class="p">(</span><span class="o">&amp;</span><span class="n">field</span><span class="py">.start</span><span class="p">,</span> <span class="p">|</span><span class="n">p</span><span class="p">|</span> <span class="n">p</span><span class="nf">.successors</span><span class="p">(</span><span class="o">&amp;</span><span class="n">field</span><span class="p">),</span> <span class="p">|</span><span class="n">p</span><span class="p">|</span> <span class="o">*</span><span class="n">p</span> <span class="o">==</span> <span class="n">field</span><span class="py">.end</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">next_byte</span> <span class="o">=</span> <span class="n">obstacles</span><span class="nf">.pop</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.clone</span><span class="p">();</span>
        <span class="n">field</span><span class="py">.obstacles</span><span class="nf">.insert</span><span class="p">(</span><span class="n">next_byte</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">next_byte</span><span class="p">);</span>
<span class="p">}</span>


</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 92/100 - aoc2024 day 17</title><link href="https://maebli.github.io/archive/2024-12-18-100rust-92/" rel="alternate" type="text/html" title="Rust challenge 92/100 - aoc2024 day 17" /><published>2024-12-18T15:00:00+00:00</published><updated>2024-12-18T15:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-92</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-18-100rust-92/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#92nd-challenge">92nd Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="92nd-challenge">92nd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I did day17. <a href="https://adventofcode.com/2024/day/17">advent of code</a>. This one was easier than yesterday.</p>

<h3 id="solution">Solution</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashMap</span><span class="p">;</span>

<span class="nd">#[derive(Debug)]</span>
<span class="k">struct</span> <span class="n">Computer</span> <span class="p">{</span>
    <span class="n">registers</span><span class="p">:</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">Register</span><span class="p">,</span> <span class="nb">u64</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">program</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="n">Instruction</span><span class="p">,</span> <span class="n">Operand</span><span class="p">)</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">pc</span><span class="p">:</span> <span class="nb">i64</span><span class="p">,</span>
    <span class="n">output</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">,</span>
<span class="p">}</span>

<span class="nd">#[derive(Debug)]</span>
<span class="k">enum</span> <span class="n">Instruction</span> <span class="p">{</span>
    <span class="n">ADV</span><span class="p">,</span>
    <span class="n">BXL</span><span class="p">,</span>
    <span class="n">BST</span><span class="p">,</span>
    <span class="n">JNZ</span><span class="p">,</span>
    <span class="n">BXC</span><span class="p">,</span>
    <span class="n">OUT</span><span class="p">,</span>
    <span class="n">BDV</span><span class="p">,</span>
    <span class="n">CDV</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">impl</span> <span class="nb">From</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span> <span class="k">for</span> <span class="n">Instruction</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">from</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">u64</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="k">Self</span> <span class="p">{</span>
        <span class="k">match</span> <span class="n">value</span> <span class="p">{</span>
            <span class="mi">0</span> <span class="k">=&gt;</span> <span class="nn">Instruction</span><span class="p">::</span><span class="n">ADV</span><span class="p">,</span>
            <span class="mi">1</span> <span class="k">=&gt;</span> <span class="nn">Instruction</span><span class="p">::</span><span class="n">BXL</span><span class="p">,</span>
            <span class="mi">2</span> <span class="k">=&gt;</span> <span class="nn">Instruction</span><span class="p">::</span><span class="n">BST</span><span class="p">,</span>
            <span class="mi">3</span> <span class="k">=&gt;</span> <span class="nn">Instruction</span><span class="p">::</span><span class="n">JNZ</span><span class="p">,</span>
            <span class="mi">4</span> <span class="k">=&gt;</span> <span class="nn">Instruction</span><span class="p">::</span><span class="n">BXC</span><span class="p">,</span>
            <span class="mi">5</span> <span class="k">=&gt;</span> <span class="nn">Instruction</span><span class="p">::</span><span class="n">OUT</span><span class="p">,</span>
            <span class="mi">6</span> <span class="k">=&gt;</span> <span class="nn">Instruction</span><span class="p">::</span><span class="n">BDV</span><span class="p">,</span>
            <span class="mi">7</span> <span class="k">=&gt;</span> <span class="nn">Instruction</span><span class="p">::</span><span class="n">CDV</span><span class="p">,</span>
            <span class="n">_</span> <span class="k">=&gt;</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"Unknown instruction"</span><span class="p">),</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="nd">#[derive(Debug,</span> <span class="nd">Clone,</span> <span class="nd">Copy,</span> <span class="nd">Hash,</span> <span class="nd">Eq,</span> <span class="nd">PartialEq)]</span>
<span class="k">enum</span> <span class="n">Register</span> <span class="p">{</span>
    <span class="n">A</span><span class="p">,</span>
    <span class="n">B</span><span class="p">,</span>
    <span class="n">C</span><span class="p">,</span>
<span class="p">}</span>

<span class="nd">#[derive(Debug)]</span>
<span class="k">enum</span> <span class="n">Operand</span> <span class="p">{</span>
    <span class="nf">LITERAL</span><span class="p">(</span><span class="nb">u64</span><span class="p">),</span>
    <span class="nf">REGISTER</span><span class="p">(</span><span class="n">Register</span><span class="p">),</span>
    <span class="n">_RESERVED</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">impl</span> <span class="n">Computer</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">next</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">p</span> <span class="o">=</span> <span class="k">self</span><span class="py">.program</span><span class="nf">.get</span><span class="p">(</span><span class="k">self</span><span class="py">.pc</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>

        <span class="k">let</span> <span class="n">o</span> <span class="o">=</span> <span class="k">match</span> <span class="n">p</span><span class="na">.1</span> <span class="p">{</span>
            <span class="nn">Operand</span><span class="p">::</span><span class="nf">LITERAL</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="n">value</span><span class="p">,</span>
            <span class="nn">Operand</span><span class="p">::</span><span class="nf">REGISTER</span><span class="p">(</span><span class="n">register</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="o">*</span><span class="k">self</span><span class="py">.registers</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="n">register</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">(),</span>
            <span class="nn">Operand</span><span class="p">::</span><span class="n">_RESERVED</span> <span class="k">=&gt;</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"Reserved operand"</span><span class="p">),</span>
        <span class="p">};</span>

        <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="o">*</span><span class="k">self</span><span class="py">.registers</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="nn">Register</span><span class="p">::</span><span class="n">A</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="o">*</span><span class="k">self</span><span class="py">.registers</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="nn">Register</span><span class="p">::</span><span class="n">B</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">c</span> <span class="o">=</span> <span class="o">*</span><span class="k">self</span><span class="py">.registers</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="nn">Register</span><span class="p">::</span><span class="n">C</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>

        <span class="k">match</span> <span class="n">p</span><span class="na">.0</span> <span class="p">{</span>
            <span class="nn">Instruction</span><span class="p">::</span><span class="n">ADV</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">self</span><span class="py">.registers</span><span class="nf">.insert</span><span class="p">(</span><span class="nn">Register</span><span class="p">::</span><span class="n">A</span><span class="p">,</span> <span class="n">a</span> <span class="o">&gt;&gt;</span> <span class="n">o</span><span class="p">);</span>
            <span class="p">}</span>
            <span class="nn">Instruction</span><span class="p">::</span><span class="n">BXL</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">self</span><span class="py">.registers</span><span class="nf">.insert</span><span class="p">(</span><span class="nn">Register</span><span class="p">::</span><span class="n">B</span><span class="p">,</span> <span class="n">b</span> <span class="o">^</span> <span class="n">o</span><span class="p">);</span>
            <span class="p">}</span>
            <span class="nn">Instruction</span><span class="p">::</span><span class="n">BST</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">self</span><span class="py">.registers</span><span class="nf">.insert</span><span class="p">(</span><span class="nn">Register</span><span class="p">::</span><span class="n">B</span><span class="p">,</span> <span class="n">o</span> <span class="o">&amp;</span> <span class="mi">0b111</span><span class="p">);</span>
            <span class="p">}</span>
            <span class="nn">Instruction</span><span class="p">::</span><span class="n">JNZ</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">if</span> <span class="n">a</span> <span class="o">!=</span> <span class="mi">0</span> <span class="p">{</span>
                    <span class="k">self</span><span class="py">.pc</span> <span class="o">=</span> <span class="p">(</span><span class="n">o</span> <span class="k">as</span> <span class="nb">i64</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span>
            <span class="nn">Instruction</span><span class="p">::</span><span class="n">BXC</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">self</span><span class="py">.registers</span><span class="nf">.insert</span><span class="p">(</span><span class="nn">Register</span><span class="p">::</span><span class="n">B</span><span class="p">,</span> <span class="n">b</span> <span class="o">^</span> <span class="n">c</span><span class="p">);</span>
            <span class="p">}</span>
            <span class="nn">Instruction</span><span class="p">::</span><span class="n">OUT</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">self</span><span class="py">.output</span><span class="nf">.push</span><span class="p">(</span><span class="n">o</span> <span class="o">&amp;</span> <span class="mi">0b111</span><span class="p">);</span>
            <span class="p">}</span>
            <span class="nn">Instruction</span><span class="p">::</span><span class="n">BDV</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">self</span><span class="py">.registers</span><span class="nf">.insert</span><span class="p">(</span><span class="nn">Register</span><span class="p">::</span><span class="n">B</span><span class="p">,</span> <span class="n">a</span> <span class="o">&gt;&gt;</span> <span class="n">o</span><span class="p">);</span>
            <span class="p">}</span>
            <span class="nn">Instruction</span><span class="p">::</span><span class="n">CDV</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">self</span><span class="py">.registers</span><span class="nf">.insert</span><span class="p">(</span><span class="nn">Register</span><span class="p">::</span><span class="n">C</span><span class="p">,</span> <span class="n">a</span> <span class="o">&gt;&gt;</span> <span class="n">o</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">};</span>
        <span class="k">self</span><span class="py">.pc</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">is_running</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
        <span class="k">self</span><span class="py">.pc</span> <span class="o">&lt;</span> <span class="p">(</span><span class="k">self</span><span class="py">.program</span><span class="nf">.len</span><span class="p">()</span> <span class="k">as</span> <span class="nb">i64</span><span class="p">)</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">run</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">while</span> <span class="k">self</span><span class="nf">.is_running</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">self</span><span class="nf">.next</span><span class="p">();</span>
        <span class="p">}</span>
        <span class="o">&amp;</span><span class="k">self</span><span class="py">.output</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>
    <span class="k">let</span> <span class="n">parts</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.split</span><span class="p">(</span><span class="s">"</span><span class="se">\n\n</span><span class="s">"</span><span class="p">)</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="o">&gt;&gt;</span><span class="p">();</span>
    <span class="k">let</span> <span class="n">registers</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
        <span class="nf">.lines</span><span class="p">()</span>
        <span class="nf">.fold</span><span class="p">(</span><span class="nn">HashMap</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span> <span class="p">|</span><span class="k">mut</span> <span class="n">registers</span><span class="p">,</span> <span class="n">line</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">parts</span> <span class="o">=</span> <span class="n">line</span><span class="nf">.split</span><span class="p">(</span><span class="s">": "</span><span class="p">);</span>
            <span class="k">let</span> <span class="n">name</span> <span class="o">=</span> <span class="n">parts</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.split</span><span class="p">(</span><span class="s">" "</span><span class="p">)</span><span class="nf">.skip</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
            <span class="k">let</span> <span class="n">value</span> <span class="o">=</span> <span class="n">parts</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>

            <span class="k">let</span> <span class="n">register</span> <span class="o">=</span> <span class="k">match</span> <span class="n">name</span> <span class="p">{</span>
                <span class="s">"A"</span> <span class="k">=&gt;</span> <span class="nn">Register</span><span class="p">::</span><span class="n">A</span><span class="p">,</span>
                <span class="s">"B"</span> <span class="k">=&gt;</span> <span class="nn">Register</span><span class="p">::</span><span class="n">B</span><span class="p">,</span>
                <span class="s">"C"</span> <span class="k">=&gt;</span> <span class="nn">Register</span><span class="p">::</span><span class="n">C</span><span class="p">,</span>
                <span class="n">_</span> <span class="k">=&gt;</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"Unknown register"</span><span class="p">),</span>
            <span class="p">};</span>
            <span class="n">registers</span><span class="nf">.insert</span><span class="p">(</span><span class="n">register</span><span class="p">,</span> <span class="n">value</span><span class="p">);</span>
            <span class="n">registers</span>
        <span class="p">});</span>

    <span class="k">let</span> <span class="n">program</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
        <span class="nf">.split</span><span class="p">(</span><span class="s">": "</span><span class="p">)</span>
        <span class="nf">.skip</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
        <span class="nf">.next</span><span class="p">()</span>
        <span class="nf">.unwrap</span><span class="p">()</span>
        <span class="nf">.split</span><span class="p">(</span><span class="s">","</span><span class="p">)</span>
        <span class="nf">.map</span><span class="p">(|</span><span class="n">digits</span><span class="p">|</span> <span class="n">digits</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span>
        <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;&gt;</span><span class="p">()</span>
        <span class="nf">.chunks</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
        <span class="nf">.map</span><span class="p">(|</span><span class="n">chunk</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">instruction</span> <span class="o">=</span> <span class="n">chunk</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="nf">.into</span><span class="p">();</span>

            <span class="k">let</span> <span class="n">is_combo</span> <span class="o">=</span> <span class="k">match</span> <span class="n">instruction</span> <span class="p">{</span>
                <span class="nn">Instruction</span><span class="p">::</span><span class="n">ADV</span> <span class="k">=&gt;</span> <span class="k">true</span><span class="p">,</span>
                <span class="nn">Instruction</span><span class="p">::</span><span class="n">BXL</span> <span class="k">=&gt;</span> <span class="k">false</span><span class="p">,</span>
                <span class="nn">Instruction</span><span class="p">::</span><span class="n">BST</span> <span class="k">=&gt;</span> <span class="k">true</span><span class="p">,</span>
                <span class="nn">Instruction</span><span class="p">::</span><span class="n">JNZ</span> <span class="k">=&gt;</span> <span class="k">false</span><span class="p">,</span>
                <span class="nn">Instruction</span><span class="p">::</span><span class="n">BXC</span> <span class="k">=&gt;</span> <span class="k">false</span><span class="p">,</span>
                <span class="nn">Instruction</span><span class="p">::</span><span class="n">OUT</span> <span class="k">=&gt;</span> <span class="k">true</span><span class="p">,</span>
                <span class="nn">Instruction</span><span class="p">::</span><span class="n">BDV</span> <span class="k">=&gt;</span> <span class="k">true</span><span class="p">,</span>
                <span class="nn">Instruction</span><span class="p">::</span><span class="n">CDV</span> <span class="k">=&gt;</span> <span class="k">true</span><span class="p">,</span>
            <span class="p">};</span>

            <span class="k">let</span> <span class="n">operand</span> <span class="o">=</span> <span class="k">match</span> <span class="p">(</span><span class="n">is_combo</span><span class="p">,</span> <span class="n">chunk</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="p">{</span>
                <span class="p">(</span><span class="k">true</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nn">Operand</span><span class="p">::</span><span class="nf">REGISTER</span><span class="p">(</span><span class="nn">Register</span><span class="p">::</span><span class="n">A</span><span class="p">),</span>
                <span class="p">(</span><span class="k">true</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nn">Operand</span><span class="p">::</span><span class="nf">REGISTER</span><span class="p">(</span><span class="nn">Register</span><span class="p">::</span><span class="n">B</span><span class="p">),</span>
                <span class="p">(</span><span class="k">true</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nn">Operand</span><span class="p">::</span><span class="nf">REGISTER</span><span class="p">(</span><span class="nn">Register</span><span class="p">::</span><span class="n">C</span><span class="p">),</span>
                <span class="p">(</span><span class="k">true</span><span class="p">,</span> <span class="n">_</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nn">Operand</span><span class="p">::</span><span class="nf">LITERAL</span><span class="p">(</span><span class="n">chunk</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span>
                <span class="p">(</span><span class="k">false</span><span class="p">,</span> <span class="n">_</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nn">Operand</span><span class="p">::</span><span class="nf">LITERAL</span><span class="p">(</span><span class="n">chunk</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span>
            <span class="p">};</span>

            <span class="p">(</span><span class="n">instruction</span><span class="p">,</span> <span class="n">operand</span><span class="p">)</span>
        <span class="p">})</span>
        <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="n">Instruction</span><span class="p">,</span> <span class="n">Operand</span><span class="p">)</span><span class="o">&gt;&gt;</span><span class="p">();</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">computer</span> <span class="o">=</span> <span class="n">Computer</span> <span class="p">{</span>
        <span class="n">registers</span><span class="p">,</span>
        <span class="n">program</span><span class="p">,</span>
        <span class="n">pc</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
        <span class="n">output</span><span class="p">:</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
    <span class="p">};</span>

    <span class="k">let</span> <span class="n">output</span> <span class="o">=</span> <span class="n">computer</span><span class="nf">.run</span><span class="p">();</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">output</span><span class="p">);</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"-----------------"</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">needle</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">let</span> <span class="n">expected_output</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span> <span class="mi">1</span><span class="p">,</span><span class="cm">/* redacted because of copyright ;) */</span> <span class="p">];</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">done</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>
    <span class="k">loop</span> <span class="p">{</span>
        <span class="k">for</span> <span class="n">j</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="mi">0xFFFFFFFF</span> <span class="p">{</span>
            <span class="n">computer</span><span class="py">.registers</span><span class="nf">.insert</span><span class="p">(</span><span class="nn">Register</span><span class="p">::</span><span class="n">A</span><span class="p">,</span> <span class="n">j</span> <span class="o">+</span> <span class="n">needle</span><span class="p">);</span>
            <span class="n">computer</span><span class="py">.registers</span><span class="nf">.insert</span><span class="p">(</span><span class="nn">Register</span><span class="p">::</span><span class="n">B</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
            <span class="n">computer</span><span class="py">.registers</span><span class="nf">.insert</span><span class="p">(</span><span class="nn">Register</span><span class="p">::</span><span class="n">C</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
            <span class="n">computer</span><span class="py">.pc</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
            <span class="n">computer</span><span class="py">.output</span><span class="nf">.clear</span><span class="p">();</span>
            <span class="k">let</span> <span class="n">actual_output</span> <span class="o">=</span> <span class="n">computer</span><span class="nf">.run</span><span class="p">();</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">all_fields_good_so_far</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>

            <span class="k">for</span> <span class="n">k</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">actual_output</span><span class="nf">.len</span><span class="p">()</span> <span class="p">{</span>
                <span class="k">if</span> <span class="n">expected_output</span><span class="p">[</span><span class="n">expected_output</span><span class="nf">.len</span><span class="p">()</span> <span class="o">-</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">actual_output</span><span class="p">[</span><span class="n">actual_output</span><span class="nf">.len</span><span class="p">()</span> <span class="o">-</span> <span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
                <span class="p">{</span>
                    <span class="n">all_fields_good_so_far</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>
                    <span class="k">break</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span>

            <span class="k">if</span> <span class="n">all_fields_good_so_far</span> <span class="p">{</span>
                <span class="n">needle</span> <span class="o">=</span> <span class="p">(</span><span class="n">needle</span> <span class="o">+</span> <span class="n">j</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">3</span><span class="p">;</span>
                <span class="k">if</span> <span class="n">expected_output</span><span class="nf">.len</span><span class="p">()</span> <span class="o">==</span> <span class="n">actual_output</span><span class="nf">.len</span><span class="p">()</span> <span class="p">{</span>
                    <span class="n">done</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="k">break</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">if</span> <span class="n">done</span> <span class="p">{</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="n">output</span> <span class="o">=</span> <span class="n">computer</span><span class="nf">.run</span><span class="p">();</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">output</span><span class="p">);</span>
<span class="p">}</span>


</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 91/100 - aoc2024 day 16</title><link href="https://maebli.github.io/archive/2024-12-15-100rust-91/" rel="alternate" type="text/html" title="Rust challenge 91/100 - aoc2024 day 16" /><published>2024-12-16T15:00:00+00:00</published><updated>2024-12-16T15:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-91</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-15-100rust-91/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#91st-challenge">91st Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="91st-challenge">91st Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I did day16. <a href="https://adventofcode.com/2024/day/15">advent of code</a>. This one was easier than yesterday.</p>

<h3 id="solution">Solution</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">pathfinding</span><span class="p">::{</span>
    <span class="nn">directed</span><span class="p">::</span><span class="nn">dijkstra</span><span class="p">::</span><span class="n">dijkstra</span><span class="p">,</span>
    <span class="nn">prelude</span><span class="p">::{</span><span class="n">astar_bag</span><span class="p">},</span>
<span class="p">};</span>

<span class="nd">#[derive(Clone,</span> <span class="nd">Debug,</span> <span class="nd">Eq,</span> <span class="nd">Hash,</span> <span class="nd">Ord,</span> <span class="nd">PartialEq,</span> <span class="nd">PartialOrd)]</span>
<span class="k">struct</span> <span class="nf">Pos</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">);</span>

<span class="nd">#[derive(Clone,</span> <span class="nd">Debug,</span> <span class="nd">Eq,</span> <span class="nd">Hash,</span> <span class="nd">Ord,</span> <span class="nd">PartialEq,</span> <span class="nd">PartialOrd)]</span>
<span class="k">struct</span> <span class="n">ReindeerArena</span> <span class="p">{</span>
    <span class="n">legal</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">illegal</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">end</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span>
    <span class="n">start</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span>
<span class="p">}</span>

<span class="nd">#[derive(Clone,</span> <span class="nd">Debug,</span> <span class="nd">Eq,</span> <span class="nd">Hash,</span> <span class="nd">Ord,</span> <span class="nd">PartialEq,</span> <span class="nd">PartialOrd)]</span>
<span class="k">struct</span> <span class="n">Vector</span> <span class="p">{</span>
    <span class="n">pos</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span>
    <span class="n">dir</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">impl</span> <span class="n">ReindeerArena</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">is_legal</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">pos</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Pos</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
        <span class="k">self</span><span class="py">.legal</span><span class="nf">.contains</span><span class="p">(</span><span class="n">pos</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="k">self</span><span class="py">.illegal</span><span class="nf">.contains</span><span class="p">(</span><span class="n">pos</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">successors</span><span class="p">(</span>
    <span class="n">v</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Vector</span><span class="p">,</span>
    <span class="n">arena</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">ReindeerArena</span><span class="p">,</span>
<span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="n">Vector</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="o">=</span> <span class="n">v</span><span class="py">.pos</span><span class="p">;</span>
    <span class="k">let</span> <span class="n">directions</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span><span class="nf">Pos</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="nf">Pos</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)];</span>

    <span class="n">directions</span>
        <span class="nf">.into_iter</span><span class="p">()</span>
        <span class="nf">.filter_map</span><span class="p">(|</span><span class="n">d</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">new_pos</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">d</span><span class="na">.0</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="n">d</span><span class="na">.1</span><span class="p">);</span>
            <span class="k">let</span> <span class="n">new_dir</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">d</span><span class="na">.0</span><span class="p">,</span> <span class="n">d</span><span class="na">.1</span><span class="p">);</span>
            <span class="k">let</span> <span class="n">new_v</span> <span class="o">=</span> <span class="n">Vector</span> <span class="p">{</span>
                <span class="n">pos</span><span class="p">:</span> <span class="n">new_pos</span><span class="p">,</span>
                <span class="n">dir</span><span class="p">:</span> <span class="n">new_dir</span><span class="p">,</span>
            <span class="p">};</span>
            <span class="k">if</span> <span class="n">arena</span><span class="nf">.is_legal</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_v</span><span class="py">.pos</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">let</span> <span class="n">score</span> <span class="o">=</span> <span class="k">if</span> <span class="o">&amp;</span><span class="n">d</span> <span class="o">==</span> <span class="o">&amp;</span><span class="n">v</span><span class="py">.dir</span> <span class="p">{</span> <span class="mi">1</span><span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="mi">1001</span> <span class="p">};</span>
                <span class="nf">Some</span><span class="p">((</span><span class="n">new_v</span><span class="p">,</span> <span class="n">score</span><span class="p">))</span>
            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                <span class="nb">None</span>
            <span class="p">}</span>
        <span class="p">})</span>
        <span class="nf">.collect</span><span class="p">()</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="k">let</span> <span class="n">arena</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span>
        <span class="n">ReindeerArena</span> <span class="p">{</span>
            <span class="n">legal</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[],</span>
            <span class="n">illegal</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[],</span>
            <span class="n">end</span><span class="p">:</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
            <span class="n">start</span><span class="p">:</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
        <span class="p">},</span>
        <span class="p">|</span><span class="k">mut</span> <span class="n">arena</span><span class="p">,</span> <span class="n">c</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
                <span class="sc">'.'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="n">arena</span><span class="py">.legal</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
                    <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="sc">'#'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="n">arena</span><span class="py">.illegal</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
                    <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="sc">'\n'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
                    <span class="n">y</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="sc">'S'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="n">arena</span><span class="py">.start</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span>
                    <span class="n">arena</span><span class="py">.legal</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
                    <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="sc">'E'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="n">arena</span><span class="py">.end</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span>
                    <span class="n">arena</span><span class="py">.legal</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
                    <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">(),</span>
            <span class="p">}</span>
            <span class="n">arena</span>
        <span class="p">},</span>
    <span class="p">);</span>

    <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="nf">dijkstra</span><span class="p">(</span>
        <span class="o">&amp;</span><span class="n">Vector</span><span class="p">{</span><span class="n">pos</span><span class="p">:</span> <span class="n">arena</span><span class="py">.start</span><span class="nf">.clone</span><span class="p">(),</span> <span class="n">dir</span><span class="p">:</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)},</span>
        <span class="p">|</span><span class="n">v</span><span class="p">|</span> <span class="nf">successors</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">arena</span><span class="p">),</span>
        <span class="p">|</span><span class="n">v</span><span class="p">|</span> <span class="n">v</span><span class="py">.pos</span> <span class="o">==</span> <span class="n">arena</span><span class="py">.end</span><span class="p">,</span>
    <span class="p">);</span>

    <span class="k">match</span> <span class="n">result</span> <span class="p">{</span>
        <span class="nf">Some</span><span class="p">((</span><span class="n">_</span><span class="p">,</span> <span class="n">cost</span><span class="p">))</span> <span class="k">=&gt;</span> <span class="p">{</span>
            <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">cost</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="nb">None</span> <span class="k">=&gt;</span> <span class="p">{</span>
            <span class="nd">println!</span><span class="p">(</span><span class="s">"No path found."</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="nf">astar_bag</span><span class="p">(</span>
        <span class="o">&amp;</span><span class="n">Vector</span><span class="p">{</span><span class="n">pos</span><span class="p">:</span> <span class="n">arena</span><span class="py">.start</span><span class="nf">.clone</span><span class="p">(),</span> <span class="n">dir</span><span class="p">:</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)},</span>
        <span class="p">|</span><span class="n">v</span><span class="p">|</span> <span class="nf">successors</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">arena</span><span class="p">),</span>
        <span class="p">|</span><span class="n">_</span><span class="p">|</span> <span class="n">x</span><span class="p">,</span>
        <span class="p">|</span><span class="n">v</span><span class="p">|</span> <span class="n">v</span><span class="py">.pos</span> <span class="o">==</span> <span class="n">arena</span><span class="py">.end</span><span class="p">,</span>
    <span class="p">);</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">seats</span> <span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;=</span> <span class="nd">vec!</span><span class="p">[];</span>
    <span class="k">match</span> <span class="n">result</span> <span class="p">{</span>
        <span class="nf">Some</span><span class="p">((</span><span class="n">path</span><span class="p">,</span> <span class="n">_</span><span class="p">))</span> <span class="k">=&gt;</span> <span class="p">{</span>
            <span class="k">for</span> <span class="n">p</span> <span class="k">in</span> <span class="n">path</span> <span class="p">{</span>
                <span class="n">seats</span><span class="nf">.extend</span><span class="p">(</span><span class="n">p</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">v</span><span class="p">|</span> <span class="n">v</span><span class="py">.pos</span><span class="nf">.clone</span><span class="p">())</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;&gt;</span><span class="p">());</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="nb">None</span> <span class="k">=&gt;</span> <span class="p">{</span>
            <span class="nd">println!</span><span class="p">(</span><span class="s">"No path found."</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">seats</span><span class="nf">.sort</span><span class="p">();</span>
    <span class="n">seats</span><span class="nf">.dedup</span><span class="p">();</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">seats</span><span class="nf">.len</span><span class="p">());</span>
<span class="p">}</span>


</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 90/100 - aoc2024 day 15</title><link href="https://maebli.github.io/archive/2024-12-14-100rust-90/" rel="alternate" type="text/html" title="Rust challenge 90/100 - aoc2024 day 15" /><published>2024-12-15T19:00:00+00:00</published><updated>2024-12-15T19:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-90</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-14-100rust-90/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#90th-challenge">90th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
        </ul>
      </li>
      <li><a href="#part1">part1</a>
        <ul>
          <li><a href="#part2">part2</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="90th-challenge">90th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I did day15. <a href="https://adventofcode.com/2024/day/15">advent of code</a>. Part one was a breeze, part two.. not so much.</p>

<h2 id="part1">part1</h2>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">std</span><span class="p">::{</span><span class="nn">collections</span><span class="p">::{</span><span class="n">HashMap</span><span class="p">,</span> <span class="n">HashSet</span><span class="p">},</span> <span class="nn">hash</span><span class="p">::</span><span class="n">Hash</span><span class="p">};</span>

<span class="k">const</span> <span class="n">WALL</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'#'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">BOX</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'O'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">ROBOT</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'@'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">EMPTY</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'.'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">UP</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'^'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">DOWN</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'v'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">LEFT</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'&lt;'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">RIGHT</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'&gt;'</span><span class="p">;</span>

<span class="nd">#[derive(Debug,</span> <span class="nd">Clone,</span> <span class="nd">Copy,</span> <span class="nd">PartialEq,</span> <span class="nd">Eq,</span> <span class="nd">Hash)]</span>
<span class="k">struct</span> <span class="nf">Pos</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">);</span>
<span class="nd">#[derive(Debug,</span> <span class="nd">Clone,</span> <span class="nd">Copy)]</span>
<span class="k">struct</span> <span class="nf">Move</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">);</span>
<span class="nd">#[derive(Debug)]</span>
<span class="k">struct</span> <span class="n">Warehouse</span> <span class="p">{</span>
    <span class="n">legal</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">walls</span><span class="p">:</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">boxes</span><span class="p">:</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">robot</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span>
    <span class="n">moves</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Move</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">moves_index</span><span class="p">:</span> <span class="nb">usize</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">impl</span> <span class="n">Warehouse</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">move_robot</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">let</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="o">=</span> <span class="k">self</span><span class="py">.robot</span><span class="p">;</span>
        <span class="k">let</span> <span class="nf">Move</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">)</span> <span class="o">=</span> <span class="k">self</span><span class="py">.moves</span><span class="p">[</span><span class="k">self</span><span class="py">.moves_index</span><span class="p">];</span>
        <span class="k">let</span> <span class="n">new_pos</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">dx</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="n">dy</span><span class="p">);</span>
        <span class="k">if</span> <span class="k">self</span><span class="py">.legal</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_pos</span><span class="p">)</span> <span class="p">{</span>
            <span class="c1">// is there a wall? if so, don't move</span>
            <span class="k">if</span> <span class="k">self</span><span class="py">.walls</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_pos</span><span class="p">)</span> <span class="p">{</span>
                <span class="nd">println!</span><span class="p">(</span><span class="s">"there is a wall at {:?}"</span><span class="p">,</span> <span class="n">new_pos</span><span class="p">);</span>
            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                <span class="c1">// is there a box?</span>
                <span class="k">if</span> <span class="k">self</span><span class="py">.boxes</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_pos</span><span class="p">)</span> <span class="p">{</span>
                    <span class="c1">//yes</span>
                    <span class="c1">// how many steps until no box</span>
                    <span class="k">let</span> <span class="k">mut</span> <span class="n">look_ahead</span> <span class="o">=</span> <span class="n">new_pos</span><span class="p">;</span>
                    <span class="k">let</span> <span class="k">mut</span> <span class="n">object</span> <span class="o">=</span> <span class="n">EMPTY</span><span class="p">;</span>
                    <span class="k">while</span> <span class="k">self</span><span class="py">.legal</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">look_ahead</span><span class="p">)</span> <span class="p">{</span>
                        <span class="n">look_ahead</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">look_ahead</span><span class="na">.0</span> <span class="o">+</span> <span class="n">dx</span><span class="p">,</span> <span class="n">look_ahead</span><span class="na">.1</span> <span class="o">+</span> <span class="n">dy</span><span class="p">);</span>
                        <span class="k">if</span> <span class="k">self</span><span class="py">.walls</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">look_ahead</span><span class="p">)</span> <span class="p">{</span>
                            <span class="n">object</span> <span class="o">=</span> <span class="n">WALL</span><span class="p">;</span>
                            <span class="k">break</span><span class="p">;</span>
                        <span class="p">}</span>
                        <span class="k">if</span> <span class="k">self</span><span class="py">.boxes</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">look_ahead</span><span class="p">)</span> <span class="p">{</span>
                            <span class="n">object</span> <span class="o">=</span> <span class="n">BOX</span><span class="p">;</span>
                        <span class="p">}</span><span class="k">else</span><span class="p">{</span>
                            <span class="n">object</span> <span class="o">=</span> <span class="n">EMPTY</span><span class="p">;</span>
                            <span class="k">break</span><span class="p">;</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                    <span class="k">if</span> <span class="n">object</span> <span class="o">==</span> <span class="n">EMPTY</span> <span class="p">{</span>
                        <span class="c1">// move the box at the first to + 1 of the last</span>
                        <span class="k">self</span><span class="py">.boxes</span><span class="nf">.remove</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_pos</span><span class="p">);</span>
                        <span class="k">self</span><span class="py">.boxes</span><span class="nf">.insert</span><span class="p">(</span><span class="n">look_ahead</span><span class="p">);</span>

                        <span class="k">self</span><span class="py">.robot</span> <span class="o">=</span> <span class="n">new_pos</span><span class="p">;</span>
                    <span class="p">}</span>
                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                    <span class="c1">// no box, move the robot</span>
                    <span class="k">self</span><span class="py">.robot</span> <span class="o">=</span> <span class="n">new_pos</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">self</span><span class="py">.moves_index</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">robot_finished</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
        <span class="k">self</span><span class="py">.moves_index</span> <span class="o">==</span> <span class="k">self</span><span class="py">.moves</span><span class="nf">.len</span><span class="p">()</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">print</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">previous_y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">for</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="k">in</span> <span class="k">self</span><span class="py">.legal</span><span class="nf">.iter</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">if</span> <span class="n">previous_y</span> <span class="o">!=</span> <span class="o">*</span><span class="n">y</span> <span class="p">{</span>
                <span class="nd">print!</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
                <span class="n">previous_y</span> <span class="o">=</span> <span class="o">*</span><span class="n">y</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="k">if</span> <span class="k">self</span><span class="py">.walls</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="nf">Pos</span><span class="p">(</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="o">*</span><span class="n">y</span><span class="p">))</span> <span class="p">{</span>
                <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">WALL</span><span class="p">);</span>
            <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="k">self</span><span class="py">.boxes</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="nf">Pos</span><span class="p">(</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="o">*</span><span class="n">y</span><span class="p">))</span> <span class="p">{</span>
                <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">BOX</span><span class="p">);</span>
            <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="k">self</span><span class="py">.robot</span> <span class="o">==</span> <span class="nf">Pos</span><span class="p">(</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="o">*</span><span class="n">y</span><span class="p">)</span> <span class="p">{</span>
                <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">ROBOT</span><span class="p">);</span>
            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">EMPTY</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>


<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">input</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.split</span><span class="p">(</span><span class="s">"</span><span class="se">\n\n</span><span class="s">"</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">warehouse_map</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span>
        <span class="n">Warehouse</span> <span class="p">{</span>
            <span class="n">walls</span><span class="p">:</span> <span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
            <span class="n">boxes</span><span class="p">:</span> <span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
            <span class="n">robot</span><span class="p">:</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
            <span class="n">moves</span><span class="p">:</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
            <span class="n">moves_index</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
            <span class="n">legal</span><span class="p">:</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
        <span class="p">},</span>
        <span class="p">|</span><span class="k">mut</span> <span class="n">warehouse</span><span class="p">,</span> <span class="n">line</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">for</span> <span class="n">c</span> <span class="k">in</span> <span class="n">line</span><span class="nf">.chars</span><span class="p">()</span> <span class="p">{</span>
                <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
                    <span class="n">WALL</span> <span class="k">=&gt;</span> <span class="p">{</span>
                        <span class="n">warehouse</span><span class="py">.walls</span><span class="nf">.insert</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
                    <span class="p">}</span>
                    <span class="n">BOX</span> <span class="k">=&gt;</span> <span class="p">{</span>
                        <span class="n">warehouse</span><span class="py">.boxes</span><span class="nf">.insert</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
                    <span class="p">}</span>
                    <span class="n">ROBOT</span> <span class="k">=&gt;</span> <span class="p">{</span>
                        <span class="n">warehouse</span><span class="py">.robot</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span>
                    <span class="p">}</span>
                    <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{}</span>
                <span class="p">}</span>
                <span class="n">warehouse</span><span class="py">.legal</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
                <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="n">y</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
            <span class="n">warehouse</span>
        <span class="p">},</span>
    <span class="p">);</span>

    <span class="n">input</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.for_each</span><span class="p">(|</span><span class="n">line</span><span class="p">|</span> <span class="p">{</span>
        <span class="n">line</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.for_each</span><span class="p">(|</span><span class="n">c</span><span class="p">|</span> <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
            <span class="n">UP</span> <span class="k">=&gt;</span> <span class="n">warehouse_map</span><span class="py">.moves</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Move</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)),</span>
            <span class="n">DOWN</span> <span class="k">=&gt;</span> <span class="n">warehouse_map</span><span class="py">.moves</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Move</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)),</span>
            <span class="n">LEFT</span> <span class="k">=&gt;</span> <span class="n">warehouse_map</span><span class="py">.moves</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Move</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)),</span>
            <span class="n">RIGHT</span> <span class="k">=&gt;</span> <span class="n">warehouse_map</span><span class="py">.moves</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Move</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="n">_</span> <span class="k">=&gt;</span> <span class="p">{}</span>
        <span class="p">});</span>
    <span class="p">});</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">warehouse_map</span><span class="p">);</span>
    <span class="k">while</span> <span class="o">!</span><span class="n">warehouse_map</span><span class="nf">.robot_finished</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">warehouse_map</span><span class="nf">.move_robot</span><span class="p">();</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"</span><span class="se">\n\n</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="n">sol1</span> <span class="o">=</span> <span class="n">warehouse_map</span><span class="py">.boxes</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="p">|</span><span class="n">acc</span><span class="p">,</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)|</span> <span class="p">{</span>
        <span class="n">acc</span> <span class="o">+</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span><span class="o">*</span><span class="mi">100</span>
    <span class="p">});</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"Solution 1: {}"</span><span class="p">,</span> <span class="n">sol1</span><span class="p">);</span>
<span class="p">}</span>
    
</code></pre></div></div>

<h3 id="part2">part2</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">std</span><span class="p">::{</span>
    <span class="nn">collections</span><span class="p">::{</span><span class="n">HashMap</span><span class="p">,</span> <span class="n">HashSet</span><span class="p">},</span> <span class="nn">hash</span><span class="p">::</span><span class="n">Hash</span><span class="p">,</span> <span class="nn">process</span><span class="p">::</span><span class="n">exit</span><span class="p">,</span> <span class="n">thread</span><span class="p">,</span> <span class="nn">time</span><span class="p">::</span><span class="n">Duration</span><span class="p">,</span> <span class="n">vec</span>
<span class="p">};</span>

<span class="k">const</span> <span class="n">WALL</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'#'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">BOX</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'O'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">ROBOT</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'@'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">EMPTY</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'.'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">UP</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'^'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">DOWN</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'v'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">LEFT</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'&lt;'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">RIGHT</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'&gt;'</span><span class="p">;</span>
<span class="k">const</span> <span class="n">BIG_BOX_LEFT</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">'['</span><span class="p">;</span>
<span class="k">const</span> <span class="n">BIG_BOX_RIGHT</span><span class="p">:</span> <span class="nb">char</span> <span class="o">=</span> <span class="sc">']'</span><span class="p">;</span>

<span class="nd">#[derive(Debug,</span> <span class="nd">Clone,</span> <span class="nd">Copy,</span> <span class="nd">PartialEq,</span> <span class="nd">Eq,</span> <span class="nd">Hash)]</span>
<span class="k">struct</span> <span class="nf">Pos</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">);</span>
<span class="nd">#[derive(Debug,</span> <span class="nd">Clone,</span> <span class="nd">Copy)]</span>
<span class="k">struct</span> <span class="nf">Move</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">);</span>
<span class="nd">#[derive(Debug)]</span>
<span class="k">struct</span> <span class="n">Warehouse</span> <span class="p">{</span>
    <span class="n">legal</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">walls</span><span class="p">:</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">boxes</span><span class="p">:</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">robot</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span>
    <span class="n">moves</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Move</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">moves_index</span><span class="p">:</span> <span class="nb">usize</span><span class="p">,</span>
<span class="p">}</span>


<span class="k">impl</span> <span class="n">Warehouse</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">move_robot</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">let</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="o">=</span> <span class="k">self</span><span class="py">.robot</span><span class="p">;</span>
        <span class="k">let</span> <span class="n">d</span> <span class="o">=</span> <span class="k">self</span><span class="py">.moves</span><span class="p">[</span><span class="k">self</span><span class="py">.moves_index</span><span class="p">];</span>
        <span class="k">let</span> <span class="n">new_pos</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">d</span><span class="na">.0</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="n">d</span><span class="na">.1</span><span class="p">);</span>
        <span class="k">if</span> <span class="k">self</span><span class="py">.legal</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_pos</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span> <span class="k">self</span><span class="py">.walls</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_pos</span><span class="p">)</span> <span class="p">{</span>
            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                <span class="k">if</span> <span class="o">!</span><span class="k">self</span><span class="nf">.is_occupied_by_box</span><span class="p">(</span><span class="n">new_pos</span><span class="p">)</span> <span class="p">{</span>
                    <span class="k">self</span><span class="py">.robot</span> <span class="o">=</span> <span class="n">new_pos</span><span class="p">;</span>
                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                    <span class="k">if</span> <span class="k">self</span><span class="nf">.push_box</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">new_pos</span><span class="p">)</span> <span class="p">{</span>
                        <span class="k">self</span><span class="py">.robot</span> <span class="o">=</span> <span class="n">new_pos</span><span class="p">;</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">self</span><span class="py">.moves_index</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">robot_finished</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
        <span class="k">self</span><span class="py">.moves_index</span> <span class="o">==</span> <span class="k">self</span><span class="py">.moves</span><span class="nf">.len</span><span class="p">()</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">print</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">previous_y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">skip_next</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>
        <span class="k">for</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="k">in</span> <span class="k">self</span><span class="py">.legal</span><span class="nf">.iter</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">if</span> <span class="n">previous_y</span> <span class="o">!=</span> <span class="o">*</span><span class="n">y</span> <span class="p">{</span>
                <span class="nd">print!</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
                <span class="n">previous_y</span> <span class="o">=</span> <span class="o">*</span><span class="n">y</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="k">if</span> <span class="n">skip_next</span> <span class="p">{</span>
                <span class="n">skip_next</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>
                <span class="k">continue</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="k">if</span> <span class="k">self</span><span class="py">.walls</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="nf">Pos</span><span class="p">(</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="o">*</span><span class="n">y</span><span class="p">))</span> <span class="p">{</span>
                <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">WALL</span><span class="p">);</span>
            <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="k">self</span><span class="py">.boxes</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="nf">Pos</span><span class="p">(</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="o">*</span><span class="n">y</span><span class="p">))</span> <span class="p">{</span>
                <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">BIG_BOX_LEFT</span><span class="p">);</span>
                <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">BIG_BOX_RIGHT</span><span class="p">);</span>
                <span class="n">skip_next</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
            <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="k">self</span><span class="py">.robot</span> <span class="o">==</span> <span class="nf">Pos</span><span class="p">(</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="o">*</span><span class="n">y</span><span class="p">)</span> <span class="p">{</span>
                <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">ROBOT</span><span class="p">);</span>
            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">EMPTY</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="nd">print!</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">push_box</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span> <span class="n">next_move</span><span class="p">:</span> <span class="n">Move</span><span class="p">,</span> <span class="n">pos</span><span class="p">:</span> <span class="n">Pos</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">is_horizontal_push</span> <span class="o">=</span> <span class="n">next_move</span><span class="na">.0</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">;</span>

        <span class="k">if</span> <span class="n">is_horizontal_push</span> <span class="p">{</span>
            <span class="k">self</span><span class="nf">.push_box_horizontal</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">next_move</span><span class="p">)</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="k">self</span><span class="nf">.push_box_vertical</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">next_move</span><span class="p">)</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">push_box_horizontal</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span> <span class="k">mut</span> <span class="n">pos</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span> <span class="n">next_move</span><span class="p">:</span> <span class="n">Move</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">boxes</span> <span class="o">=</span> <span class="k">self</span>
            <span class="py">.boxes</span>
            <span class="nf">.iter</span><span class="p">()</span>
            <span class="nf">.map</span><span class="p">(|</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)|</span> <span class="nd">vec!</span><span class="p">[</span><span class="nf">Pos</span><span class="p">(</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="o">*</span><span class="n">y</span><span class="p">),</span> <span class="nf">Pos</span><span class="p">(</span><span class="o">*</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="o">*</span><span class="n">y</span><span class="p">)])</span>
            <span class="nf">.flatten</span><span class="p">()</span>
            <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;&gt;</span><span class="p">();</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">box_cluster</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>
        <span class="k">while</span> <span class="n">boxes</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">pos</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">box_cluster</span><span class="nf">.push</span><span class="p">(</span><span class="n">pos</span><span class="p">);</span>
            <span class="n">pos</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">pos</span><span class="na">.0</span><span class="o">+</span> <span class="n">next_move</span><span class="na">.0</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="k">if</span> <span class="k">self</span><span class="py">.walls</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">pos</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
        <span class="p">}</span>


        <span class="k">let</span> <span class="n">box_cluster</span> <span class="o">=</span> <span class="n">box_cluster</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.filter</span><span class="p">(|</span><span class="n">p</span><span class="p">|</span> <span class="k">self</span><span class="py">.boxes</span><span class="nf">.contains</span><span class="p">(</span><span class="n">p</span><span class="p">))</span><span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="o">*</span><span class="n">x</span><span class="p">)</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;&gt;</span><span class="p">();</span>

        <span class="k">for</span> <span class="n">pos</span> <span class="k">in</span> <span class="n">box_cluster</span><span class="nf">.iter</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">self</span><span class="py">.boxes</span><span class="nf">.remove</span><span class="p">(</span><span class="o">&amp;</span><span class="n">pos</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="k">for</span> <span class="n">pos</span> <span class="k">in</span> <span class="n">box_cluster</span><span class="nf">.iter</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">self</span><span class="py">.boxes</span><span class="nf">.insert</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">pos</span><span class="na">.0</span> <span class="o">+</span> <span class="n">next_move</span><span class="na">.0</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span><span class="p">));</span>
        <span class="p">}</span>

       <span class="k">true</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">push_box_vertical</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span> <span class="n">pos</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span> <span class="n">next_move</span><span class="p">:</span> <span class="n">Move</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
        <span class="c1">// get the box we need to push</span>
        <span class="k">let</span> <span class="n">box_to_push</span> <span class="o">=</span> <span class="k">self</span>
            <span class="py">.boxes</span>
            <span class="nf">.iter</span><span class="p">()</span>
            <span class="nf">.find</span><span class="p">(|</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)|</span> <span class="p">(</span><span class="o">*</span><span class="n">x</span> <span class="o">==</span> <span class="n">pos</span><span class="na">.0</span> <span class="p">||</span> <span class="p">(</span><span class="o">*</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="n">pos</span><span class="na">.0</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="o">*</span><span class="n">y</span> <span class="o">==</span> <span class="n">pos</span><span class="na">.1</span><span class="p">)</span>
            <span class="nf">.unwrap</span><span class="p">()</span>
            <span class="nf">.clone</span><span class="p">();</span>

        <span class="k">let</span> <span class="n">cluster</span> <span class="o">=</span> <span class="k">self</span><span class="nf">.get_box_cluster</span><span class="p">(</span><span class="n">box_to_push</span><span class="p">,</span> <span class="n">next_move</span><span class="p">);</span>
        <span class="k">if</span> <span class="k">self</span><span class="nf">.is_box_cluster_moveable</span><span class="p">(</span><span class="o">&amp;</span><span class="n">cluster</span><span class="p">,</span> <span class="n">next_move</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">self</span><span class="nf">.move_cluster</span><span class="p">(</span><span class="o">&amp;</span><span class="n">cluster</span><span class="p">,</span> <span class="n">next_move</span><span class="p">);</span>
            <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">is_occupied_by_box</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">pos</span><span class="p">:</span> <span class="n">Pos</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
        <span class="k">self</span><span class="py">.boxes</span>
            <span class="nf">.iter</span><span class="p">()</span>
            <span class="nf">.any</span><span class="p">(|</span><span class="n">p</span><span class="p">|</span> <span class="p">(</span><span class="o">*</span><span class="n">p</span> <span class="o">==</span> <span class="n">pos</span> <span class="p">||</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">p</span><span class="na">.0</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">p</span><span class="na">.1</span><span class="p">)</span> <span class="o">==</span> <span class="n">pos</span><span class="p">))</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">is_a_left_box</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">pos</span><span class="p">:</span> <span class="n">Pos</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
        <span class="k">self</span><span class="py">.boxes</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.any</span><span class="p">(|</span><span class="n">p</span><span class="p">|</span> <span class="o">*</span><span class="n">p</span> <span class="o">==</span> <span class="n">pos</span><span class="p">)</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">get_box_cluster</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">pos</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span> <span class="n">mov</span><span class="p">:</span> <span class="n">Move</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="c1">// check its really a box</span>
        <span class="k">if</span> <span class="o">!</span><span class="k">self</span><span class="nf">.is_occupied_by_box</span><span class="p">(</span><span class="n">pos</span><span class="p">)</span> <span class="p">||</span> <span class="k">self</span><span class="py">.walls</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">pos</span><span class="p">)</span> <span class="p">||</span> <span class="o">!</span><span class="k">self</span><span class="py">.legal</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">pos</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="k">return</span> <span class="nd">vec!</span><span class="p">[];</span>
        <span class="p">}</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">offset_in_x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">if</span> <span class="o">!</span><span class="k">self</span><span class="nf">.is_a_left_box</span><span class="p">(</span><span class="n">pos</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">offset_in_x</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">out</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span><span class="nf">Pos</span><span class="p">(</span><span class="n">pos</span><span class="na">.0</span> <span class="o">+</span> <span class="n">offset_in_x</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span><span class="p">)];</span>

        <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="mi">3</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">new_pos</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">pos</span><span class="na">.0</span> <span class="o">+</span> <span class="n">offset_in_x</span> <span class="o">+</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span> <span class="o">+</span> <span class="n">mov</span><span class="na">.1</span><span class="p">);</span>
            <span class="k">if</span> <span class="k">self</span><span class="py">.boxes</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_pos</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">out</span><span class="nf">.extend</span><span class="p">(</span><span class="k">self</span><span class="nf">.get_box_cluster</span><span class="p">(</span><span class="n">new_pos</span><span class="p">,</span> <span class="n">mov</span><span class="p">));</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="n">out</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">is_box_cluster_moveable</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">cluster</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">mov</span><span class="p">:</span> <span class="n">Move</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">out</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
        <span class="k">let</span> <span class="n">none_cluster_boxes</span> <span class="o">=</span> <span class="k">self</span>
            <span class="py">.boxes</span>
            <span class="nf">.iter</span><span class="p">()</span>
            <span class="nf">.filter</span><span class="p">(|</span><span class="n">p</span><span class="p">|</span> <span class="o">!</span><span class="n">cluster</span><span class="nf">.contains</span><span class="p">(</span><span class="n">p</span><span class="p">))</span>
            <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="o">*</span><span class="n">x</span><span class="p">)</span>
            <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;&gt;</span><span class="p">();</span>
        <span class="k">for</span> <span class="n">pos</span> <span class="k">in</span> <span class="n">cluster</span> <span class="p">{</span>
            <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="mi">2</span> <span class="p">{</span>
                <span class="k">let</span> <span class="n">new_pos</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">pos</span><span class="na">.0</span> <span class="o">+</span> <span class="n">mov</span><span class="na">.0</span> <span class="o">+</span> <span class="n">i</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span> <span class="o">+</span> <span class="n">mov</span><span class="na">.1</span><span class="p">);</span>
                <span class="k">if</span> <span class="k">self</span><span class="py">.walls</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_pos</span><span class="p">)</span> <span class="p">||</span> <span class="n">none_cluster_boxes</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_pos</span><span class="p">)</span> <span class="p">{</span>
                    <span class="n">out</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>
                    <span class="k">break</span><span class="p">;</span>
                <span class="p">}</span>

            <span class="p">}</span>
        <span class="p">}</span>
        <span class="n">out</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">move_cluster</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span> <span class="n">cluster</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pos</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">mov</span><span class="p">:</span> <span class="n">Move</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">for</span> <span class="n">pos</span> <span class="k">in</span> <span class="n">cluster</span> <span class="p">{</span>
            <span class="k">self</span><span class="py">.boxes</span><span class="nf">.remove</span><span class="p">(</span><span class="o">&amp;</span><span class="n">pos</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="k">for</span> <span class="n">pos</span> <span class="k">in</span> <span class="n">cluster</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">new_pos</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">pos</span><span class="na">.0</span> <span class="o">+</span> <span class="n">mov</span><span class="na">.0</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span> <span class="o">+</span> <span class="n">mov</span><span class="na">.1</span><span class="p">);</span>
            <span class="k">self</span><span class="py">.boxes</span><span class="nf">.insert</span><span class="p">(</span><span class="n">new_pos</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">from</span><span class="p">(</span><span class="n">input</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="k">Self</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">input</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.split</span><span class="p">(</span><span class="s">"</span><span class="se">\n\n</span><span class="s">"</span><span class="p">);</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">warehouse_map</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span>
            <span class="n">Warehouse</span> <span class="p">{</span>
                <span class="n">walls</span><span class="p">:</span> <span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
                <span class="n">boxes</span><span class="p">:</span> <span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
                <span class="n">robot</span><span class="p">:</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
                <span class="n">moves</span><span class="p">:</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
                <span class="n">moves_index</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                <span class="n">legal</span><span class="p">:</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
            <span class="p">},</span>
            <span class="p">|</span><span class="k">mut</span> <span class="n">warehouse</span><span class="p">,</span> <span class="n">line</span><span class="p">|</span> <span class="p">{</span>
                <span class="k">for</span> <span class="n">c</span> <span class="k">in</span> <span class="n">line</span><span class="nf">.chars</span><span class="p">()</span> <span class="p">{</span>
                    <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
                        <span class="n">WALL</span> <span class="k">=&gt;</span> <span class="p">{</span>
                            <span class="n">warehouse</span><span class="py">.walls</span><span class="nf">.insert</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
                            <span class="n">warehouse</span><span class="py">.walls</span><span class="nf">.insert</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
                        <span class="p">}</span>
                        <span class="n">BOX</span> <span class="k">=&gt;</span> <span class="p">{</span>
                            <span class="n">warehouse</span><span class="py">.boxes</span><span class="nf">.insert</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
                        <span class="p">}</span>
                        <span class="n">ROBOT</span> <span class="k">=&gt;</span> <span class="p">{</span>
                            <span class="n">warehouse</span><span class="py">.robot</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span>
                        <span class="p">}</span>
                        <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{}</span>
                    <span class="p">}</span>
                    <span class="n">warehouse</span><span class="py">.legal</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
                    <span class="n">warehouse</span><span class="py">.legal</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
                    <span class="n">x</span> <span class="o">+=</span> <span class="mi">2</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="n">y</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
                <span class="n">warehouse</span>
            <span class="p">},</span>
        <span class="p">);</span>
        <span class="n">input</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.for_each</span><span class="p">(|</span><span class="n">line</span><span class="p">|</span> <span class="p">{</span>
            <span class="n">line</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.for_each</span><span class="p">(|</span><span class="n">c</span><span class="p">|</span> <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
                <span class="n">UP</span> <span class="k">=&gt;</span> <span class="n">warehouse_map</span><span class="py">.moves</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Move</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)),</span>
                <span class="n">DOWN</span> <span class="k">=&gt;</span> <span class="n">warehouse_map</span><span class="py">.moves</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Move</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)),</span>
                <span class="n">LEFT</span> <span class="k">=&gt;</span> <span class="n">warehouse_map</span><span class="py">.moves</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Move</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)),</span>
                <span class="n">RIGHT</span> <span class="k">=&gt;</span> <span class="n">warehouse_map</span><span class="py">.moves</span><span class="nf">.push</span><span class="p">(</span><span class="nf">Move</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="n">_</span> <span class="k">=&gt;</span> <span class="p">{}</span>
            <span class="p">});</span>
        <span class="p">});</span>

        <span class="n">warehouse_map</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">warehouse_map</span> <span class="o">=</span> <span class="nn">Warehouse</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">input</span><span class="p">);</span>


    <span class="k">while</span> <span class="o">!</span><span class="n">warehouse_map</span><span class="nf">.robot_finished</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">warehouse_map</span><span class="nf">.move_robot</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="n">warehouse_map</span><span class="nf">.print</span><span class="p">();</span>

    <span class="k">let</span> <span class="n">sol1</span> <span class="o">=</span> <span class="n">warehouse_map</span>
        <span class="py">.boxes</span>
        <span class="nf">.into_iter</span><span class="p">()</span>
        <span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="p">|</span><span class="n">acc</span><span class="p">,</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)|</span> <span class="p">{</span>
            <span class="n">acc</span> <span class="o">+</span> <span class="n">y</span><span class="o">*</span><span class="mi">100</span> <span class="o">+</span> <span class="n">x</span>
        <span class="p">});</span>


    <span class="nd">println!</span><span class="p">(</span><span class="s">"Solution 2: {}"</span><span class="p">,</span> <span class="n">sol1</span><span class="p">);</span>

<span class="p">}</span>

</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 89/100 - aoc2024 day 14</title><link href="https://maebli.github.io/archive/2024-12-14-100rust-89/" rel="alternate" type="text/html" title="Rust challenge 89/100 - aoc2024 day 14" /><published>2024-12-14T19:00:00+00:00</published><updated>2024-12-14T19:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-89</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-14-100rust-89/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#89th-challenge">89th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="89th-challenge">89th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m doing day13, as I should. <a href="https://adventofcode.com/2024/day/13">advent of code</a>. 
So I thought I was clever and started with dijkstra, but that was too slow. So I had to solve it analytically.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">pathfinding</span><span class="p">::</span><span class="nn">directed</span><span class="p">::{</span><span class="n">bfs</span><span class="p">,</span> <span class="nn">dijkstra</span><span class="p">::</span><span class="n">dijkstra</span><span class="p">};</span>
<span class="k">use</span> <span class="nn">std</span><span class="p">::{</span><span class="n">result</span><span class="p">,</span> <span class="nn">str</span><span class="p">::</span><span class="n">FromStr</span><span class="p">};</span>

<span class="k">fn</span> <span class="nf">parse_parts</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">,</span> <span class="n">delimiter</span><span class="p">:</span> <span class="nb">char</span><span class="p">,</span> <span class="n">indices</span><span class="p">:</span> <span class="p">(</span><span class="nb">usize</span><span class="p">,</span> <span class="nb">usize</span><span class="p">))</span> <span class="k">-&gt;</span> <span class="p">(</span><span class="nb">u64</span><span class="p">,</span> <span class="nb">u64</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">parts</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">s</span><span class="nf">.split</span><span class="p">(</span><span class="sc">' '</span><span class="p">)</span><span class="nf">.collect</span><span class="p">();</span>

    <span class="k">let</span> <span class="n">first</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="n">indices</span><span class="na">.0</span><span class="p">]</span>
        <span class="nf">.split</span><span class="p">(</span><span class="n">delimiter</span><span class="p">)</span>
        <span class="nf">.last</span><span class="p">()</span>
        <span class="nf">.unwrap</span><span class="p">()</span>
        <span class="nf">.replace</span><span class="p">(</span><span class="s">","</span><span class="p">,</span> <span class="s">""</span><span class="p">)</span>
        <span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span>
        <span class="nf">.expect</span><span class="p">(</span><span class="s">"Invalid first value"</span><span class="p">);</span>
    <span class="k">let</span> <span class="n">second</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="n">indices</span><span class="na">.1</span><span class="p">]</span>
        <span class="nf">.split</span><span class="p">(</span><span class="n">delimiter</span><span class="p">)</span>
        <span class="nf">.last</span><span class="p">()</span>
        <span class="nf">.unwrap</span><span class="p">()</span>
        <span class="nf">.replace</span><span class="p">(</span><span class="s">","</span><span class="p">,</span> <span class="s">""</span><span class="p">)</span>
        <span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span>
        <span class="nf">.expect</span><span class="p">(</span><span class="s">"Invalid second value"</span><span class="p">);</span>

    <span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">)</span>
<span class="p">}</span>

<span class="k">impl</span> <span class="n">FromStr</span> <span class="k">for</span> <span class="n">Delta</span> <span class="p">{</span>
    <span class="k">type</span> <span class="nb">Err</span> <span class="o">=</span> <span class="nb">String</span><span class="p">;</span>

    <span class="k">fn</span> <span class="nf">from_str</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="k">Self</span><span class="p">,</span> <span class="k">Self</span><span class="p">::</span><span class="nb">Err</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">let</span> <span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">)</span> <span class="o">=</span> <span class="nf">parse_parts</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="sc">'+'</span><span class="p">,</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="nf">Ok</span><span class="p">(</span><span class="nf">Delta</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">))</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">impl</span> <span class="n">FromStr</span> <span class="k">for</span> <span class="n">Pos</span> <span class="p">{</span>
    <span class="k">type</span> <span class="nb">Err</span> <span class="o">=</span> <span class="nb">String</span><span class="p">;</span>

    <span class="k">fn</span> <span class="nf">from_str</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="k">Self</span><span class="p">,</span> <span class="k">Self</span><span class="p">::</span><span class="nb">Err</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">let</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="o">=</span> <span class="nf">parse_parts</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="sc">'='</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
        <span class="nf">Ok</span><span class="p">(</span><span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">))</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="nd">#[derive(Clone,</span> <span class="nd">Debug,</span> <span class="nd">Eq,</span> <span class="nd">Hash,</span> <span class="nd">Ord,</span> <span class="nd">PartialEq,</span> <span class="nd">PartialOrd)]</span>
<span class="k">struct</span> <span class="nf">Delta</span><span class="p">(</span><span class="nb">u64</span><span class="p">,</span> <span class="nb">u64</span><span class="p">);</span>
<span class="nd">#[derive(Clone,</span> <span class="nd">Debug,</span> <span class="nd">Eq,</span> <span class="nd">Hash,</span> <span class="nd">Ord,</span> <span class="nd">PartialEq,</span> <span class="nd">PartialOrd)]</span>
<span class="k">struct</span> <span class="nf">Pos</span><span class="p">(</span><span class="nb">u64</span><span class="p">,</span> <span class="nb">u64</span><span class="p">);</span>

<span class="nd">#[derive(Clone,</span> <span class="nd">Debug,</span> <span class="nd">Eq,</span> <span class="nd">Hash,</span> <span class="nd">Ord,</span> <span class="nd">PartialEq,</span> <span class="nd">PartialOrd)]</span>
<span class="k">struct</span> <span class="n">ClawMachine</span> <span class="p">{</span>
    <span class="n">buttons</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Delta</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">prize</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span>
    <span class="n">current_pos</span><span class="p">:</span> <span class="n">Pos</span><span class="p">,</span>
    <span class="n">moves</span><span class="p">:</span> <span class="nb">u64</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">impl</span> <span class="n">ClawMachine</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">successors</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="n">ClawMachine</span><span class="p">,</span> <span class="nb">usize</span><span class="p">)</span><span class="o">&gt;</span> <span class="p">{</span>

        <span class="k">if</span> <span class="k">self</span><span class="py">.moves</span> <span class="o">&gt;</span> <span class="mi">1000</span> <span class="p">{</span>
            <span class="k">return</span> <span class="nd">vec!</span><span class="p">[];</span>
        <span class="p">}</span>

        <span class="k">let</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="o">=</span> <span class="k">self</span><span class="py">.current_pos</span><span class="p">;</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">claw_machine_a</span> <span class="o">=</span> <span class="k">self</span><span class="nf">.clone</span><span class="p">();</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">claw_machine_b</span> <span class="o">=</span> <span class="k">self</span><span class="nf">.clone</span><span class="p">();</span>

        <span class="n">claw_machine_a</span><span class="py">.current_pos</span> <span class="o">=</span> <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="k">self</span><span class="py">.buttons</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="na">.0</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="k">self</span><span class="py">.buttons</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="na">.1</span><span class="p">);</span>
        <span class="n">claw_machine_b</span><span class="py">.current_pos</span> <span class="o">=</span>  <span class="nf">Pos</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="k">self</span><span class="py">.buttons</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="na">.0</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="k">self</span><span class="py">.buttons</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="na">.1</span><span class="p">);</span>

        <span class="n">claw_machine_a</span><span class="py">.moves</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="n">claw_machine_b</span><span class="py">.moves</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
        
        <span class="nd">vec!</span><span class="p">[(</span><span class="n">claw_machine_a</span><span class="p">,</span><span class="mi">3</span><span class="p">),(</span><span class="n">claw_machine_b</span><span class="p">,</span><span class="mi">1</span><span class="p">)]</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="k">let</span> <span class="n">claw_machines</span> <span class="o">=</span>
        <span class="n">input</span>
            <span class="nf">.lines</span><span class="p">()</span>
            <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;&gt;</span><span class="p">()</span>
            <span class="nf">.chunks</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
            <span class="nf">.fold</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[],</span> <span class="p">|</span><span class="k">mut</span> <span class="n">claw_machines</span><span class="p">,</span> <span class="n">input</span><span class="p">|</span> <span class="p">{</span>
                <span class="n">claw_machines</span><span class="nf">.push</span><span class="p">(</span><span class="n">ClawMachine</span> <span class="p">{</span>
                    <span class="n">buttons</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="n">input</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">input</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()],</span>
                    <span class="n">prize</span><span class="p">:</span> <span class="n">input</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span>
                    <span class="n">current_pos</span><span class="p">:</span> <span class="nf">Pos</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
                    <span class="n">moves</span><span class="p">:</span><span class="mi">0</span>
                <span class="p">});</span>
                <span class="n">claw_machines</span>
            <span class="p">});</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="o">&amp;</span><span class="n">claw_machines</span><span class="p">);</span>

    <span class="c1">// initial solution using dijkstra that is slow..</span>
    <span class="c1">// let mut solution1= 0;</span>
    <span class="c1">// for c in &amp;claw_machines{</span>
    <span class="c1">//     println!("calculating claw machine {:?}",c);</span>
    <span class="c1">//     let result = dijkstra(c, |p| p.successors(), |p| p.prize == p.current_pos);</span>
    <span class="c1">//     if let Some(result) = result {</span>
    <span class="c1">//         println!("{:?}",result.1);</span>
    <span class="c1">//         solution1+=result.1;</span>
    <span class="c1">//     }else {</span>
    <span class="c1">//         println!("no result found");</span>
    <span class="c1">//     }</span>
    <span class="c1">// }</span>
    <span class="c1">// println!("{:?}",solution1);</span>

    <span class="c1">// for part two this will be too slow. But solving it analytically should be simple, the cost function is</span>
    <span class="c1">// ax+bx = px</span>
    <span class="c1">// ay+by = py</span>
    <span class="c1">// c= 3*a+b </span>
    <span class="c1">// solve =&gt;</span>
    <span class="c1">// a = (-b_x * p_y + b_y * p_x) / (a_x * b_y - a_y * b_x)</span>
    <span class="c1">// b = (a_x * p_y - a_y * p_x) / (a_x * b_y - a_y * b_x)</span>
    <span class="c1">// min cost = 3*a+b</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">solution2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span> <span class="n">c</span> <span class="k">in</span> <span class="o">&amp;</span><span class="n">claw_machines</span> <span class="p">{</span>

        <span class="k">let</span> <span class="n">a_x</span> <span class="o">=</span> <span class="n">c</span><span class="py">.buttons</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="na">.0</span> <span class="k">as</span> <span class="nb">i128</span> <span class="p">;</span>
        <span class="k">let</span> <span class="n">a_y</span> <span class="o">=</span> <span class="n">c</span><span class="py">.buttons</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="na">.1</span> <span class="k">as</span> <span class="nb">i128</span> <span class="p">;</span>
        <span class="k">let</span> <span class="n">b_x</span> <span class="o">=</span> <span class="n">c</span><span class="py">.buttons</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="na">.0</span> <span class="k">as</span> <span class="nb">i128</span><span class="p">;</span>
        <span class="k">let</span> <span class="n">b_y</span> <span class="o">=</span> <span class="n">c</span><span class="py">.buttons</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="na">.1</span> <span class="k">as</span> <span class="nb">i128</span><span class="p">;</span>
        <span class="k">let</span> <span class="n">p_x</span> <span class="o">=</span> <span class="n">c</span><span class="py">.prize</span><span class="na">.0</span> <span class="k">as</span> <span class="nb">i128</span><span class="p">;</span>
        <span class="k">let</span> <span class="n">p_y</span> <span class="o">=</span> <span class="n">c</span><span class="py">.prize</span><span class="na">.1</span> <span class="k">as</span> <span class="nb">i128</span><span class="p">;</span>

        <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="o">-</span><span class="n">b_x</span> <span class="o">*</span> <span class="n">p_y</span> <span class="o">+</span> <span class="n">b_y</span> <span class="o">*</span> <span class="n">p_x</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">a_x</span> <span class="o">*</span> <span class="n">b_y</span> <span class="o">-</span> <span class="n">a_y</span> <span class="o">*</span> <span class="n">b_x</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="p">(</span><span class="n">a_x</span> <span class="o">*</span> <span class="n">p_y</span> <span class="o">-</span> <span class="n">a_y</span> <span class="o">*</span> <span class="n">p_x</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">a_x</span> <span class="o">*</span> <span class="n">b_y</span> <span class="o">-</span> <span class="n">a_y</span> <span class="o">*</span> <span class="n">b_x</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">min_cost</span> <span class="o">=</span> <span class="mi">3</span><span class="o">*</span><span class="n">a</span><span class="o">+</span><span class="n">b</span><span class="p">;</span>

        <span class="c1">// check that its a valid solution</span>
        <span class="k">if</span> <span class="n">a_x</span><span class="o">*</span><span class="n">a</span><span class="o">+</span><span class="n">b_x</span><span class="o">*</span><span class="n">b</span> <span class="o">!=</span> <span class="n">p_x</span> <span class="p">||</span> <span class="n">a_y</span><span class="o">*</span><span class="n">a</span><span class="o">+</span><span class="n">b_y</span><span class="o">*</span><span class="n">b</span> <span class="o">!=</span> <span class="n">p_y</span> <span class="p">{</span>
            <span class="nd">println!</span><span class="p">(</span><span class="s">"invalid solution"</span><span class="p">);</span>
            <span class="k">continue</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="nd">println!</span><span class="p">(</span><span class="s">"a: {:?}, b: {:?}, min_cost: {:?}"</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">min_cost</span><span class="p">);</span>
        <span class="n">solution2</span><span class="o">+=</span><span class="n">min_cost</span><span class="p">;</span>
        
    <span class="p">}</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="n">solution2</span><span class="p">);</span>

 

<span class="p">}</span>

</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 88/100 - aoc2024 day 12</title><link href="https://maebli.github.io/archive/2024-12-12-100rust-88/" rel="alternate" type="text/html" title="Rust challenge 88/100 - aoc2024 day 12" /><published>2024-12-12T19:00:00+00:00</published><updated>2024-12-12T19:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-88</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-12-100rust-88/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#88th-challenge">88th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="88th-challenge">88th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Like every year, I am going to participate in the <a href="https://adventofcode.com/">Advent of Code</a>. 
Today I’m doing day12, as I should. <a href="https://adventofcode.com/2024/day/12">advent of code</a>. 
Part two as annyoing.</p>

<p><img src="/assets/img/aoc2024d12.png" alt="aoc2024 day 12" /></p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashMap</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">itertools</span><span class="p">::</span><span class="n">Itertools</span><span class="p">;</span>


<span class="k">const</span> <span class="n">POSSIBLE_EDGES</span><span class="p">:</span> <span class="p">[(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">);</span> <span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">),</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="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)];</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> 
    <span class="k">let</span> <span class="k">mut</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    
    <span class="k">let</span> <span class="n">field</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="nn">HashMap</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span> <span class="p">|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">:</span><span class="n">HashMap</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span><span class="nb">i32</span><span class="p">),</span><span class="nb">char</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">c</span><span class="p">|</span> <span class="p">{</span>
        <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
            <span class="n">c</span> <span class="k">if</span> <span class="n">c</span><span class="nf">.is_alphabetic</span><span class="p">()</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="n">acc</span><span class="nf">.insert</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">),</span> <span class="n">c</span><span class="p">);</span>
                <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">},</span>
            <span class="sc">'\n'</span> <span class="k">=&gt;</span> <span class="p">{</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">y</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span> <span class="p">},</span>
            <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{</span> <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span> <span class="p">},</span>
        <span class="p">}</span>
        <span class="n">acc</span>
    <span class="p">});</span>
    
    <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> 
    <span class="k">let</span> <span class="k">mut</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="k">let</span> <span class="n">regions</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="nn">HashMap</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span> <span class="p">|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">:</span><span class="n">HashMap</span><span class="o">&lt;</span><span class="nb">char</span><span class="p">,</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;&gt;&gt;</span><span class="p">,</span> <span class="n">c</span><span class="p">|</span> <span class="p">{</span>
        <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
            <span class="n">c</span> <span class="k">if</span> <span class="n">c</span><span class="nf">.is_alphabetic</span><span class="p">()</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">let</span> <span class="n">regions</span> <span class="o">=</span> <span class="n">acc</span><span class="nf">.entry</span><span class="p">(</span><span class="n">c</span><span class="p">)</span><span class="nf">.or_insert</span><span class="p">(</span><span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">());</span>
                <span class="k">let</span> <span class="k">mut</span> <span class="n">region</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
                <span class="n">region</span><span class="nf">.push</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
                <span class="n">regions</span><span class="nf">.push</span><span class="p">(</span><span class="n">region</span><span class="p">);</span>
                <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">},</span>
            <span class="sc">'\n'</span> <span class="k">=&gt;</span> <span class="p">{</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">y</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span> <span class="p">},</span>
            <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{</span> <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span> <span class="p">},</span>
        <span class="p">}</span>
        <span class="n">acc</span>
    <span class="p">});</span>
    
    <span class="k">let</span> <span class="n">regions_merged</span><span class="p">:</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="nb">char</span><span class="p">,</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;&gt;&gt;</span> <span class="o">=</span> <span class="n">regions</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|(</span><span class="n">key</span><span class="p">,</span> <span class="n">regions</span><span class="p">)|</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">merged</span> <span class="o">=</span> <span class="nf">merge_regions</span><span class="p">(</span><span class="n">regions</span><span class="p">);</span>
        <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">merged</span><span class="p">)</span>
    <span class="p">})</span><span class="nf">.collect</span><span class="p">();</span>


    <span class="k">let</span> <span class="k">mut</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">res2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span> <span class="n">regions</span> <span class="k">in</span> <span class="n">regions_merged</span> <span class="p">{</span>
        <span class="k">for</span> <span class="n">region</span> <span class="k">in</span> <span class="n">regions</span><span class="na">.1</span><span class="nf">.iter</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">area</span> <span class="o">=</span> <span class="nf">find_area</span><span class="p">(</span><span class="o">&amp;</span><span class="n">region</span><span class="p">);</span>
            <span class="k">let</span> <span class="n">perimeter</span> <span class="o">=</span> <span class="nf">find_perimeter</span><span class="p">(</span><span class="o">&amp;</span><span class="n">region</span><span class="p">);</span>
            <span class="n">res</span> <span class="o">=</span> <span class="n">res</span> <span class="o">+</span> <span class="n">area</span><span class="o">*</span><span class="n">perimeter</span><span class="p">;</span>
            <span class="k">let</span> <span class="n">discounted_perimeter</span> <span class="o">=</span> <span class="nf">find_sides</span><span class="p">(</span><span class="n">regions</span><span class="na">.0</span><span class="p">,</span><span class="o">&amp;</span><span class="n">region</span><span class="p">,</span><span class="n">field</span><span class="nf">.clone</span><span class="p">());</span>
            <span class="n">res2</span> <span class="o">=</span> <span class="n">res2</span> <span class="o">+</span> <span class="n">area</span><span class="o">*</span><span class="n">discounted_perimeter</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"Result1: {}"</span><span class="p">,</span> <span class="n">res</span><span class="p">);</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"Result2: {}"</span><span class="p">,</span> <span class="n">res2</span><span class="p">);</span>

<span class="p">}</span>

<span class="k">fn</span> <span class="nf">merge_regions</span><span class="p">(</span><span class="n">regions</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;&gt;</span> <span class="p">{</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">merged</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">unmerged</span> <span class="o">=</span> <span class="n">regions</span><span class="p">;</span>

    <span class="k">while</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="n">current_region</span><span class="p">)</span> <span class="o">=</span> <span class="n">unmerged</span><span class="nf">.pop</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">found_merge</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>
        
        <span class="k">for</span> <span class="n">existing_region</span> <span class="k">in</span> <span class="n">merged</span><span class="nf">.iter_mut</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">if</span> <span class="nf">should_merge</span><span class="p">(</span><span class="o">&amp;</span><span class="n">current_region</span><span class="p">,</span> <span class="n">existing_region</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">existing_region</span><span class="nf">.extend</span><span class="p">(</span><span class="n">current_region</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.cloned</span><span class="p">());</span>
                <span class="n">found_merge</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
                <span class="k">break</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
        
        <span class="k">if</span> <span class="o">!</span><span class="n">found_merge</span> <span class="p">{</span>
            <span class="n">merged</span><span class="nf">.push</span><span class="p">(</span><span class="n">current_region</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">changed</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
    <span class="k">while</span> <span class="n">changed</span> <span class="p">{</span>
        <span class="n">changed</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">merged</span><span class="nf">.len</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">j</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
            <span class="k">while</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">merged</span><span class="nf">.len</span><span class="p">()</span> <span class="p">{</span>
                <span class="k">if</span> <span class="nf">should_merge</span><span class="p">(</span><span class="o">&amp;</span><span class="n">merged</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">&amp;</span><span class="n">merged</span><span class="p">[</span><span class="n">j</span><span class="p">])</span> <span class="p">{</span>
                    <span class="k">let</span> <span class="n">region_j</span> <span class="o">=</span> <span class="n">merged</span><span class="nf">.remove</span><span class="p">(</span><span class="n">j</span><span class="p">);</span>
                    <span class="n">merged</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="nf">.extend</span><span class="p">(</span><span class="n">region_j</span><span class="p">);</span>
                    <span class="n">changed</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                    <span class="n">j</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span>
            <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">for</span> <span class="n">region</span> <span class="k">in</span> <span class="n">merged</span><span class="nf">.iter_mut</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">region</span><span class="nf">.sort_unstable</span><span class="p">();</span>
        <span class="n">region</span><span class="nf">.dedup</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="n">merged</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">should_merge</span><span class="p">(</span><span class="n">region1</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">region2</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
    <span class="n">region1</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.any</span><span class="p">(|</span><span class="n">p1</span><span class="p">|</span> <span class="p">{</span>
        <span class="n">region2</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.any</span><span class="p">(|</span><span class="n">p2</span><span class="p">|</span> <span class="nf">are_neighbors</span><span class="p">(</span><span class="o">*</span><span class="n">p1</span><span class="p">,</span> <span class="o">*</span><span class="n">p2</span><span class="p">))</span>
    <span class="p">})</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">are_neighbors</span><span class="p">(</span><span class="n">p1</span><span class="p">:</span> <span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">),</span> <span class="n">p2</span><span class="p">:</span> <span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">))</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
    <span class="n">POSSIBLE_EDGES</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.any</span><span class="p">(|(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">)|</span> <span class="p">{</span>
        <span class="n">p1</span><span class="na">.0</span> <span class="o">+</span> <span class="n">dx</span> <span class="o">==</span> <span class="n">p2</span><span class="na">.0</span> <span class="o">&amp;&amp;</span> <span class="n">p1</span><span class="na">.1</span> <span class="o">+</span> <span class="n">dy</span> <span class="o">==</span> <span class="n">p2</span><span class="na">.1</span>
    <span class="p">})</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">find_area</span><span class="p">(</span><span class="n">region</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">i32</span> <span class="p">{</span>
    <span class="n">region</span><span class="nf">.len</span><span class="p">()</span> <span class="k">as</span> <span class="nb">i32</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">find_perimeter</span><span class="p">(</span><span class="n">region</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">i32</span> <span class="p">{</span>
    <span class="n">region</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">p</span><span class="p">|</span> <span class="p">{</span>
        <span class="n">POSSIBLE_EDGES</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.filter</span><span class="p">(|(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">)|</span> <span class="p">{</span>
            <span class="o">!</span><span class="n">region</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">p</span><span class="na">.0</span> <span class="o">+</span> <span class="n">dx</span><span class="p">,</span> <span class="n">p</span><span class="na">.1</span> <span class="o">+</span> <span class="n">dy</span><span class="p">))</span>
        <span class="p">})</span><span class="nf">.count</span><span class="p">()</span> <span class="k">as</span> <span class="nb">i32</span>
    <span class="p">})</span><span class="nf">.sum</span><span class="p">()</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">find_sides</span><span class="p">(</span><span class="n">region_id</span><span class="p">:</span><span class="nb">char</span><span class="p">,</span><span class="n">region</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;</span><span class="p">,</span><span class="n">field</span><span class="p">:</span><span class="n">HashMap</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span><span class="nb">i32</span><span class="p">),</span><span class="nb">char</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">i32</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">neighbor_directions_inc_diag</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span>
        <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</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="p">),(</span><span class="mi">0</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">),(</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">),</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">1</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">1</span><span class="p">),(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
    <span class="p">];</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">corners</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="k">for</span> <span class="n">p</span> <span class="k">in</span> <span class="n">region</span><span class="nf">.iter</span><span class="p">()</span> <span class="p">{</span>

        <span class="k">let</span> <span class="n">neighbors</span> <span class="o">=</span> <span class="n">neighbor_directions_inc_diag</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">)|</span> <span class="p">{</span>
            <span class="p">(</span><span class="n">p</span><span class="na">.0</span> <span class="o">+</span> <span class="n">dx</span><span class="p">,</span> <span class="n">p</span><span class="na">.1</span> <span class="o">+</span> <span class="n">dy</span><span class="p">)</span>
        <span class="p">})</span><span class="nf">.map</span><span class="p">(|</span><span class="n">p</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">if</span> <span class="n">field</span><span class="nf">.contains_key</span><span class="p">(</span><span class="o">&amp;</span><span class="n">p</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">return</span> <span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="n">field</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="n">p</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="p">}</span><span class="k">else</span> <span class="p">{</span>
                <span class="k">return</span> <span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="o">&amp;</span><span class="sc">'*'</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">})</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">((</span><span class="nb">i32</span><span class="p">,</span><span class="nb">i32</span><span class="p">),</span><span class="o">&amp;</span><span class="nb">char</span><span class="p">)</span><span class="o">&gt;&gt;</span><span class="p">();</span>


        <span class="k">let</span> <span class="k">mut</span> <span class="n">pattern</span> <span class="o">=</span> <span class="n">neighbors</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|(</span><span class="n">p</span><span class="p">,</span><span class="n">neighbor_id</span><span class="p">)|</span> <span class="p">{</span>
            <span class="k">if</span> <span class="o">*</span><span class="n">neighbor_id</span> <span class="o">==</span> <span class="o">&amp;</span><span class="n">region_id</span> <span class="p">{</span>
                <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="mi">0</span>
        <span class="p">})</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;&gt;</span><span class="p">();</span>


        <span class="n">pattern</span><span class="nf">.push</span><span class="p">(</span><span class="n">pattern</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>

        <span class="k">let</span> <span class="n">corner_pattern</span> <span class="o">=</span><span class="n">pattern</span> 
            <span class="nf">.iter</span><span class="p">()</span>
            <span class="py">.tuple_windows</span><span class="p">::</span><span class="o">&lt;</span><span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">)</span><span class="o">&gt;</span><span class="p">()</span>
            <span class="nf">.step_by</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
        
    
        <span class="k">for</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span><span class="p">)</span> <span class="k">in</span> <span class="n">corner_pattern</span> <span class="p">{</span>
            <span class="k">match</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span><span class="p">)</span> <span class="p">{</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">1</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="n">corners</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">,</span>
                <span class="p">(</span><span class="mi">0</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="k">=&gt;</span> <span class="n">corners</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">,</span>
                <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="n">corners</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">,</span>
                <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">(),</span>
            <span class="p">}</span>
        <span class="p">}</span>

    <span class="p">}</span>

    <span class="n">corners</span>

<span class="p">}</span>

</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 87/100 - aoc2024 day 10</title><link href="https://maebli.github.io/archive/2024-12-09-100rust-87/" rel="alternate" type="text/html" title="Rust challenge 87/100 - aoc2024 day 10" /><published>2024-12-10T19:00:00+00:00</published><updated>2024-12-10T19:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-87</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-09-100rust-87/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#87th-challenge">87th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="87th-challenge">87th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Like every year, I am going to participate in the <a href="https://adventofcode.com/">Advent of Code</a>. 
Today I’m doing day6. Not doing it chronologically, also I’m already a bit behind :D <a href="https://adventofcode.com/2024/day/10">advent of code</a>. This was a bigger struggle than it should have been.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nd">#[derive(Debug,</span> <span class="nd">Clone,</span> <span class="nd">PartialEq,</span> <span class="nd">Eq,</span> <span class="nd">Hash)]</span>
<span class="k">struct</span> <span class="n">Point</span> <span class="p">{</span>
    <span class="n">x</span><span class="p">:</span> <span class="nb">u64</span><span class="p">,</span>
    <span class="n">y</span><span class="p">:</span> <span class="nb">u64</span><span class="p">,</span>
    <span class="n">z</span><span class="p">:</span> <span class="nb">u64</span><span class="p">,</span>
<span class="p">}</span>

<span class="nd">#[derive(Debug,</span> <span class="nd">Clone)]</span>
<span class="k">struct</span> <span class="n">Movement</span> <span class="p">{</span>
    <span class="n">dx</span><span class="p">:</span> <span class="nb">i64</span><span class="p">,</span>
    <span class="n">dy</span><span class="p">:</span> <span class="nb">i64</span><span class="p">,</span>
    <span class="n">dz</span><span class="p">:</span> <span class="nb">i64</span><span class="p">,</span>
<span class="p">}</span>

<span class="nd">#[derive(Debug,</span> <span class="nd">Clone)]</span>
<span class="k">struct</span> <span class="n">CloudMap</span><span class="p">{</span>
    <span class="n">points</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Point</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">trailheads</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Point</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">collected_tops</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Point</span><span class="o">&gt;</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">map</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="n">CloudMap</span><span class="p">{</span> <span class="n">points</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[]</span> <span class="p">,</span> <span class="n">trailheads</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[],</span> <span class="n">collected_tops</span><span class="p">:</span><span class="nd">vec!</span><span class="p">[]},</span> <span class="p">|</span><span class="k">mut</span> <span class="n">map</span><span class="p">,</span> <span class="n">c</span><span class="p">|</span> <span class="p">{</span>
        <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
            <span class="n">height</span> <span class="k">if</span> <span class="n">height</span><span class="nf">.is_numeric</span><span class="p">()</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">let</span> <span class="n">z</span> <span class="o">=</span> <span class="n">height</span><span class="nf">.to_string</span><span class="p">()</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
                <span class="nd">assert!</span><span class="p">(</span><span class="n">z</span><span class="o">&lt;=</span> <span class="mi">9</span><span class="p">);</span>
                <span class="n">map</span><span class="py">.points</span><span class="nf">.push</span><span class="p">(</span><span class="n">Point</span><span class="p">{</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">});</span>

                <span class="k">if</span> <span class="n">z</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
                    <span class="n">map</span><span class="py">.trailheads</span><span class="nf">.push</span><span class="p">(</span><span class="n">Point</span><span class="p">{</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">});</span>
                <span class="p">}</span>
                <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="sc">'\n'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
                <span class="n">y</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span> 
        <span class="p">}</span>
        <span class="n">map</span>
    <span class="p">});</span>

    <span class="k">let</span> <span class="n">out</span> <span class="o">=</span> <span class="n">map</span><span class="py">.trailheads</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">trailhead</span><span class="p">|</span> <span class="nf">trailhead_score</span><span class="p">(</span><span class="n">trailhead</span><span class="p">,</span> <span class="o">&amp;</span> <span class="k">mut</span> <span class="n">map</span><span class="nf">.clone</span><span class="p">()))</span><span class="py">.sum</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">();</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">out</span><span class="p">);</span>

<span class="p">}</span>

<span class="k">fn</span> <span class="nf">trailhead_score</span><span class="p">(</span><span class="n">trailhead</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Point</span><span class="p">,</span> <span class="n">map</span><span class="p">:</span> <span class="o">&amp;</span> <span class="k">mut</span> <span class="n">CloudMap</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span> <span class="p">{</span>

    <span class="c1">//if trailhead.z == 9 &amp;&amp; map.collected_tops.iter().all(|p| *p != *trailhead) { ( PART 1)</span>
    <span class="k">if</span> <span class="n">trailhead</span><span class="py">.z</span> <span class="o">==</span> <span class="mi">9</span> <span class="p">{</span>
        <span class="n">map</span><span class="py">.collected_tops</span><span class="nf">.push</span><span class="p">(</span><span class="n">trailhead</span><span class="nf">.clone</span><span class="p">());</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">score</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="k">let</span> <span class="n">legal_deltas</span><span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span>
        <span class="n">Movement</span><span class="p">{</span><span class="n">dx</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">dy</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">dz</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span>
        <span class="n">Movement</span><span class="p">{</span><span class="n">dx</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">dy</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">dz</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span>
        <span class="n">Movement</span><span class="p">{</span><span class="n">dx</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">dy</span><span class="p">:</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">dz</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span>
        <span class="n">Movement</span><span class="p">{</span><span class="n">dx</span><span class="p">:</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="n">dy</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">dz</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span>
    <span class="p">];</span>

    <span class="k">for</span> <span class="n">delta</span> <span class="k">in</span> <span class="n">legal_deltas</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">new_trailhead</span> <span class="o">=</span> <span class="n">Point</span><span class="p">{</span>
            <span class="n">x</span><span class="p">:</span> <span class="p">(</span><span class="n">trailhead</span><span class="py">.x</span> <span class="k">as</span> <span class="nb">i64</span> <span class="o">+</span> <span class="n">delta</span><span class="py">.dx</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">,</span>
            <span class="n">y</span><span class="p">:</span> <span class="p">(</span><span class="n">trailhead</span><span class="py">.y</span> <span class="k">as</span> <span class="nb">i64</span> <span class="o">+</span> <span class="n">delta</span><span class="py">.dy</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">,</span>
            <span class="n">z</span><span class="p">:</span> <span class="n">trailhead</span><span class="py">.z</span> <span class="o">+</span> <span class="n">delta</span><span class="py">.dz</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">,</span>
        <span class="p">};</span> 
        <span class="k">if</span> <span class="n">map</span><span class="py">.points</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.any</span><span class="p">(|</span><span class="n">p</span><span class="p">|</span> <span class="o">*</span><span class="n">p</span> <span class="o">==</span> <span class="n">new_trailhead</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">score</span> <span class="o">+=</span> <span class="nf">trailhead_score</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_trailhead</span><span class="p">,</span> <span class="n">map</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">score</span>
<span class="p">}</span>



</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 86/100 - aoc2024 day 6</title><link href="https://maebli.github.io/archive/2024-12-09-100rust-86/" rel="alternate" type="text/html" title="Rust challenge 86/100 - aoc2024 day 6" /><published>2024-12-09T19:00:00+00:00</published><updated>2024-12-09T19:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-86</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-09-100rust-86/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#86th-challenge">86th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="86th-challenge">86th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Like every year, I am going to participate in the <a href="https://adventofcode.com/">Advent of Code</a>. 
Today I’m doing day6. Not doing it chronologically, also I’m already a bit behind :D <a href="https://adventofcode.com/2024/day/6">advent of code</a>. This was a bigger struggle than it should have been.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code>


<span class="nd">#[derive(Debug,</span> <span class="nd">Clone)]</span>
<span class="k">struct</span> <span class="n">State</span> <span class="p">{</span>
    <span class="n">pos</span><span class="p">:</span> <span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">),</span>
    <span class="n">dir</span><span class="p">:</span> <span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">),</span>
<span class="p">}</span>

<span class="nd">#[derive(Debug,</span> <span class="nd">Clone)]</span>
<span class="k">struct</span> <span class="n">Game</span><span class="p">{</span>
    <span class="n">moves</span><span class="p">:</span> <span class="nb">i32</span><span class="p">,</span>
    <span class="n">visited</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">State</span><span class="o">&gt;</span><span class="p">,</span> 
    <span class="n">guard</span><span class="p">:</span> <span class="n">Guard</span> <span class="p">,</span>
    <span class="n">obstacles</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">legal_moves</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;</span><span class="p">,</span>
<span class="p">}</span>

<span class="nd">#[derive(Debug,</span> <span class="nd">Clone)]</span>
<span class="k">struct</span> <span class="n">Guard</span><span class="p">{</span>
    <span class="n">pos</span><span class="p">:</span> <span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">),</span>
    <span class="n">dir</span><span class="p">:</span> <span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">),</span>
    <span class="n">start</span><span class="p">:</span> <span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">),</span>
<span class="p">}</span>

<span class="nd">#[derive(Debug,PartialEq,Clone)]</span>
<span class="k">enum</span> <span class="n">GameState</span><span class="p">{</span>
    <span class="n">Running</span><span class="p">,</span>
    <span class="n">GuardExited</span><span class="p">,</span>
    <span class="n">GuardLooped</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">impl</span> <span class="n">Game</span> <span class="p">{</span>
    <span class="k">fn</span> <span class="nf">move_guard</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">GameState</span> <span class="p">{</span>

        <span class="k">if</span> <span class="k">self</span><span class="py">.visited</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.any</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="py">.pos</span> <span class="o">==</span> <span class="k">self</span><span class="py">.guard.pos</span> <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="py">.dir</span> <span class="o">==</span> <span class="k">self</span><span class="py">.guard.dir</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="nn">GameState</span><span class="p">::</span><span class="n">GuardLooped</span><span class="p">;</span>
        <span class="p">}</span> 

        <span class="k">let</span> <span class="n">state</span> <span class="o">=</span> <span class="n">State</span><span class="p">{</span><span class="n">pos</span><span class="p">:</span> <span class="k">self</span><span class="py">.guard.pos</span><span class="p">,</span> <span class="n">dir</span><span class="p">:</span> <span class="k">self</span><span class="py">.guard.dir</span><span class="p">};</span>
        <span class="k">self</span><span class="py">.visited</span><span class="nf">.push</span><span class="p">(</span><span class="n">state</span><span class="p">);</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">next_pos_in_same_dir</span> <span class="o">=</span> <span class="p">(</span><span class="k">self</span><span class="py">.guard.pos</span><span class="na">.0</span> <span class="o">+</span> <span class="k">self</span><span class="py">.guard.dir</span><span class="na">.0</span><span class="p">,</span> <span class="k">self</span><span class="py">.guard.pos</span><span class="na">.1</span> <span class="o">+</span> <span class="k">self</span><span class="py">.guard.dir</span><span class="na">.1</span><span class="p">);</span>

        
        <span class="k">while</span> <span class="k">self</span><span class="py">.obstacles</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">next_pos_in_same_dir</span><span class="p">)</span> <span class="p">{</span>
            <span class="c1">// rotate 90 degrees to the right</span>
            <span class="k">self</span><span class="py">.guard.dir</span> <span class="o">=</span> <span class="p">(</span><span class="o">-</span><span class="k">self</span><span class="py">.guard.dir</span><span class="na">.1</span><span class="p">,</span> <span class="k">self</span><span class="py">.guard.dir</span><span class="na">.0</span><span class="p">);</span>
            <span class="n">next_pos_in_same_dir</span> <span class="o">=</span> <span class="p">(</span><span class="k">self</span><span class="py">.guard.pos</span><span class="na">.0</span> <span class="o">+</span> <span class="k">self</span><span class="py">.guard.dir</span><span class="na">.0</span><span class="p">,</span> <span class="k">self</span><span class="py">.guard.pos</span><span class="na">.1</span> <span class="o">+</span> <span class="k">self</span><span class="py">.guard.dir</span><span class="na">.1</span><span class="p">);</span>
        <span class="p">}</span> 

        <span class="k">self</span><span class="py">.guard.pos</span> <span class="o">=</span> <span class="n">next_pos_in_same_dir</span><span class="p">;</span>

        <span class="k">if</span> <span class="k">self</span><span class="py">.legal_moves</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">next_pos_in_same_dir</span><span class="p">){</span>
            <span class="k">self</span><span class="py">.moves</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="k">return</span> <span class="nn">GameState</span><span class="p">::</span><span class="n">Running</span><span class="p">;</span>
        <span class="p">}</span> 
        
        <span class="nn">GameState</span><span class="p">::</span><span class="n">GuardExited</span>   

    <span class="p">}</span>
<span class="p">}</span>
<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">pos</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
    <span class="k">let</span> <span class="n">game</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="n">Game</span><span class="p">{</span><span class="n">moves</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="n">visited</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[],</span><span class="n">legal_moves</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[],</span><span class="n">guard</span><span class="p">:</span> <span class="n">Guard</span><span class="p">{</span><span class="n">pos</span><span class="p">:</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span><span class="n">dir</span><span class="p">:</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="n">start</span><span class="p">:</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span> <span class="p">},</span> <span class="n">obstacles</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[]},</span> <span class="p">|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">,</span> <span class="n">x</span><span class="p">|</span> <span class="p">{</span>
        <span class="n">acc</span><span class="py">.legal_moves</span><span class="nf">.push</span><span class="p">(</span><span class="n">pos</span><span class="p">);</span>
        <span class="k">match</span> <span class="n">x</span> <span class="p">{</span>
            <span class="sc">'#'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="n">acc</span><span class="py">.obstacles</span><span class="nf">.push</span><span class="p">(</span><span class="n">pos</span><span class="p">);</span>
                <span class="n">pos</span> <span class="o">=</span> <span class="p">(</span><span class="n">pos</span><span class="na">.0</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span><span class="p">);</span>
            <span class="p">}</span>
            <span class="sc">'^'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="n">acc</span><span class="py">.guard.start</span> <span class="o">=</span> <span class="n">pos</span><span class="p">;</span>
                <span class="n">acc</span><span class="py">.guard.pos</span> <span class="o">=</span> <span class="n">pos</span><span class="p">;</span>
                <span class="n">acc</span><span class="py">.guard.dir</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
                <span class="n">pos</span> <span class="o">=</span> <span class="p">(</span><span class="n">pos</span><span class="na">.0</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span><span class="p">);</span>
            <span class="p">},</span>
            <span class="sc">'v'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="n">acc</span><span class="py">.guard.start</span> <span class="o">=</span> <span class="n">pos</span><span class="p">;</span>
                <span class="n">acc</span><span class="py">.guard.pos</span> <span class="o">=</span> <span class="n">pos</span><span class="p">;</span>
                <span class="n">acc</span><span class="py">.guard.dir</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
                <span class="n">pos</span> <span class="o">=</span> <span class="p">(</span><span class="n">pos</span><span class="na">.0</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span><span class="p">);</span>
            <span class="p">},</span>
            <span class="sc">'&lt;'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="n">acc</span><span class="py">.guard.start</span> <span class="o">=</span> <span class="n">pos</span><span class="p">;</span>
                <span class="n">acc</span><span class="py">.guard.pos</span> <span class="o">=</span> <span class="n">pos</span><span class="p">;</span>
                <span class="n">acc</span><span class="py">.guard.dir</span> <span class="o">=</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
                <span class="n">pos</span> <span class="o">=</span> <span class="p">(</span><span class="n">pos</span><span class="na">.0</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span><span class="p">);</span>
            <span class="p">},</span>
            <span class="sc">'&gt;'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="n">acc</span><span class="py">.guard.start</span> <span class="o">=</span> <span class="n">pos</span><span class="p">;</span>
                <span class="n">acc</span><span class="py">.guard.pos</span> <span class="o">=</span> <span class="n">pos</span><span class="p">;</span>
                <span class="n">acc</span><span class="py">.guard.dir</span> <span class="o">=</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="n">pos</span> <span class="o">=</span> <span class="p">(</span><span class="n">pos</span><span class="na">.0</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span><span class="p">);</span>
            <span class="p">},</span> 
            <span class="sc">'\n'</span> <span class="k">=&gt;</span> <span class="n">pos</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span><span class="o">+</span><span class="mi">1</span><span class="p">),</span>
            <span class="sc">'.'</span> <span class="k">=&gt;</span> <span class="n">pos</span> <span class="o">=</span> <span class="p">(</span><span class="n">pos</span><span class="na">.0</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span><span class="p">),</span> 
            <span class="n">_</span> <span class="k">=&gt;</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"Invalid character"</span><span class="p">),</span>
        <span class="p">};</span>
        <span class="n">acc</span>
    <span class="p">});</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">game1</span> <span class="o">=</span> <span class="n">game</span><span class="nf">.clone</span><span class="p">();</span>
    <span class="k">while</span> <span class="n">game1</span><span class="nf">.move_guard</span><span class="p">()</span> <span class="o">==</span> <span class="nn">GameState</span><span class="p">::</span><span class="n">Running</span> <span class="p">{};</span>

    <span class="k">let</span> <span class="n">visited</span> <span class="o">=</span> <span class="n">game1</span><span class="py">.visited</span><span class="nf">.iter</span><span class="p">()</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;&amp;</span><span class="n">State</span><span class="o">&gt;&gt;</span><span class="p">();</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="n">visited</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">game2</span> <span class="o">=</span> <span class="n">game</span><span class="nf">.clone</span><span class="p">();</span>
        <span class="k">if</span> <span class="n">x</span><span class="py">.pos</span> <span class="o">==</span> <span class="n">game2</span><span class="py">.guard.start</span> <span class="p">{</span>
            <span class="k">return</span> <span class="p">(</span><span class="nn">GameState</span><span class="p">::</span><span class="n">GuardExited</span><span class="p">,</span> <span class="n">x</span><span class="py">.pos</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="n">game2</span><span class="py">.obstacles</span><span class="nf">.push</span><span class="p">(</span><span class="n">x</span><span class="py">.pos</span><span class="p">);</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">game_state</span> <span class="o">=</span> <span class="nn">GameState</span><span class="p">::</span><span class="n">Running</span><span class="p">;</span>
        <span class="k">while</span> <span class="n">game_state</span> <span class="o">==</span> <span class="nn">GameState</span><span class="p">::</span><span class="n">Running</span> <span class="p">{</span>
            <span class="n">game_state</span> <span class="o">=</span> <span class="n">game2</span><span class="nf">.move_guard</span><span class="p">();</span>
        <span class="p">};</span>
        <span class="n">game2</span><span class="py">.obstacles</span><span class="nf">.pop</span><span class="p">();</span>
        <span class="p">(</span><span class="n">game_state</span><span class="p">,</span> <span class="n">x</span><span class="py">.pos</span><span class="p">)</span>
    <span class="p">})</span><span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span>
        <span class="o">&amp;</span><span class="n">x</span><span class="na">.0</span> <span class="o">==</span> <span class="o">&amp;</span><span class="nn">GameState</span><span class="p">::</span><span class="n">GuardLooped</span>
    <span class="p">})</span><span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span>
        <span class="n">x</span><span class="na">.1</span>
    <span class="p">})</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;&gt;</span><span class="p">();</span>

    <span class="n">x</span><span class="nf">.sort</span><span class="p">();</span>
    <span class="n">x</span><span class="nf">.dedup</span><span class="p">();</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">x</span><span class="nf">.len</span><span class="p">());</span>

<span class="p">}</span>


</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 85/100 - aoc2024 day 7</title><link href="https://maebli.github.io/archive/2024-12-07-100rust-85/" rel="alternate" type="text/html" title="Rust challenge 85/100 - aoc2024 day 7" /><published>2024-12-07T11:00:00+00:00</published><updated>2024-12-07T11:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-85</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-07-100rust-85/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#85th-challenge">85th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="85th-challenge">85th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Like every year, I am going to participate in the <a href="https://adventofcode.com/">Advent of Code</a>. 
Lets get started with <a href="https://adventofcode.com/2024/day/7">advent of code</a></p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="k">use</span> <span class="nn">itertools</span><span class="p">::</span><span class="n">Itertools</span><span class="p">;</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

    <span class="k">let</span> <span class="n">symbols</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">];</span> 
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">line</span><span class="p">|</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="nf">.replace</span><span class="p">(</span><span class="s">":"</span><span class="p">,</span> <span class="s">""</span><span class="p">);</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="nf">.split</span><span class="p">(</span><span class="s">" "</span><span class="p">)</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="o">&gt;&gt;</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="n">line</span><span class="nf">.remove</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">numbers</span> <span class="o">=</span> <span class="n">line</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i64</span><span class="o">&gt;&gt;</span><span class="p">();</span>
        <span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">numbers</span><span class="p">)</span>
    <span class="p">})</span><span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="p">|</span><span class="n">acc</span><span class="p">,</span> <span class="n">x</span><span class="p">|</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">permutations</span> <span class="o">=</span> <span class="nn">std</span><span class="p">::</span><span class="nn">iter</span><span class="p">::</span><span class="nf">repeat</span><span class="p">(</span><span class="n">symbols</span><span class="nf">.clone</span><span class="p">())</span><span class="nf">.take</span><span class="p">(</span><span class="n">x</span><span class="na">.1</span><span class="nf">.len</span><span class="p">())</span>
        <span class="nf">.multi_cartesian_product</span><span class="p">();</span>
        
        <span class="k">for</span> <span class="n">perm</span> <span class="k">in</span> <span class="n">permutations</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">values</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">perm</span><span class="p">;</span>
            <span class="k">let</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">values</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.enumerate</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="p">|</span><span class="n">acc</span><span class="p">,</span> <span class="n">k</span><span class="p">|</span> <span class="p">{</span>
                
                <span class="k">match</span> <span class="n">k</span><span class="na">.1</span><span class="p">{</span>
                    <span class="mi">0</span> <span class="k">=&gt;</span> <span class="p">{</span>
                        <span class="n">acc</span> <span class="o">+</span> <span class="n">x</span><span class="na">.1</span><span class="p">[</span><span class="n">k</span><span class="na">.0</span><span class="p">]</span>
                    <span class="p">},</span>
                    <span class="mi">1</span> <span class="k">=&gt;</span> <span class="p">{</span>
                        <span class="n">acc</span> <span class="o">*</span> <span class="n">x</span><span class="na">.1</span><span class="p">[</span><span class="n">k</span><span class="na">.0</span><span class="p">]</span>
                    <span class="p">},</span>
                    <span class="mi">3</span> <span class="k">=&gt;</span> <span class="p">{</span>
                        <span class="k">let</span> <span class="n">digits</span> <span class="o">=</span> <span class="nf">count_digits</span><span class="p">(</span><span class="n">x</span><span class="na">.1</span><span class="p">[</span><span class="n">k</span><span class="na">.0</span><span class="p">]);</span>
                        <span class="n">acc</span><span class="o">*</span><span class="mi">10i64</span><span class="nf">.pow</span><span class="p">(</span><span class="n">digits</span><span class="p">)</span> <span class="o">+</span> <span class="n">x</span><span class="na">.1</span><span class="p">[</span><span class="n">k</span><span class="na">.0</span><span class="p">]</span>
                    <span class="p">},</span>
                    <span class="n">_</span> <span class="k">=&gt;</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"Invalid symbol"</span><span class="p">)</span>
                <span class="p">}</span>
            <span class="p">});</span>

            <span class="k">if</span> <span class="n">sum</span> <span class="o">==</span> <span class="n">x</span><span class="na">.0</span> <span class="p">{</span>
                <span class="k">return</span> <span class="n">acc</span> <span class="o">+</span> <span class="n">sum</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="n">acc</span>
    <span class="p">});</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"x: {:?}"</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">count_digits</span><span class="p">(</span><span class="n">n</span><span class="p">:</span> <span class="nb">i64</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u32</span> <span class="p">{</span>
    <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
        <span class="mi">1</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="p">(</span><span class="n">n</span><span class="nf">.abs</span><span class="p">()</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">)</span><span class="nf">.log10</span><span class="p">()</span><span class="nf">.floor</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u32</span> <span class="o">+</span> <span class="mi">1</span>
    <span class="p">}</span>
<span class="p">}</span>

</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 84/100 - aoc2024 day 4</title><link href="https://maebli.github.io/archive/2024-12-04-100rust-84/" rel="alternate" type="text/html" title="Rust challenge 84/100 - aoc2024 day 4" /><published>2024-12-04T11:00:00+00:00</published><updated>2024-12-04T11:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-84</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-04-100rust-84/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#84th-challenge">84th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="84th-challenge">84th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Like every year, I am going to participate in the <a href="https://adventofcode.com/">Advent of Code</a>. 
Lets get started with <a href="https://adventofcode.com/2024/day/4">advent of code</a></p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="k">use</span> <span class="nn">std</span><span class="p">::{</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashMap</span><span class="p">,</span> <span class="n">vec</span><span class="p">};</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="k">let</span> <span class="n">lut</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">HashMap</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">),</span> <span class="nb">char</span><span class="o">&gt;</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">input</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="nn">HashMap</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span> <span class="p">|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">,</span> <span class="n">c</span><span class="p">|</span> <span class="p">{</span>
        <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
            <span class="sc">'X'</span> <span class="p">|</span> <span class="sc">'M'</span> <span class="p">|</span> <span class="sc">'A'</span> <span class="p">|</span> <span class="sc">'S'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="n">acc</span><span class="nf">.insert</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">),</span> <span class="n">c</span><span class="p">);</span>
                <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="sc">'\n'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="n">y</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="n">_</span> <span class="k">=&gt;</span> <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">,</span>
        <span class="p">}</span>
        <span class="n">acc</span>
    <span class="p">});</span>


    <span class="k">let</span> <span class="k">mut</span> <span class="n">occurances</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">_</span><span class="p">)</span> <span class="k">in</span> <span class="n">lut</span> <span class="p">{</span>
        <span class="n">occurances</span> <span class="o">+=</span> <span class="nf">find_word_occurances</span><span class="p">(</span><span class="o">*</span><span class="n">k</span><span class="p">,</span><span class="n">lut</span><span class="p">,</span><span class="s">"XMAS"</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"Occurances of XMAS {}"</span><span class="p">,</span><span class="n">occurances</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">cross_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">_</span><span class="p">)</span> <span class="k">in</span> <span class="n">lut</span> <span class="p">{</span>
        <span class="k">if</span> <span class="nf">is_cross</span><span class="p">(</span><span class="o">*</span><span class="n">k</span><span class="p">,</span><span class="n">lut</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">cross_count</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"Cross count {}"</span><span class="p">,</span><span class="n">cross_count</span><span class="p">);</span>


<span class="p">}</span>

<span class="k">fn</span> <span class="nf">find_word_occurances</span><span class="p">(</span><span class="n">pos</span><span class="p">:(</span><span class="nb">i32</span><span class="p">,</span><span class="nb">i32</span><span class="p">),</span><span class="n">lut</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">HashMap</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">),</span> <span class="nb">char</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">word</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">i32</span> <span class="p">{</span>

    <span class="k">if</span> <span class="n">lut</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="n">pos</span><span class="p">)</span> <span class="o">!=</span> <span class="nf">Some</span><span class="p">(</span><span class="o">&amp;</span><span class="n">word</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.nth</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">())</span> <span class="p">{</span>
        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
    <span class="p">}</span>
    
    <span class="k">let</span> <span class="n">neighbours</span> <span class="o">=</span> <span class="nf">neighbours</span><span class="p">(</span><span class="n">pos</span><span class="na">.0</span><span class="p">,</span><span class="n">pos</span><span class="na">.1</span><span class="p">,</span><span class="n">lut</span><span class="p">);</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="k">for</span> <span class="n">n</span> <span class="k">in</span> <span class="n">neighbours</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">direction</span> <span class="o">=</span> <span class="p">(</span><span class="n">n</span><span class="na">.0</span> <span class="o">-</span> <span class="n">pos</span><span class="na">.0</span><span class="p">,</span> <span class="n">n</span><span class="na">.1</span> <span class="o">-</span> <span class="n">pos</span><span class="na">.1</span><span class="p">);</span>

        <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">1</span><span class="o">..</span><span class="n">word</span><span class="nf">.len</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">pos</span><span class="na">.0</span> <span class="o">+</span> <span class="n">direction</span><span class="na">.0</span> <span class="o">*</span> <span class="n">i</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">;</span>
            <span class="k">let</span> <span class="n">y</span> <span class="o">=</span> <span class="n">pos</span><span class="na">.1</span> <span class="o">+</span> <span class="n">direction</span><span class="na">.1</span> <span class="o">*</span> <span class="n">i</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">;</span>

            <span class="k">if</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="o">=</span> <span class="n">lut</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">))</span> <span class="p">{</span>
                <span class="k">if</span> <span class="n">c</span> <span class="o">!=</span> <span class="o">&amp;</span><span class="n">word</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.nth</span><span class="p">(</span><span class="n">i</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="p">{</span>
                    <span class="k">break</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="n">word</span><span class="nf">.len</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">{</span>
                    <span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                <span class="k">break</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="n">count</span><span class="p">;</span>

<span class="p">}</span>

<span class="k">fn</span> <span class="nf">is_cross</span><span class="p">(</span><span class="n">pos</span><span class="p">:(</span><span class="nb">i32</span><span class="p">,</span><span class="nb">i32</span><span class="p">),</span><span class="n">lut</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">HashMap</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">),</span> <span class="nb">char</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
    
    <span class="k">if</span> <span class="n">lut</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="n">pos</span><span class="p">)</span> <span class="o">!=</span> <span class="nf">Some</span><span class="p">(</span><span class="o">&amp;</span><span class="sc">'A'</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="n">neighbours</span> <span class="o">=</span> <span class="nf">diagonal_neighbours</span><span class="p">(</span><span class="n">pos</span><span class="na">.0</span><span class="p">,</span> <span class="n">pos</span><span class="na">.1</span><span class="p">,</span> <span class="n">lut</span><span class="p">);</span>
    <span class="k">if</span> <span class="n">neighbours</span><span class="nf">.len</span><span class="p">()</span> <span class="o">!=</span> <span class="mi">4</span> <span class="p">{</span>
        <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">s</span> <span class="o">=</span> <span class="nn">String</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
    <span class="k">for</span> <span class="n">n</span> <span class="k">in</span> <span class="n">neighbours</span> <span class="p">{</span>
        <span class="n">s</span><span class="nf">.push</span><span class="p">(</span><span class="o">*</span><span class="n">lut</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="n">n</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
    <span class="p">}</span>

    <span class="k">if</span> <span class="n">s</span> <span class="o">==</span> <span class="s">"MSMS"</span> <span class="p">||</span> <span class="n">s</span> <span class="o">==</span> <span class="s">"SMSM"</span> <span class="p">||</span> <span class="n">s</span> <span class="o">==</span> <span class="s">"SSMM"</span> <span class="p">||</span> <span class="n">s</span> <span class="o">==</span> <span class="s">"MMSS"</span> <span class="p">{</span>
        <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="k">false</span><span class="p">;</span>

<span class="p">}</span>

<span class="k">fn</span> <span class="nf">neighbours</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="nb">i32</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="nb">i32</span><span class="p">,</span><span class="n">lut</span><span class="p">:</span><span class="o">&amp;</span><span class="n">HashMap</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span><span class="nb">i32</span><span class="p">),</span><span class="nb">char</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">v</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>
    <span class="n">v</span><span class="nf">.push</span><span class="p">((</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
    <span class="n">v</span><span class="nf">.push</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="mi">1</span><span class="p">));</span>
    <span class="n">v</span><span class="nf">.push</span><span class="p">((</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="mi">1</span><span class="p">));</span>
    <span class="n">v</span><span class="nf">.push</span><span class="p">((</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">));</span>
    <span class="n">v</span><span class="nf">.push</span><span class="p">((</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="mi">1</span><span class="p">));</span>
    <span class="n">v</span><span class="nf">.push</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">1</span><span class="p">));</span>
    <span class="n">v</span><span class="nf">.push</span><span class="p">((</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">1</span><span class="p">));</span>
    <span class="n">v</span><span class="nf">.push</span><span class="p">((</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">1</span><span class="p">));</span>
    <span class="n">v</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.filter</span><span class="p">(|</span><span class="n">n</span><span class="p">|</span> <span class="n">lut</span><span class="nf">.contains_key</span><span class="p">(</span><span class="n">n</span><span class="p">))</span><span class="nf">.collect</span><span class="p">()</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">diagonal_neighbours</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="nb">i32</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="nb">i32</span><span class="p">,</span><span class="n">lut</span><span class="p">:</span><span class="o">&amp;</span><span class="n">HashMap</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span><span class="nb">i32</span><span class="p">),</span><span class="nb">char</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">v</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>
    <span class="n">v</span><span class="nf">.push</span><span class="p">((</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="mi">1</span><span class="p">));</span>
    <span class="n">v</span><span class="nf">.push</span><span class="p">((</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="mi">1</span><span class="p">));</span>
    <span class="n">v</span><span class="nf">.push</span><span class="p">((</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">1</span><span class="p">));</span>
    <span class="n">v</span><span class="nf">.push</span><span class="p">((</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">1</span><span class="p">));</span>
    <span class="n">v</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.filter</span><span class="p">(|</span><span class="n">n</span><span class="p">|</span> <span class="n">lut</span><span class="nf">.contains_key</span><span class="p">(</span><span class="n">n</span><span class="p">))</span><span class="nf">.collect</span><span class="p">()</span>
<span class="p">}</span>

</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 83/100 - aoc2024 day 3</title><link href="https://maebli.github.io/archive/2024-12-03-100rust-83/" rel="alternate" type="text/html" title="Rust challenge 83/100 - aoc2024 day 3" /><published>2024-12-03T11:00:00+00:00</published><updated>2024-12-03T11:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-83</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-03-100rust-83/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#83rd-challenge">83rd Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="83rd-challenge">83rd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Like every year, I am going to participate in the <a href="https://adventofcode.com/">Advent of Code</a>. 
Lets get started with <a href="https://adventofcode.com/2024/day/3">advent of code</a></p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nd">#[derive(Debug)]</span>
<span class="k">enum</span> <span class="n">Token</span> <span class="p">{</span>
    <span class="nf">Number</span><span class="p">(</span><span class="nb">usize</span><span class="p">),</span>
    <span class="n">Multiply</span><span class="p">,</span>
<span class="p">}</span>


<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="k">let</span> <span class="n">chars</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.chars</span><span class="p">();</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">tokens</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">chars</span> <span class="o">=</span> <span class="n">chars</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.peekable</span><span class="p">();</span>


    <span class="k">let</span> <span class="k">mut</span> <span class="n">enabled</span><span class="o">=</span> <span class="k">true</span><span class="p">;</span>
    <span class="k">while</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="o">=</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
            <span class="sc">'m'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">if</span> <span class="o">!</span><span class="n">enabled</span> <span class="p">{</span>
                    <span class="k">continue</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="k">if</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">'u'</span><span class="p">)</span> <span class="o">=</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="p">{</span>
                    <span class="k">if</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">'l'</span><span class="p">)</span> <span class="o">=</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="p">{</span>
                        <span class="k">if</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">'('</span><span class="p">)</span> <span class="o">=</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="p">{</span>
                            <span class="n">tokens</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Token</span><span class="p">::</span><span class="n">Multiply</span><span class="p">);</span>
                            <span class="k">let</span> <span class="k">mut</span> <span class="n">number</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> 
                            <span class="k">while</span> <span class="n">chars</span><span class="nf">.peek</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.is_digit</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
                                <span class="k">if</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="o">=</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="p">{</span>
                                    <span class="k">if</span> <span class="n">c</span><span class="nf">.is_digit</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
                                        <span class="n">number</span> <span class="o">=</span> <span class="n">number</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="n">c</span><span class="nf">.to_digit</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">;</span>
                                    <span class="p">}</span>
                                <span class="p">}</span>
                            <span class="p">}</span>
                            <span class="k">if</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="o">!=</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">','</span><span class="p">){</span>
                                <span class="n">tokens</span><span class="nf">.pop</span><span class="p">();</span>
                                <span class="k">continue</span><span class="p">;</span>
                            <span class="p">}</span>
                            <span class="n">tokens</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Token</span><span class="p">::</span><span class="nf">Number</span><span class="p">(</span><span class="n">number</span><span class="p">));</span>

                            <span class="k">let</span> <span class="k">mut</span> <span class="n">number</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
                            <span class="k">while</span> <span class="n">chars</span><span class="nf">.peek</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.is_digit</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
                                <span class="k">if</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="o">=</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="p">{</span>
                                    <span class="k">if</span> <span class="n">c</span><span class="nf">.is_digit</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
                                        <span class="n">number</span> <span class="o">=</span> <span class="n">number</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="n">c</span><span class="nf">.to_digit</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">;</span>
                                    <span class="p">}</span>
                                <span class="p">}</span>
                            <span class="p">}</span>
                            <span class="k">if</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="o">!=</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">')'</span><span class="p">){</span>
                                <span class="n">tokens</span><span class="nf">.pop</span><span class="p">();</span>
                                <span class="n">tokens</span><span class="nf">.pop</span><span class="p">();</span>
                                <span class="k">continue</span><span class="p">;</span>
                            <span class="p">}</span>
                            <span class="n">tokens</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Token</span><span class="p">::</span><span class="nf">Number</span><span class="p">(</span><span class="n">number</span><span class="p">));</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
            <span class="sc">'d'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">if</span> <span class="n">enabled</span> <span class="o">&amp;&amp;</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">'o'</span><span class="p">)</span> 
                           <span class="o">&amp;&amp;</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">'n'</span><span class="p">)</span> 
                           <span class="o">&amp;&amp;</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">'\''</span><span class="p">)</span>
                           <span class="o">&amp;&amp;</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">'t'</span><span class="p">)</span> 
                           <span class="o">&amp;&amp;</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">'('</span><span class="p">)</span> 
                           <span class="o">&amp;&amp;</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">')'</span><span class="p">)</span> <span class="p">{</span>
                    <span class="n">enabled</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>
                <span class="p">}</span><span class="k">else</span> <span class="k">if</span> <span class="o">!</span><span class="n">enabled</span> <span class="o">&amp;&amp;</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">'o'</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">'('</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">chars</span><span class="nf">.next</span><span class="p">()</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="sc">')'</span><span class="p">)</span> <span class="p">{</span>
                    <span class="n">enabled</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span>
            <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">(),</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="n">x</span><span class="o">=</span> <span class="n">tokens</span><span class="nf">.windows</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span><span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="p">|</span><span class="n">acc</span><span class="p">,</span> <span class="n">x</span><span class="p">|</span> <span class="p">{</span>
        <span class="k">match</span> <span class="n">x</span> <span class="p">{</span>
            <span class="p">[</span> <span class="nn">Token</span><span class="p">::</span><span class="n">Multiply</span><span class="p">,</span><span class="nn">Token</span><span class="p">::</span><span class="nf">Number</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="nn">Token</span><span class="p">::</span><span class="nf">Number</span><span class="p">(</span><span class="n">b</span><span class="p">)]</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="n">acc</span> <span class="o">+</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span>
            <span class="p">}</span>
            <span class="n">_</span> <span class="k">=&gt;</span> <span class="n">acc</span>
        <span class="p">}</span>
    <span class="p">});</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"Result: {:?}"</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>


<span class="p">}</span>

</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 82/100 - aoc2024 day 2</title><link href="https://maebli.github.io/archive/2024-12-02-100rust-82/" rel="alternate" type="text/html" title="Rust challenge 82/100 - aoc2024 day 2" /><published>2024-12-02T11:00:00+00:00</published><updated>2024-12-02T11:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-82</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-02-100rust-82/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#82nd-challenge">82nd Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="82nd-challenge">82nd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Like every year, I am going to participate in the <a href="https://adventofcode.com/">Advent of Code</a>. 
Lets get started with <a href="https://adventofcode.com/2024/day/2">advent of code</a></p>

<p><img src="/assets/img/aoc2024d2.png" alt="aoc2024 day 2" /></p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"Result1: {:?}"</span><span class="p">,</span> <span class="nf">calc_res</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">input</span><span class="p">));</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"Result2: {:?}"</span><span class="p">,</span> <span class="nf">calc_res</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">input</span><span class="p">));</span>

<span class="p">}</span>

<span class="k">fn</span> <span class="nf">calc_res</span><span class="p">(</span><span class="n">num</span><span class="p">:</span> <span class="nb">i32</span><span class="p">,</span><span class="n">input</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">usize</span> <span class="p">{</span>
    <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span>
    <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span>
        <span class="k">let</span> <span class="n">line</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.split_whitespace</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">n</span><span class="p">|</span> <span class="n">n</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;&gt;</span><span class="p">();</span>
        <span class="k">if</span> <span class="n">num</span> <span class="o">==</span> <span class="mi">2</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">line_variations</span> <span class="o">=</span> <span class="nf">subsets_missing_one</span><span class="p">(</span><span class="o">&amp;</span><span class="n">line</span><span class="p">);</span>

            <span class="k">for</span> <span class="n">line</span> <span class="k">in</span> <span class="n">line_variations</span> <span class="p">{</span>
                <span class="k">if</span> <span class="nf">check_line</span><span class="p">(</span><span class="o">&amp;</span><span class="n">line</span><span class="p">)</span> <span class="p">{</span>
                    <span class="k">return</span> <span class="k">true</span><span class="p">;</span> 
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="nf">check_line</span><span class="p">(</span><span class="o">&amp;</span><span class="n">line</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="p">)</span><span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="o">*</span><span class="n">x</span><span class="p">)</span><span class="nf">.count</span><span class="p">()</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">check_line</span><span class="p">(</span><span class="n">line</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">line</span>
                <span class="nf">.windows</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
                <span class="nf">.map</span><span class="p">(|</span><span class="n">w</span><span class="p">|</span> <span class="n">w</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">w</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
                <span class="nf">.fold</span><span class="p">(</span> <span class="p">(</span><span class="k">true</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="p">|</span><span class="n">acc</span><span class="p">,</span> <span class="n">x</span><span class="p">|</span> 
                    <span class="p">(</span>   
                        <span class="p">(</span><span class="n">acc</span><span class="na">.0</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">x</span><span class="nf">.abs</span><span class="p">()</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="nf">.abs</span><span class="p">()</span> <span class="o">&lt;=</span> <span class="mi">3</span><span class="p">),</span>
                        <span class="n">acc</span><span class="na">.1</span><span class="o">+</span><span class="p">((</span><span class="n">x</span><span class="o">&gt;=</span><span class="mi">0</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u32</span> <span class="p">))</span>
                    <span class="p">)</span>
                    <span class="p">);</span>
    <span class="n">x</span><span class="na">.0</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">x</span><span class="na">.1</span><span class="o">==</span><span class="mi">0</span> <span class="p">||</span> <span class="n">x</span><span class="na">.1</span><span class="o">==</span><span class="p">(</span><span class="n">line</span><span class="nf">.len</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u32</span><span class="p">)</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="n">subsets_missing_one</span><span class="o">&lt;</span><span class="n">T</span><span class="p">:</span> <span class="nb">Clone</span><span class="o">&gt;</span><span class="p">(</span><span class="n">input</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;</span> <span class="p">{</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">result</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
    <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">input</span><span class="nf">.len</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">subset</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.clone</span><span class="p">();</span>
        <span class="n">subset</span><span class="nf">.remove</span><span class="p">(</span><span class="n">i</span><span class="p">);</span> 
        <span class="n">result</span><span class="nf">.push</span><span class="p">(</span><span class="n">subset</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="n">result</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 81/100 - aoc2024 day 1</title><link href="https://maebli.github.io/archive/2024-12-01-100rust-81/" rel="alternate" type="text/html" title="Rust challenge 81/100 - aoc2024 day 1" /><published>2024-12-01T11:00:00+00:00</published><updated>2024-12-01T11:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-81</id><content type="html" xml:base="https://maebli.github.io/archive/2024-12-01-100rust-81/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#81st-challenge">81st Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="81st-challenge">81st Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Like every year, I am going to participate in the <a href="https://adventofcode.com/">Advent of Code</a>. 
Lets get started with <a href="https://adventofcode.com/2024/day/1">advent of code</a></p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>
    <span class="k">let</span> <span class="n">numbers</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.split_whitespace</span><span class="p">();</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">left</span> <span class="o">=</span> <span class="n">numbers</span>
        <span class="nf">.clone</span><span class="p">()</span> 
        <span class="nf">.enumerate</span><span class="p">()</span>
        <span class="nf">.filter</span><span class="p">(|(</span><span class="n">i</span><span class="p">,</span> <span class="n">_</span><span class="p">)|</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
        <span class="nf">.map</span><span class="p">(|(</span><span class="n">_</span><span class="p">,</span> <span class="n">n</span><span class="p">)|</span> <span class="n">n</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span>
        <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;&gt;</span><span class="p">();</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">numbers</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.split_whitespace</span><span class="p">();</span> 
    <span class="k">let</span> <span class="k">mut</span> <span class="n">right</span> <span class="o">=</span> <span class="n">numbers</span>
        <span class="nf">.enumerate</span><span class="p">()</span>
        <span class="nf">.filter</span><span class="p">(|(</span><span class="n">i</span><span class="p">,</span> <span class="n">_</span><span class="p">)|</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
        <span class="nf">.map</span><span class="p">(|(</span><span class="n">_</span><span class="p">,</span> <span class="n">n</span><span class="p">)|</span> <span class="n">n</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span>
        <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;&gt;</span><span class="p">();</span>

    <span class="n">left</span><span class="nf">.sort</span><span class="p">();</span>
    <span class="n">right</span><span class="nf">.sort</span><span class="p">();</span>

    <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="n">left</span>
        <span class="nf">.iter</span><span class="p">()</span>
        <span class="nf">.zip</span><span class="p">(</span><span class="n">right</span><span class="nf">.iter</span><span class="p">())</span>
        <span class="nf">.map</span><span class="p">(|(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">)|</span> <span class="p">(</span><span class="n">l</span> <span class="o">-</span> <span class="n">r</span><span class="p">)</span><span class="nf">.abs</span><span class="p">())</span>
        <span class="py">.sum</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span><span class="p">();</span>

    <span class="k">let</span> <span class="n">result2</span><span class="p">:</span> <span class="nb">usize</span> <span class="o">=</span> <span class="n">left</span>
        <span class="nf">.iter</span><span class="p">()</span>
        <span class="nf">.map</span><span class="p">(|</span><span class="o">&amp;</span><span class="n">l</span><span class="p">|</span> <span class="p">(</span><span class="n">l</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">)</span><span class="o">*</span><span class="n">right</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.filter</span><span class="p">(|</span><span class="o">&amp;&amp;</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span> <span class="o">==</span> <span class="n">l</span><span class="p">)</span><span class="nf">.count</span><span class="p">())</span>
        <span class="nf">.sum</span><span class="p">();</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"Result1: {}"</span><span class="p">,</span> <span class="n">result</span><span class="p">);</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"Result2: {}"</span><span class="p">,</span> <span class="n">result2</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 80/100 - Running Rust on the Raspberry PiPico</title><link href="https://maebli.github.io/archive/2024-10-05-100rust-80/" rel="alternate" type="text/html" title="Rust challenge 80/100 - Running Rust on the Raspberry PiPico" /><published>2024-10-05T19:00:00+00:00</published><updated>2024-10-05T19:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-80</id><content type="html" xml:base="https://maebli.github.io/archive/2024-10-05-100rust-80/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#80th-challenge">80th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="80th-challenge">80th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Write hello world on a waveshare-rp2040-lcd-0.96.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>It was a bit tough getting some good information on the board. I could not find a good pinout, datasheet or working code at first. 
However after some digging I found <a href="https://github.com/rp-rs/rp-hal-boards">https://github.com/rp-rs/rp-hal-boards</a> which has an example.</p>

<p>The example works out of the box, but its not easily extracted, stand alone project. So I created the project template <a href="https://github.com/maebli/waveshare-rp2040-lcd-0-9-6-template">https://github.com/maebli/waveshare-rp2040-lcd-0-9-6-template</a>.</p>

<p>Starting from this template we can flash the board with</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cargo <span class="nb">install </span>cargo-generate
cargo generate maebli/waveshare-rp2040-lcd-0-9-6-template <span class="nt">--name</span> my-project
<span class="nb">cd </span>waveshare-rp2040-lcd-0-9-6-template
</code></pre></div></div>

<p>The raspberry pi pico is hooked up to a pico debugger over SWO 3 wire interface. Its powered via USB-C.</p>

<p>And there we have it</p>

<p><img src="/assets/img/raspberry-pi-pico-lcd.jpg" alt="" /></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 79/100 - embedded workshop @ rustfest</title><link href="https://maebli.github.io/archive/2024-06-18-100rust-79/" rel="alternate" type="text/html" title="Rust challenge 79/100 - embedded workshop @ rustfest" /><published>2024-06-19T13:39:00+00:00</published><updated>2024-06-19T13:39:00+00:00</updated><id>https://maebli.github.io/archive/100rust-79</id><content type="html" xml:base="https://maebli.github.io/archive/2024-06-18-100rust-79/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#79th-challenge">79th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a>
            <ul>
              <li><a href="#hardware-setup">Hardware Setup</a>
                <ul>
                  <li><a href="#listing-available-probes">Listing available probes</a></li>
                  <li><a href="#rp2040-compatible-debuggers">RP2040 compatible debuggers</a></li>
                  <li><a href="#debugging-with-vs-code">Debugging with VS Code</a></li>
                </ul>
              </li>
              <li><a href="#software-setup">Software Setup</a>
                <ul>
                  <li><a href="#understanding-the-dependencies">Understanding the dependencies</a>
                    <ul>
                      <li><a href="#rp2040-code-dependencies">RP2040 code dependencies</a></li>
                      <li><a href="#host-code-dependencies">Host code dependencies</a></li>
                    </ul>
                  </li>
                  <li><a href="#developing-for-embedded-targets-in-rust">Developing for embedded targets in rust</a>
                    <ul>
                      <li><a href="#general">General</a></li>
                      <li><a href="#setup-clippy---lint-to-be-more-strict-can-help">Setup Clippy  / Lint to be more strict can help</a></li>
                      <li><a href="#typestate-pattern">Typestate pattern</a></li>
                      <li><a href="#traits">Traits</a></li>
                      <li><a href="#some-embedded-files-in-a-crate-that-are-not-normally-found-in-a-rust-workspace">some embedded files in a crate that are not normally found in a rust workspace</a></li>
                    </ul>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="79th-challenge">79th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Prepare for the <a href="https://rustfest.ch/workshops/rust-on-microcontrollers/">rust workshop</a> hosted by <a href="rustfest.ch">rustfest.ch</a> and summarize what was learnt.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>To get things flashed and get debugging with probe.rs. I am going to try different things starting with the probe.</p>

<p>But first I install all the required dependencies.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    <span class="c"># install compilation targets</span>
    rustup target add thumbv6m-none-eabi
    rustup target add <span class="nt">--toolchain</span> nightly thumbv6m-none-eabi
    <span class="c"># necessary linker</span>
    cargo <span class="nb">install </span>flip-link
    <span class="c"># Useful to creating UF2 images for the RP2040 USB Bootloader</span>
    cargo <span class="nb">install </span>elf2uf2-rs <span class="nt">--locked</span>
    <span class="c"># Useful for flashing over the SWD pins using a supported JTAG probe</span>
    <span class="c"># this contains  cargo-embed too. Also available via homebrew</span>
    cargo <span class="nb">install </span>cargo-binstall
    cargo binstall probe-rs-tools
    </code></pre></figure>

<p>An we are ready to go!</p>

<h4 id="hardware-setup">Hardware Setup</h4>

<h5 id="listing-available-probes">Listing available probes</h5>

<p>I have various probes I am going to test with. An ST-Link <a href="https://www.st.com/en/development-tools/st-link-v2.html">v2 clone</a>, an <a href="https://www.st.com/en/development-tools/stsw-link009.html">st-link nucleo</a>, a <a href="https://www.segger.com/products/debug-probes/j-link/models/j-link-base/">segger basic</a> and a <a href="https://github.com/probe-rs/rusty-probe">rusty-probe</a></p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    probe-rs list
    </code></pre></figure>

<p>Listing the three probes is not an issue on <code class="language-plaintext highlighter-rouge">Mac OS 14.5</code>. I plug the probes, I run <code class="language-plaintext highlighter-rouge">probe-rs</code> (see documentation at <a href="https://probe.rs/">https://probe.rs/</a>) list and I see them.</p>

<h5 id="rp2040-compatible-debuggers">RP2040 compatible debuggers</h5>

<p>Next I want to run some code on the chips so I clone the <a href="https://github.com/bedroombuilds/pico-usb">repository</a> and I do <code class="language-plaintext highlighter-rouge">cargo run</code>.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    git clone https://github.com/maebli/pico-usb // my personal fork
    <span class="nb">cd </span>rp2040-blink
    probe-rs run <span class="nt">--chip</span> RP2040 target/thumbv6m-none-eabi/debug/rp2040-blink
    </code></pre></figure>

<p>Somehow I have issues. It turns out, that st-link is vendor locked and can only be used to debug and flash st products. I found this out on the porbe-rs matrix channel. Rusty-probe initially does not work but soon it works due to <code class="language-plaintext highlighter-rouge">SWDIO</code>and <code class="language-plaintext highlighter-rouge">SWCLK</code> being swapped. Further the segger basic also works, however, I had to connect like I showed in <a href="https://maebli.github.io/pico/hardware/2021/02/17/raspberry-pi.html">one of my first posts</a>. For the rusty-probe I just need <code class="language-plaintext highlighter-rouge">GND</code>, <code class="language-plaintext highlighter-rouge">SWIO</code> and <code class="language-plaintext highlighter-rouge">SWCLK</code> and I can debug.</p>

<h5 id="debugging-with-vs-code">Debugging with VS Code</h5>

<p>To debug within <code class="language-plaintext highlighter-rouge">VS Code</code> I installed the VS Code extension and created two debug settings (see repos, and also here):</p>

<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="w">    </span><span class="p">{</span><span class="w">
        </span><span class="err">//</span><span class="w"> </span><span class="err">Use</span><span class="w"> </span><span class="err">IntelliSense</span><span class="w"> </span><span class="err">to</span><span class="w"> </span><span class="err">learn</span><span class="w"> </span><span class="err">about</span><span class="w"> </span><span class="err">possible</span><span class="w"> </span><span class="err">attributes.</span><span class="w">
        </span><span class="err">//</span><span class="w"> </span><span class="err">Hover</span><span class="w"> </span><span class="err">to</span><span class="w"> </span><span class="err">view</span><span class="w"> </span><span class="err">descriptions</span><span class="w"> </span><span class="err">of</span><span class="w"> </span><span class="err">existing</span><span class="w"> </span><span class="err">attributes.</span><span class="w">
        </span><span class="err">//</span><span class="w"> </span><span class="err">For</span><span class="w"> </span><span class="err">more</span><span class="w"> </span><span class="err">information</span><span class="p">,</span><span class="w"> </span><span class="err">visit:</span><span class="w"> </span><span class="err">https://go.microsoft.com/fwlink/?linkid=</span><span class="mi">830387</span><span class="w">
        </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.2.0"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"configurations"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
            </span><span class="p">{</span><span class="w">
                </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"probe-rs-debug"</span><span class="p">,</span><span class="w">
                </span><span class="nl">"request"</span><span class="p">:</span><span class="w"> </span><span class="s2">"launch"</span><span class="p">,</span><span class="w">
                </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"debug-rp2040-rtic-usb-serial-blinky"</span><span class="p">,</span><span class="w">
                </span><span class="nl">"cwd"</span><span class="p">:</span><span class="w"> </span><span class="s2">"${workspaceFolder}"</span><span class="p">,</span><span class="w">
                </span><span class="nl">"connectUnderReset"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
                </span><span class="nl">"chip"</span><span class="p">:</span><span class="w"> </span><span class="s2">"RP2040"</span><span class="p">,</span><span class="w">
                </span><span class="nl">"flashingConfig"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
                    </span><span class="nl">"flashingEnabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
                    </span><span class="nl">"haltAfterReset"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
                </span><span class="p">},</span><span class="w">
                </span><span class="nl">"coreConfigs"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
                    </span><span class="p">{</span><span class="w">
                        </span><span class="nl">"coreIndex"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">
                        </span><span class="nl">"programBinary"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rp2040-rtic-usb-serial-blinky/target/thumbv6m-none-eabi/debug/rp2040-rtic-usb-serial-blinky"</span><span class="w">
                    </span><span class="p">}</span><span class="w">
                </span><span class="p">]</span><span class="w">
            </span><span class="p">},</span><span class="w">
            </span><span class="p">{</span><span class="w">
                </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"probe-rs-debug"</span><span class="p">,</span><span class="w">
                </span><span class="nl">"request"</span><span class="p">:</span><span class="w"> </span><span class="s2">"launch"</span><span class="p">,</span><span class="w">
                </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"debug-rp2040-blink"</span><span class="p">,</span><span class="w">
                </span><span class="nl">"cwd"</span><span class="p">:</span><span class="w"> </span><span class="s2">"${workspaceFolder}"</span><span class="p">,</span><span class="w">
                </span><span class="nl">"connectUnderReset"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
                </span><span class="nl">"chip"</span><span class="p">:</span><span class="w"> </span><span class="s2">"RP2040"</span><span class="p">,</span><span class="w">
                </span><span class="nl">"flashingConfig"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
                    </span><span class="nl">"flashingEnabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
                    </span><span class="nl">"haltAfterReset"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
                </span><span class="p">},</span><span class="w">
                </span><span class="nl">"coreConfigs"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
                    </span><span class="p">{</span><span class="w">
                        </span><span class="nl">"coreIndex"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">
                        </span><span class="nl">"programBinary"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rp2040-blink/target/thumbv6m-none-eabi/debug/rp2040-blink"</span><span class="w">
                    </span><span class="p">}</span><span class="w">
                </span><span class="p">]</span><span class="w">
            </span><span class="p">}</span><span class="w">
        </span><span class="p">]</span><span class="w">
    </span><span class="p">}</span><span class="w">
    </span></code></pre></figure>

<p>With these I was able to debug. Debugging the host code was the same as debugging any other existing program. I found the com port created by Pi used in the host application by listing the devices 
available and then diffing when plugging the RP2040 in and out.</p>

<h4 id="software-setup">Software Setup</h4>

<p>There are two repos that are mentioned in the workshop. One is <a href="https://github.com/mike-kfed/embedded_drivers">https://github.com/mike-kfed/embedded_drivers</a> and the other is the already mentioned <a href="https://github.com/bedroombuilds/pico-usb">https://github.com/bedroombuilds/pico-usb</a></p>

<h5 id="understanding-the-dependencies">Understanding the dependencies</h5>

<p>The dependencies and a URL to the crates documentation page is listed bellow.</p>

<h6 id="rp2040-code-dependencies">RP2040 code dependencies</h6>

<table>
  <thead>
    <tr>
      <th>Crate</th>
      <th>Link</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">cortex-m</code></td>
      <td><a href="https://crates.io/crates/cortex-m">cortex-m</a></td>
      <td>Low-level access to Cortex-M processors, providing functionality like registers and interrupts.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">cortex-m-rt</code></td>
      <td><a href="https://crates.io/crates/cortex-m-rt">cortex-m-rt</a></td>
      <td>Startup and runtime features for Cortex-M microcontrollers.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">embedded-hal</code></td>
      <td><a href="https://crates.io/crates/embedded-hal">embedded-hal</a></td>
      <td>Hardware abstraction layer for embedded systems, defining traits for hardware interfacing.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">defmt</code></td>
      <td><a href="https://crates.io/crates/defmt">defmt</a></td>
      <td>A highly efficient logging framework for embedded systems, designed for resource-constrained devices.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">defmt-rtt</code></td>
      <td><a href="https://crates.io/crates/defmt-rtt">defmt-rtt</a></td>
      <td>Implements the RTT (Real-Time Transfer) transport layer for the <code class="language-plaintext highlighter-rouge">defmt</code> logging framework.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">panic-probe</code></td>
      <td><a href="https://crates.io/crates/panic-probe">panic-probe</a></td>
      <td>A panic handler for embedded systems that logs panic messages using probe-based debugging.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rp-pico</code></td>
      <td><a href="https://crates.io/crates/rp-pico">rp-pico</a></td>
      <td>Board support package for the Raspberry Pi Pico board, providing low-level access to its features.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">usb-device</code></td>
      <td><a href="https://crates.io/crates/usb-device">usb-device</a></td>
      <td>A platform-agnostic USB device library, allowing the creation of USB devices.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">usbd-serial</code></td>
      <td><a href="https://crates.io/crates/usbd-serial">usbd-serial</a></td>
      <td>USB serial port implementation for the <code class="language-plaintext highlighter-rouge">usb-device</code> library.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rp2040-hal</code></td>
      <td><a href="https://crates.io/crates/rp2040-hal">rp2040-hal</a></td>
      <td>Hardware abstraction layer for the RP2040 microcontroller, used in Raspberry Pi Pico and similar boards.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rp2040-boot2</code></td>
      <td><a href="https://crates.io/crates/rp2040-boot2">rp2040-boot2</a></td>
      <td>Low-level boot configuration for RP2040 microcontrollers.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">sparkfun-pro-micro-rp2040</code></td>
      <td><a href="https://crates.io/crates/sparkfun-pro-micro-rp2040">sparkfun-pro-micro-rp2040</a></td>
      <td>Board support package for the SparkFun Pro Micro RP2040 board.</td>
    </tr>
  </tbody>
</table>

<p>Dependencies that were mentioned in the talk related to RTOS:</p>

<table>
  <thead>
    <tr>
      <th>Crate</th>
      <th>Link</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">embassy</code></td>
      <td><a href="https://crates.io/crates/embassy">embassy</a></td>
      <td>An async, more rigid alternative to traditional Rust async frameworks.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">RTIC v2</code></td>
      <td><a href="https://crates.io/crates/rtic">rtic</a></td>
      <td>Version 2 of the Real-Time Interrupt-driven Concurrency framework, preferred for its async support.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Bern RTOS</code></td>
      <td>No Link Available</td>
      <td>A Swiss-made real-time operating system noted for its cool and efficient performance.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Tock</code></td>
      <td><a href="https://github.com/tock/tock">tock</a></td>
      <td>A highly sandboxed OS; complex and large, ideal for managing intricate systems like train controls.</td>
    </tr>
  </tbody>
</table>

<p>Dependencies that were mentioned related to debugging / tracing:</p>

<table>
  <thead>
    <tr>
      <th>Crate</th>
      <th>Link</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">defmt</code></td>
      <td><a href="https://crates.io/crates/defmt">defmt</a></td>
      <td>A highly efficient logging framework for embedded systems.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">defmt-rtt</code></td>
      <td><a href="https://crates.io/crates/defmt-rtt">defmt-rtt</a></td>
      <td>Implements the RTT (Real-Time Transfer) transport layer for the <code class="language-plaintext highlighter-rouge">defmt</code> logging framework.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ufmt</code></td>
      <td><a href="https://crates.io/crates/ufmt">ufmt</a></td>
      <td>A minimal, <code class="language-plaintext highlighter-rouge">#![no_std]</code> compatible formatting library, designed for resource-constrained environments.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">modular-bitfield</code></td>
      <td><a href="https://crates.io/crates/modular-bitfield">modular-bitfield</a></td>
      <td>Provides macros to define bitfields in a modular way for improved code safety and readability.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">heapless</code></td>
      <td><a href="https://crates.io/crates/heapless">heapless</a></td>
      <td>Enables the use of static memory allocation for data structures like Vec and HashMap, with <code class="language-plaintext highlighter-rouge">ufmt</code> implementation support.</td>
    </tr>
  </tbody>
</table>

<p>And others</p>

<table>
  <thead>
    <tr>
      <th>Crate</th>
      <th>Link</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">kebab-case</code></td>
      <td><a href="https://crates.io/crates/kebab-case">kebab-case</a></td>
      <td>A utility crate for converting strings to kebab-case, commonly used in URLs and IDs.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">nom</code></td>
      <td><a href="https://crates.io/crates/nom">nom</a></td>
      <td>A parser combinator library that allows for easy string parsing and protocol analysis.</td>
    </tr>
  </tbody>
</table>

<h6 id="host-code-dependencies">Host code dependencies</h6>

<table>
  <thead>
    <tr>
      <th>Crate</th>
      <th>Link</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">serialport</code></td>
      <td><a href="https://crates.io/crates/serialport">serialport</a></td>
      <td>Provides an interface for working with serial ports in Rust.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">anyhow</code></td>
      <td><a href="https://crates.io/crates/anyhow">anyhow</a></td>
      <td>Provides flexible error handling with ‘anyhow::Error’, a trait object based error system.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">defmt</code></td>
      <td><a href="https://crates.io/crates/defmt">defmt</a></td>
      <td>A highly efficient logging framework for embedded systems.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">heapless</code></td>
      <td><a href="https://crates.io/crates/heapless">heapless</a></td>
      <td>Enables the use of static memory allocation for data structures like Vec and HashMap.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">postcard</code></td>
      <td><a href="https://crates.io/crates/postcard">postcard</a></td>
      <td>A no_std, zero-allocation serialization library based on Serde.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">serde</code></td>
      <td><a href="https://crates.io/crates/serde">serde</a></td>
      <td>A serialization/deserialization framework that is both powerful and generic.</td>
    </tr>
  </tbody>
</table>

<h5 id="developing-for-embedded-targets-in-rust">Developing for embedded targets in rust</h5>

<h6 id="general">General</h6>

<p>Here are some important things to know about rust embedded development.</p>

<ul>
  <li>Rust 1.0 came out in 2015, embedded_hal 1.0 only recently.</li>
  <li>embedded development is done with <code class="language-plaintext highlighter-rouge">no_std</code> , meaning things like Smart pointers and Display traits are not included i.e. “batteries not included”. The box type is also not included but may be added with ``core::alloc`</li>
  <li><code class="language-plaintext highlighter-rouge">PAC/HAL/BSP</code>: often contain unsafe code
    <ul>
      <li><code class="language-plaintext highlighter-rouge">BSP</code>: implements hardware layer</li>
      <li><code class="language-plaintext highlighter-rouge">HAL</code>: “only” traits, this way it works on all uP, mostly works, has improved a lot. Interrupts are still hard to abstract, injecting an interrupt into code is hard</li>
      <li><code class="language-plaintext highlighter-rouge">PAC</code>: is specific to a micro controller and generated directly from the micro controller’s description (usually in SVD or similar format). A PAC provides low-level register access that is faithful to the micro controller’s specification, allowing developers direct interaction with the hardware through Rust’s type system, which ensures memory safety and concurrency.</li>
    </ul>
  </li>
  <li>
    <p>Targets have varying level of support. Best supported are ARM / RISC. There is a platform support page that puts support in different categories. [Tier-1 are the best.]https://doc.rust-lang.org/nightly/rustc/platform-support.html#tier-1-with-host-tools)</p>
  </li>
  <li>read embedded-hal docs
    <ul>
      <li><a href="https://docs.rs/embedded-hal/latest/embedded_hal/spi/index.html#for-driver-authors">section for driver authors</a></li>
      <li>search <a href="crate.io">crates.io</a> using “embedded-hal”</li>
      <li>search for projects on github with “embedded-hal” referenced</li>
    </ul>
  </li>
</ul>

<h6 id="setup-clippy---lint-to-be-more-strict-can-help">Setup Clippy  / Lint to be more strict can help</h6>

<p>`.clippy.toml for settings of clippy following settings can be helpful</p>

<figure class="highlight"><pre><code class="language-toml" data-lang="toml">    <span class="py">allow-unwrap-in-tests</span> <span class="p">=</span> <span class="kc">true</span>
    <span class="py">allow-unexpect-in-tests</span> <span class="p">=</span> <span class="kc">true</span>
    </code></pre></figure>

<p>some additional helpful lints are:</p>

<figure class="highlight"><pre><code class="language-toml" data-lang="toml">    <span class="nn">[lints.clippy]</span>
    <span class="py">unwrap_used</span> <span class="p">=</span> <span class="s">"deny"</span>
    <span class="py">unwrap_in_result</span> <span class="p">=</span> <span class="s">"deny"</span>
    <span class="py">panic</span> <span class="p">=</span> <span class="s">"deny"</span>
    <span class="py">expect_used</span> <span class="p">=</span> <span class="s">"deny"</span>
    <span class="py">unimplemented</span> <span class="p">=</span> <span class="s">"deny"</span>
    <span class="nn">suspicious</span> <span class="o">=</span> <span class="p">{</span><span class="py">level</span> <span class="p">=</span> <span class="s">"deny"</span><span class="p">,</span> <span class="py">priority</span> <span class="p">=</span> <span class="mi">-1</span><span class="p">}</span>
    <span class="nn">style</span> <span class="o">=</span> <span class="p">{</span> <span class="py">level</span> <span class="p">=</span> <span class="s">"deny"</span><span class="p">,</span> <span class="py">priority</span> <span class="p">=</span> <span class="mi">-1</span><span class="p">}</span>
    <span class="nn">complexity</span> <span class="o">=</span> <span class="p">{</span> <span class="py">level</span> <span class="p">=</span> <span class="s">"deny"</span><span class="p">,</span> <span class="py">priority</span> <span class="p">=</span> <span class="mi">-1</span><span class="p">}</span>
    <span class="nn">perf</span> <span class="o">=</span> <span class="p">{</span> <span class="py">level</span> <span class="p">=</span> <span class="s">"deny"</span><span class="p">,</span> <span class="py">priority</span> <span class="p">=</span> <span class="mi">-1</span><span class="p">}</span>
    </code></pre></figure>

<h6 id="typestate-pattern">Typestate pattern</h6>

<p>With this, method / pattern can be bound to states. It is checked at compile time that state allows function / transition.  The example that was given was the following:</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="k">struct</span> <span class="n">Mario</span><span class="p">;</span>
    <span class="k">struct</span> <span class="n">SuperMario</span><span class="p">;</span>

    <span class="k">impl</span> <span class="n">Mario</span> <span class="p">{</span>
        <span class="k">fn</span> <span class="nf">die</span><span class="p">(</span><span class="k">self</span><span class="p">)</span> <span class="p">{</span> <span class="nf">drop</span><span class="p">(</span><span class="k">self</span><span class="p">)</span> <span class="p">;</span> <span class="p">}</span>
        <span class="k">fn</span> <span class="nf">grow</span><span class="p">(</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">SuperMario</span> <span class="p">{</span>
            <span class="nn">SuperMario</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="k">self</span><span class="p">)</span>
        <span class="p">}</span>
    <span class="p">}</span>


    <span class="k">impl</span> <span class="n">SuperMario</span> <span class="p">{</span>
        <span class="k">fn</span> <span class="nf">shrink</span><span class="p">(</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Mario</span> <span class="p">{</span>
            <span class="nn">Mario</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="k">self</span><span class="p">)</span>
        <span class="p">}</span>
    <span class="p">}</span>
    </code></pre></figure>

<p>With this method, super mario cannot die. It is clear at compile time.</p>

<p>Note: Methods should also be testable with another method</p>

<h6 id="traits">Traits</h6>

<p>trait bounds (refresher):</p>

<p>(a) with “where” for a lot of trait bounds
(b) with “dyn” for few e.g. “delay: &amp;mut dyn DelaysMs<u16>"</u16></p>

<p>see also rust by example</p>

<ul>
  <li>Rust has no inheritance, only traits</li>
  <li>important for embedded Hal, if we want to implement an i2c, we implement a trait for it</li>
  <li>default traits can be overridden</li>
  <li>critical section used for adding for example stuff that the HAL does not support like two CS for SPI</li>
</ul>

<p><em>challenge</em>: write drivers that are platform-agnostic.</p>

<p>Usually trait bounds are defined for the implementation not for the struct, even though it is possible.</p>

<p>Associated type for traits</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">        <span class="k">trait</span> <span class="n">Animal</span> <span class="p">{</span>
            <span class="n">Error</span> <span class="o">=</span> <span class="nb">i32</span><span class="p">;</span> <span class="c1">////&lt;-- associated type</span>
            <span class="k">fn</span> <span class="n">eat</span>
        <span class="p">}</span>
    </code></pre></figure>

<h6 id="some-embedded-files-in-a-crate-that-are-not-normally-found-in-a-rust-workspace">some embedded files in a crate that are not normally found in a rust workspace</h6>

<ul>
  <li>build.rs &lt;- script to read the linker file</li>
  <li>memory.x  &lt;- linker file</li>
  <li>.cargo, this is where the <code class="language-plaintext highlighter-rouge">probe-rs run --chip</code>is hidden! makes thing magically run with cargo run</li>
</ul>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 78/100 - aoc 2023 day2</title><link href="https://maebli.github.io/archive/2023-12-02-100rust-78/" rel="alternate" type="text/html" title="Rust challenge 78/100 - aoc 2023 day2" /><published>2023-12-02T13:39:00+00:00</published><updated>2023-12-02T13:39:00+00:00</updated><id>https://maebli.github.io/archive/100rust-78</id><content type="html" xml:base="https://maebli.github.io/archive/2023-12-02-100rust-78/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#78th-challenge">78th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="78th-challenge">78th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Not reading the prompt properly.. :) Here is a visualization of the puzzel by dalle3 of today’s challenge. 
<img src="/assets/img/aoc2023d2.png" alt="" /></p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

        <span class="k">let</span> <span class="n">game</span> <span class="o">=</span> <span class="n">Game</span> <span class="p">{</span>
            <span class="n">red</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span>
            <span class="n">blue</span><span class="p">:</span> <span class="mi">14</span><span class="p">,</span>
            <span class="n">green</span><span class="p">:</span> <span class="mi">13</span><span class="p">,</span>
        <span class="p">};</span>

        <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"Part 1: {}"</span><span class="p">,</span> <span class="nf">part_1</span><span class="p">(</span><span class="n">input</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">game</span><span class="p">));</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"Part 2: {}"</span><span class="p">,</span> <span class="nf">part_2</span><span class="p">(</span><span class="n">input</span><span class="p">));</span>
    <span class="p">}</span>

    <span class="k">struct</span> <span class="n">Game</span><span class="p">{</span>
        <span class="n">red</span><span class="p">:</span> <span class="nb">usize</span><span class="p">,</span>
        <span class="n">blue</span><span class="p">:</span> <span class="nb">usize</span><span class="p">,</span>
        <span class="n">green</span><span class="p">:</span> <span class="nb">usize</span><span class="p">,</span>
    <span class="p">}</span>

    <span class="k">impl</span> <span class="n">Game</span> <span class="p">{</span>
        <span class="k">fn</span> <span class="nf">from_str</span><span class="p">(</span><span class="n">input</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Game</span> <span class="p">{</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">red</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">blue</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">green</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

            <span class="c1">// Split the input string by comma to separate color-count pairs</span>
            <span class="k">for</span> <span class="n">pair</span> <span class="k">in</span> <span class="n">input</span><span class="nf">.split</span><span class="p">(</span><span class="sc">','</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">let</span> <span class="n">parts</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">pair</span><span class="nf">.trim</span><span class="p">()</span><span class="nf">.split_whitespace</span><span class="p">()</span><span class="nf">.collect</span><span class="p">();</span>
                <span class="k">if</span> <span class="n">parts</span><span class="nf">.len</span><span class="p">()</span> <span class="o">==</span> <span class="mi">2</span> <span class="p">{</span>
                    <span class="k">let</span> <span class="n">count</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap_or</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
                    <span class="k">match</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">{</span>
                        <span class="s">"red"</span> <span class="k">=&gt;</span> <span class="n">red</span> <span class="o">=</span> <span class="n">count</span><span class="p">,</span>
                        <span class="s">"blue"</span> <span class="k">=&gt;</span> <span class="n">blue</span> <span class="o">=</span> <span class="n">count</span><span class="p">,</span>
                        <span class="s">"green"</span> <span class="k">=&gt;</span> <span class="n">green</span> <span class="o">=</span> <span class="n">count</span><span class="p">,</span>
                        <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>

            <span class="n">Game</span> <span class="p">{</span> <span class="n">red</span><span class="p">,</span> <span class="n">blue</span><span class="p">,</span> <span class="n">green</span> <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>


    <span class="k">fn</span> <span class="nf">part_1</span><span class="p">(</span><span class="n">input</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">,</span> <span class="n">game</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Game</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">usize</span> <span class="p">{</span>
        <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.filter_map</span><span class="p">(|</span><span class="n">line</span><span class="p">|</span> <span class="p">{</span>
            <span class="n">line</span><span class="nf">.split</span><span class="p">(</span><span class="s">":"</span><span class="p">)</span><span class="nf">.nth</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
                <span class="nf">.map</span><span class="p">(|</span><span class="n">games_str</span><span class="p">|</span> <span class="n">games_str</span><span class="nf">.split</span><span class="p">(</span><span class="s">";"</span><span class="p">)</span>
                    <span class="nf">.map</span><span class="p">(</span><span class="nn">Game</span><span class="p">::</span><span class="n">from_str</span><span class="p">)</span>
                    <span class="nf">.all</span><span class="p">(|</span><span class="n">game_instance</span><span class="p">|</span> 
                        <span class="n">game_instance</span><span class="py">.red</span> <span class="o">&lt;=</span> <span class="n">game</span><span class="py">.red</span> <span class="o">&amp;&amp;</span> 
                        <span class="n">game_instance</span><span class="py">.blue</span> <span class="o">&lt;=</span> <span class="n">game</span><span class="py">.blue</span> <span class="o">&amp;&amp;</span> 
                        <span class="n">game_instance</span><span class="py">.green</span> <span class="o">&lt;=</span> <span class="n">game</span><span class="py">.green</span>
                    <span class="p">)</span>
                <span class="p">)</span>
        <span class="p">})</span><span class="nf">.enumerate</span><span class="p">()</span><span class="nf">.filter</span><span class="p">(|(</span><span class="n">_</span><span class="p">,</span> <span class="n">valid</span><span class="p">)|</span> <span class="o">*</span><span class="n">valid</span><span class="p">)</span><span class="nf">.map</span><span class="p">(|(</span><span class="n">i</span><span class="p">,</span> <span class="n">_</span><span class="p">)|</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span><span class="nf">.sum</span><span class="p">()</span>
    <span class="p">}</span>


    <span class="k">fn</span> <span class="nf">part_2</span><span class="p">(</span><span class="n">input</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">usize</span> <span class="p">{</span>
        <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.filter_map</span><span class="p">(|</span><span class="n">line</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">line</span><span class="nf">.split</span><span class="p">(</span><span class="s">":"</span><span class="p">)</span><span class="nf">.nth</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
                <span class="nf">.map</span><span class="p">(|</span><span class="n">games_str</span><span class="p">|</span> <span class="n">games_str</span><span class="nf">.split</span><span class="p">(</span><span class="s">";"</span><span class="p">)</span>
                    <span class="nf">.map</span><span class="p">(</span><span class="nn">Game</span><span class="p">::</span><span class="n">from_str</span><span class="p">)</span>
                    <span class="nf">.fold</span><span class="p">(</span><span class="n">Game</span> <span class="p">{</span> <span class="n">red</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">blue</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">green</span><span class="p">:</span> <span class="mi">0</span> <span class="p">},</span> <span class="p">|</span><span class="n">acc</span><span class="p">,</span> <span class="n">game_instance</span><span class="p">|</span> 
                        <span class="n">Game</span> <span class="p">{</span>
                            <span class="n">red</span><span class="p">:</span> <span class="nn">std</span><span class="p">::</span><span class="nn">cmp</span><span class="p">::</span><span class="nf">max</span><span class="p">(</span><span class="n">acc</span><span class="py">.red</span><span class="p">,</span> <span class="n">game_instance</span><span class="py">.red</span><span class="p">),</span>
                            <span class="n">blue</span><span class="p">:</span> <span class="nn">std</span><span class="p">::</span><span class="nn">cmp</span><span class="p">::</span><span class="nf">max</span><span class="p">(</span><span class="n">acc</span><span class="py">.blue</span><span class="p">,</span> <span class="n">game_instance</span><span class="py">.blue</span><span class="p">),</span>
                            <span class="n">green</span><span class="p">:</span> <span class="nn">std</span><span class="p">::</span><span class="nn">cmp</span><span class="p">::</span><span class="nf">max</span><span class="p">(</span><span class="n">acc</span><span class="py">.green</span><span class="p">,</span> <span class="n">game_instance</span><span class="py">.green</span><span class="p">),</span>
                        <span class="p">}</span>
                    <span class="p">)</span>
                <span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
            <span class="nf">Some</span><span class="p">(</span><span class="n">x</span><span class="py">.red</span><span class="o">*</span><span class="n">x</span><span class="py">.blue</span><span class="o">*</span><span class="n">x</span><span class="py">.green</span><span class="p">)</span>
        <span class="p">})</span><span class="nf">.sum</span><span class="p">()</span>
    <span class="p">}</span>

    <span class="k">const</span> <span class="n">TEST_INPUT</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
    game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
    game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
    game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
    game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green"</span><span class="p">;</span>

    <span class="nd">#[cfg(test)]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>
        <span class="k">use</span> <span class="k">super</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_part_1</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">game</span> <span class="o">=</span> <span class="n">Game</span> <span class="p">{</span>
                <span class="n">red</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span>
                <span class="n">blue</span><span class="p">:</span> <span class="mi">13</span><span class="p">,</span>
                <span class="n">green</span><span class="p">:</span> <span class="mi">14</span><span class="p">,</span>
            <span class="p">};</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">part_1</span><span class="p">(</span><span class="n">TEST_INPUT</span><span class="p">,</span><span class="o">&amp;</span><span class="n">game</span><span class="p">),</span> <span class="mi">8</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_part_2</span><span class="p">()</span> <span class="p">{</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">part_2</span><span class="p">(</span><span class="n">TEST_INPUT</span><span class="p">),</span><span class="mi">2286</span><span class="p">);</span>
        <span class="p">}</span>

    <span class="p">}</span>
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 77/100 - aoc 2023 day1</title><link href="https://maebli.github.io/archive/2024-02-09-100rust-77/" rel="alternate" type="text/html" title="Rust challenge 77/100 - aoc 2023 day1" /><published>2023-12-01T22:05:00+00:00</published><updated>2023-12-01T22:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-77</id><content type="html" xml:base="https://maebli.github.io/archive/2024-02-09-100rust-77/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#77th-challenge">77th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="77th-challenge">77th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Last years AoC done and I am a bit overwehlmed that its already restarted. But I want to get into some blogging again. 
Today’s challenge was simple but the verbosity of the code shows I’m a bit rusty.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">        <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span>

        <span class="k">let</span> <span class="n">input_num</span> <span class="o">=</span> <span class="n">INPUT</span>
            <span class="nf">.replace</span><span class="p">(</span><span class="s">"one"</span><span class="p">,</span> <span class="s">"on1e"</span><span class="p">)</span>
            <span class="nf">.replace</span><span class="p">(</span><span class="s">"two"</span><span class="p">,</span> <span class="s">"t2o"</span><span class="p">)</span>
            <span class="nf">.replace</span><span class="p">(</span><span class="s">"three"</span><span class="p">,</span> <span class="s">"t3e"</span><span class="p">)</span>
            <span class="nf">.replace</span><span class="p">(</span><span class="s">"four"</span><span class="p">,</span> <span class="s">"f4r"</span><span class="p">)</span>
            <span class="nf">.replace</span><span class="p">(</span><span class="s">"five"</span><span class="p">,</span> <span class="s">"f5e"</span><span class="p">)</span>
            <span class="nf">.replace</span><span class="p">(</span><span class="s">"six"</span><span class="p">,</span> <span class="s">"s6x"</span><span class="p">)</span>
            <span class="nf">.replace</span><span class="p">(</span><span class="s">"seven"</span><span class="p">,</span> <span class="s">"s7n"</span><span class="p">)</span>
            <span class="nf">.replace</span><span class="p">(</span><span class="s">"eight"</span><span class="p">,</span> <span class="s">"e8t"</span><span class="p">)</span>
            <span class="nf">.replace</span><span class="p">(</span><span class="s">"nine"</span><span class="p">,</span> <span class="s">"n9e"</span><span class="p">);</span>

            
        <span class="k">let</span> <span class="n">out</span> <span class="o">=</span> <span class="n">input_num</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="p">|</span><span class="n">acc</span><span class="p">,</span> <span class="n">x</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="n">x</span>
                <span class="nf">.chars</span><span class="p">()</span>
                <span class="nf">.find</span><span class="p">(|</span><span class="o">&amp;</span><span class="n">c</span><span class="p">|</span> <span class="n">c</span> <span class="o">&gt;</span> <span class="sc">'0'</span> <span class="o">&amp;&amp;</span> <span class="n">c</span> <span class="o">&lt;=</span> <span class="sc">'9'</span><span class="p">)</span>
                <span class="nf">.unwrap</span><span class="p">()</span>
                <span class="nf">.to_digit</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
                <span class="nf">.unwrap</span><span class="p">()</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">;</span>
            <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="n">x</span>
                <span class="nf">.chars</span><span class="p">()</span>
                <span class="nf">.rfind</span><span class="p">(|</span><span class="o">&amp;</span><span class="n">c</span><span class="p">|</span> <span class="n">c</span> <span class="o">&gt;</span> <span class="sc">'0'</span> <span class="o">&amp;&amp;</span> <span class="n">c</span> <span class="o">&lt;=</span> <span class="sc">'9'</span><span class="p">)</span>
                <span class="nf">.unwrap</span><span class="p">()</span>
                <span class="nf">.to_digit</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
                <span class="nf">.unwrap</span><span class="p">()</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">;</span>
            <span class="n">acc</span> <span class="o">+</span> <span class="n">a</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="n">b</span>
        <span class="p">});</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">out</span><span class="p">);</span>
        <span class="p">}</span>
    
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 76/100 - aoc 2022 day14</title><link href="https://maebli.github.io/archive/2023-02-09-100rust-76/" rel="alternate" type="text/html" title="Rust challenge 76/100 - aoc 2022 day14" /><published>2023-02-09T11:05:00+00:00</published><updated>2023-02-09T11:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-76</id><content type="html" xml:base="https://maebli.github.io/archive/2023-02-09-100rust-76/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#76th-challenge">76th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="76th-challenge">76th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>So here goes day 14 of AoC🎅🦀 haven’t been so disciplined. No tests this time and a lazy switch between part one and two, oh well.
Also, this was terribly inefficient, May have been better with a bit map rather than a vector field. Also I’m storing points as vector with length zero.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">field</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">)</span>
                                                    <span class="nf">.lines</span><span class="p">()</span>
                                                    <span class="nf">.fold</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[]</span> <span class="p">,</span> <span class="p">|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">,</span><span class="n">line</span><span class="p">|</span> <span class="p">{</span>
                                                        <span class="k">let</span> <span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="nf">.split</span><span class="p">(</span><span class="s">"-&gt;"</span><span class="p">)</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="o">&gt;&gt;</span><span class="p">();</span>
                                                        <span class="k">for</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)</span> <span class="k">in</span> <span class="n">line</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.zip</span><span class="p">(</span><span class="n">line</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.skip</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span> <span class="p">{</span>

                                                            <span class="k">let</span> <span class="n">f</span> <span class="o">=</span> <span class="p">|</span><span class="n">x</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">|</span> <span class="n">x</span><span class="nf">.trim</span><span class="p">()</span>
                                                                                                <span class="nf">.split</span><span class="p">(</span><span class="s">","</span><span class="p">)</span>
                                                                                                <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span>
                                                                                                <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;&gt;</span><span class="p">();</span>
                                                            <span class="n">acc</span><span class="nf">.push</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[</span><span class="nf">f</span><span class="p">(</span><span class="n">a</span><span class="p">),</span><span class="nf">f</span><span class="p">(</span><span class="n">b</span><span class="p">)]);</span>

                                                        <span class="p">}</span>
            <span class="n">acc</span>
        <span class="p">});</span>


        <span class="k">let</span> <span class="n">lowest_point</span> <span class="o">=</span> <span class="nf">find_lowest_point</span><span class="p">(</span><span class="o">&amp;</span><span class="n">field</span><span class="p">);</span>

        <span class="c1">// uncomment this for solution 1</span>
        <span class="n">field</span><span class="nf">.push</span><span class="p">(</span><span class="nd">vec!</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="n">lowest_point</span><span class="o">+</span><span class="mi">2</span><span class="p">],</span><span class="nd">vec!</span><span class="p">[</span><span class="mi">1000</span><span class="p">,</span><span class="n">lowest_point</span><span class="o">+</span><span class="mi">2</span><span class="p">]));</span>

        <span class="nd">dbg!</span><span class="p">(</span><span class="n">lowest_point</span><span class="p">);</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">point</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span><span class="mi">500</span><span class="p">,</span><span class="mi">0</span><span class="p">];</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">sand_units</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

        <span class="k">while</span> <span class="n">point</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">lowest_point</span><span class="o">+</span><span class="mi">2</span> <span class="p">{</span>
            
            <span class="n">point</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>

            <span class="k">if</span> <span class="o">!</span><span class="nf">check_if_point_collides_with_vectors</span><span class="p">(</span><span class="o">&amp;</span><span class="n">point</span><span class="p">,</span><span class="o">&amp;</span><span class="n">field</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">continue</span><span class="p">;</span>
            <span class="p">}</span>

            <span class="n">point</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">;</span>

            <span class="k">if</span> <span class="o">!</span><span class="nf">check_if_point_collides_with_vectors</span><span class="p">(</span><span class="o">&amp;</span><span class="n">point</span><span class="p">,</span><span class="o">&amp;</span><span class="n">field</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">continue</span><span class="p">;</span>
            <span class="p">}</span>

            <span class="n">point</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">2</span><span class="p">;</span>

            <span class="k">if</span> <span class="o">!</span><span class="nf">check_if_point_collides_with_vectors</span><span class="p">(</span><span class="o">&amp;</span><span class="n">point</span><span class="p">,</span><span class="o">&amp;</span><span class="n">field</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">continue</span><span class="p">;</span>
            <span class="p">}</span>

            <span class="k">if</span> <span class="n">point</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span> <span class="p">{</span>
                <span class="nd">println!</span><span class="p">(</span><span class="s">"{} {}"</span> <span class="p">,</span> <span class="n">point</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">point</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
                <span class="k">break</span><span class="p">;</span>
            <span class="p">}</span>

            <span class="n">point</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="n">point</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">;</span>

            <span class="n">field</span><span class="nf">.push</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[</span><span class="nd">vec!</span><span class="p">[</span><span class="n">point</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">point</span><span class="p">[</span><span class="mi">1</span><span class="p">]],</span><span class="nd">vec!</span><span class="p">[</span><span class="n">point</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">point</span><span class="p">[</span><span class="mi">1</span><span class="p">]]]);</span>
            <span class="n">point</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span><span class="mi">500</span><span class="p">,</span><span class="mi">0</span><span class="p">];</span>
            <span class="n">sand_units</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>

        <span class="p">}</span>

        <span class="nd">dbg!</span><span class="p">(</span><span class="n">sand_units</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>




    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">check_if_point_collides_with_vectors</span><span class="p">(</span><span class="n">point</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span><span class="p">,</span><span class="n">vectors</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;&gt;&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>

        <span class="k">let</span> <span class="p">(</span><span class="n">p_x</span><span class="p">,</span><span class="n">p_y</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="n">point</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">point</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>

        <span class="n">vectors</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.any</span><span class="p">(|</span><span class="n">vector</span><span class="p">|</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">a_x</span> <span class="o">=</span> <span class="n">vector</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="nf">.max</span><span class="p">(</span><span class="n">vector</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="k">let</span> <span class="n">b_x</span> <span class="o">=</span> <span class="n">vector</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="nf">.min</span><span class="p">(</span><span class="n">vector</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="k">let</span> <span class="n">a_y</span> <span class="o">=</span> <span class="n">vector</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="nf">.max</span><span class="p">(</span><span class="n">vector</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="k">let</span> <span class="n">b_y</span> <span class="o">=</span> <span class="n">vector</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="nf">.min</span><span class="p">(</span><span class="n">vector</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="n">p_x</span> <span class="o">&lt;=</span> <span class="n">a_x</span> <span class="o">&amp;&amp;</span> <span class="n">p_x</span> <span class="o">&gt;=</span> <span class="n">b_x</span> <span class="o">&amp;&amp;</span> <span class="n">p_y</span> <span class="o">&lt;=</span> <span class="n">a_y</span> <span class="o">&amp;&amp;</span> <span class="n">p_y</span> <span class="o">&gt;=</span> <span class="n">b_y</span>
        <span class="p">})</span>
    <span class="p">}</span>


    <span class="k">fn</span> <span class="nf">find_lowest_point</span><span class="p">(</span><span class="n">vectors</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;&gt;&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">i32</span> <span class="p">{</span>

        <span class="n">vectors</span><span class="nf">.concat</span><span class="p">()</span>
                <span class="nf">.iter</span><span class="p">()</span>
                <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
                <span class="nf">.max</span><span class="p">()</span>
                <span class="nf">.unwrap</span><span class="p">()</span>

    <span class="p">}</span>


    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 75/100 - aoc 2022 day13</title><link href="https://maebli.github.io/archive/2023-01-22-100rust-75/" rel="alternate" type="text/html" title="Rust challenge 75/100 - aoc 2022 day13" /><published>2023-01-22T11:05:00+00:00</published><updated>2023-01-22T11:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-75</id><content type="html" xml:base="https://maebli.github.io/archive/2023-01-22-100rust-75/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#75th-challenge">75th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="75th-challenge">75th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>I’m even more behind but still going - so here goes day 13 of AoC🎅🦀</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>I used a recursive descent parser with the following grammar:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;list&gt; ::= "[" &lt;items&gt; "]"
&lt;items&gt; ::= &lt;element&gt; | &lt;element&gt; "," &lt;items&gt;
&lt;element&gt; ::= &lt;integer&gt; | &lt;list&gt;
&lt;integer&gt; ::=  [0-9]*
</code></pre></div></div>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

        <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">)</span><span class="nf">.split</span><span class="p">(</span><span class="s">"</span><span class="se">\n\n</span><span class="s">"</span><span class="p">)</span><span class="nf">.enumerate</span><span class="p">();</span>

        <span class="k">let</span> <span class="n">k</span><span class="p">:</span><span class="nb">usize</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.map</span><span class="p">(|(</span><span class="n">i</span><span class="p">,</span> <span class="n">group</span><span class="p">)|</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">group_number</span> <span class="o">=</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
            <span class="k">let</span> <span class="n">left</span> <span class="o">=</span> <span class="n">group</span><span class="nf">.split</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
            <span class="k">let</span> <span class="n">right</span> <span class="o">=</span> <span class="n">group</span><span class="nf">.split</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
            <span class="p">(</span><span class="n">group_number</span><span class="p">,</span> <span class="nf">compare</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">))</span>
        <span class="p">})</span><span class="nf">.filter</span><span class="p">(|(</span><span class="n">_</span><span class="p">,</span> <span class="n">x</span><span class="p">)|</span> <span class="o">*</span><span class="n">x</span><span class="p">)</span>
            <span class="nf">.map</span><span class="p">(|(</span><span class="n">i</span><span class="p">,</span> <span class="n">_</span><span class="p">)|</span> <span class="n">i</span><span class="p">)</span>
            <span class="nf">.sum</span><span class="p">();</span>

       <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">k</span><span class="p">);</span>

       <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">)</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="o">!</span><span class="n">x</span><span class="nf">.eq</span><span class="p">(</span><span class="o">&amp;</span><span class="s">""</span><span class="p">))</span><span class="nf">.map</span><span class="p">(</span><span class="nn">str</span><span class="p">::</span><span class="n">trim</span><span class="p">)</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="o">&gt;&gt;</span><span class="p">();</span>
       <span class="n">x</span><span class="nf">.append</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="nd">vec!</span><span class="p">[</span><span class="s">"[[2]]"</span><span class="p">]);</span>
       <span class="n">x</span><span class="nf">.append</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="nd">vec!</span><span class="p">[</span><span class="s">"[[6]]"</span><span class="p">]);</span>

       <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.iter</span><span class="p">()</span>
                                                <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="nf">parse_list</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
                                                <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="nf">.ok</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="na">.0</span><span class="p">)</span>
                                                <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&gt;&gt;</span><span class="p">();</span>
       <span class="n">x</span><span class="nf">.sort</span><span class="p">();</span>

       <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="nf">parse_list</span><span class="p">(</span><span class="s">"[[2]]"</span><span class="p">)</span><span class="nf">.ok</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="na">.0</span><span class="p">;</span>
       <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="nf">parse_list</span><span class="p">(</span><span class="s">"[[6]]"</span><span class="p">)</span><span class="nf">.ok</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="na">.0</span><span class="p">;</span>

       <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.position</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="nf">.eq</span><span class="p">(</span><span class="o">&amp;</span><span class="n">a</span><span class="p">))</span><span class="nf">.unwrap</span><span class="p">();</span>
       <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.position</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="nf">.eq</span><span class="p">(</span><span class="o">&amp;</span><span class="n">b</span><span class="p">))</span><span class="nf">.unwrap</span><span class="p">();</span>

       <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="p">(</span><span class="n">a</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">b</span><span class="o">+</span><span class="mi">1</span><span class="p">));</span>


    <span class="p">}</span>

    <span class="nd">#[derive(Debug,Eq,Ord)]</span>
    <span class="k">struct</span> <span class="n">List</span> <span class="p">{</span>
        <span class="n">items</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Element</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="p">}</span>

    <span class="nd">#[derive(Debug,Eq,Ord)]</span>
    <span class="k">enum</span> <span class="n">Element</span> <span class="p">{</span>
        <span class="nf">Integer</span><span class="p">(</span><span class="nb">i64</span><span class="p">),</span>
        <span class="nf">List</span><span class="p">(</span><span class="nb">Box</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&gt;</span><span class="p">),</span>
    <span class="p">}</span>
    <span class="k">impl</span> <span class="nb">PartialEq</span> <span class="k">for</span> <span class="n">Element</span> <span class="p">{</span>
        <span class="k">fn</span> <span class="nf">eq</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">other</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Element</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
            <span class="k">match</span> <span class="p">(</span><span class="k">self</span><span class="p">,</span> <span class="n">other</span><span class="p">)</span> <span class="p">{</span>
                <span class="p">(</span><span class="o">&amp;</span><span class="nn">Element</span><span class="p">::</span><span class="nf">Integer</span><span class="p">(</span><span class="k">ref</span> <span class="n">a</span><span class="p">),</span> <span class="o">&amp;</span><span class="nn">Element</span><span class="p">::</span><span class="nf">Integer</span><span class="p">(</span><span class="k">ref</span> <span class="n">b</span><span class="p">))</span> <span class="k">=&gt;</span> <span class="n">a</span> <span class="o">==</span> <span class="n">b</span><span class="p">,</span>
                <span class="p">(</span><span class="o">&amp;</span><span class="nn">Element</span><span class="p">::</span><span class="nf">List</span><span class="p">(</span><span class="k">ref</span> <span class="n">a</span><span class="p">),</span> <span class="o">&amp;</span><span class="nn">Element</span><span class="p">::</span><span class="nf">List</span><span class="p">(</span><span class="k">ref</span> <span class="n">b</span><span class="p">))</span> <span class="k">=&gt;</span> <span class="n">a</span> <span class="o">==</span> <span class="n">b</span><span class="p">,</span>
                <span class="n">_</span> <span class="k">=&gt;</span> <span class="k">false</span><span class="p">,</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">impl</span> <span class="nb">PartialEq</span> <span class="k">for</span> <span class="n">List</span> <span class="p">{</span>
        <span class="k">fn</span> <span class="nf">eq</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">other</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">List</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
            <span class="k">self</span><span class="py">.items</span> <span class="o">==</span> <span class="n">other</span><span class="py">.items</span>
        <span class="p">}</span>
    <span class="p">}</span>


    <span class="k">impl</span> <span class="nb">PartialOrd</span> <span class="k">for</span> <span class="n">List</span> <span class="p">{</span>
        <span class="k">fn</span> <span class="nf">partial_cmp</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">other</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">List</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Option</span><span class="o">&lt;</span><span class="nn">std</span><span class="p">::</span><span class="nn">cmp</span><span class="p">::</span><span class="n">Ordering</span><span class="o">&gt;</span> <span class="p">{</span>
            <span class="k">self</span><span class="py">.items</span><span class="nf">.partial_cmp</span><span class="p">(</span><span class="o">&amp;</span><span class="n">other</span><span class="py">.items</span><span class="p">)</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">impl</span> <span class="nb">PartialOrd</span> <span class="k">for</span> <span class="n">Element</span> <span class="p">{</span>
        <span class="k">fn</span> <span class="nf">partial_cmp</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">other</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Element</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Option</span><span class="o">&lt;</span><span class="nn">std</span><span class="p">::</span><span class="nn">cmp</span><span class="p">::</span><span class="n">Ordering</span><span class="o">&gt;</span> <span class="p">{</span>
            <span class="k">match</span> <span class="p">(</span><span class="k">self</span><span class="p">,</span> <span class="n">other</span><span class="p">)</span> <span class="p">{</span>
                <span class="p">(</span><span class="o">&amp;</span><span class="nn">Element</span><span class="p">::</span><span class="nf">Integer</span><span class="p">(</span><span class="k">ref</span> <span class="n">a</span><span class="p">),</span> <span class="o">&amp;</span><span class="nn">Element</span><span class="p">::</span><span class="nf">Integer</span><span class="p">(</span><span class="k">ref</span> <span class="n">b</span><span class="p">))</span> <span class="k">=&gt;</span> <span class="n">a</span><span class="nf">.partial_cmp</span><span class="p">(</span><span class="n">b</span><span class="p">),</span>
                <span class="p">(</span><span class="o">&amp;</span><span class="nn">Element</span><span class="p">::</span><span class="nf">List</span><span class="p">(</span><span class="k">ref</span> <span class="n">a</span><span class="p">),</span> <span class="o">&amp;</span><span class="nn">Element</span><span class="p">::</span><span class="nf">List</span><span class="p">(</span><span class="k">ref</span> <span class="n">b</span><span class="p">))</span> <span class="k">=&gt;</span> <span class="n">a</span><span class="nf">.partial_cmp</span><span class="p">(</span><span class="n">b</span><span class="p">),</span>
                <span class="p">(</span><span class="o">&amp;</span><span class="nn">Element</span><span class="p">::</span><span class="nf">List</span><span class="p">(</span><span class="k">ref</span> <span class="n">a</span><span class="p">),</span> <span class="o">&amp;</span><span class="nn">Element</span><span class="p">::</span><span class="nf">Integer</span><span class="p">(</span><span class="k">ref</span> <span class="n">b</span><span class="p">))</span> <span class="k">=&gt;</span> <span class="n">a</span><span class="nf">.partial_cmp</span><span class="p">(</span><span class="o">&amp;</span><span class="nn">Box</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="n">List</span> <span class="p">{</span> <span class="n">items</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="nn">Element</span><span class="p">::</span><span class="nf">Integer</span><span class="p">(</span><span class="o">*</span><span class="n">b</span><span class="p">)]</span> <span class="p">})),</span>
                <span class="p">(</span><span class="o">&amp;</span><span class="nn">Element</span><span class="p">::</span><span class="nf">Integer</span><span class="p">(</span><span class="k">ref</span> <span class="n">a</span><span class="p">),</span> <span class="o">&amp;</span><span class="nn">Element</span><span class="p">::</span><span class="nf">List</span><span class="p">(</span><span class="k">ref</span> <span class="n">b</span><span class="p">))</span> <span class="k">=&gt;</span> <span class="nn">Box</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="n">List</span> <span class="p">{</span> <span class="n">items</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="nn">Element</span><span class="p">::</span><span class="nf">Integer</span><span class="p">(</span><span class="o">*</span><span class="n">a</span><span class="p">)]</span> <span class="p">})</span><span class="nf">.partial_cmp</span><span class="p">(</span><span class="n">b</span><span class="p">),</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">parse_list</span><span class="p">(</span><span class="n">input</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="p">(</span><span class="n">List</span><span class="p">,</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">),</span> <span class="o">&amp;</span><span class="nb">str</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">items</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">input</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.trim_start</span><span class="p">();</span>

        <span class="k">if</span> <span class="o">!</span><span class="n">input</span><span class="nf">.starts_with</span><span class="p">(</span><span class="s">"["</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="nf">Err</span><span class="p">(</span><span class="s">"Expected '[' at start of list"</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="n">input</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">input</span><span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="p">];</span>

        <span class="k">while</span> <span class="o">!</span><span class="n">input</span><span class="nf">.starts_with</span><span class="p">(</span><span class="s">"]"</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">let</span> <span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">rest</span><span class="p">)</span> <span class="o">=</span> <span class="nf">parse_element</span><span class="p">(</span><span class="n">input</span><span class="p">)</span><span class="o">?</span><span class="p">;</span>
            <span class="n">items</span><span class="nf">.push</span><span class="p">(</span><span class="n">item</span><span class="p">);</span>
            <span class="n">input</span> <span class="o">=</span> <span class="n">rest</span><span class="nf">.trim_start</span><span class="p">();</span>

            <span class="k">if</span> <span class="n">input</span><span class="nf">.starts_with</span><span class="p">(</span><span class="s">","</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">input</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">input</span><span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="p">];</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="n">input</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">input</span><span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="p">];</span>

        <span class="nf">Ok</span><span class="p">((</span><span class="n">List</span> <span class="p">{</span> <span class="n">items</span> <span class="p">},</span> <span class="n">input</span><span class="p">))</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">parse_element</span><span class="p">(</span><span class="n">input</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="p">(</span><span class="n">Element</span><span class="p">,</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">),</span> <span class="o">&amp;</span><span class="nb">str</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">if</span> <span class="n">input</span><span class="nf">.starts_with</span><span class="p">(</span><span class="s">"["</span><span class="p">)</span> <span class="p">{</span>
            <span class="nf">parse_list</span><span class="p">(</span><span class="n">input</span><span class="p">)</span><span class="nf">.map</span><span class="p">(|(</span><span class="n">list</span><span class="p">,</span> <span class="n">rest</span><span class="p">)|</span> <span class="p">(</span><span class="nn">Element</span><span class="p">::</span><span class="nf">List</span><span class="p">(</span><span class="nn">Box</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="n">list</span><span class="p">)),</span> <span class="n">rest</span><span class="p">))</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="nf">parse_integer</span><span class="p">(</span><span class="n">input</span><span class="p">)</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">parse_integer</span><span class="p">(</span><span class="n">input</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="p">(</span><span class="n">Element</span><span class="p">,</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">),</span> <span class="o">&amp;</span><span class="nb">str</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">end</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">while</span> <span class="n">end</span> <span class="o">&lt;</span> <span class="n">input</span><span class="nf">.len</span><span class="p">()</span> <span class="o">&amp;&amp;</span> <span class="n">input</span><span class="nf">.as_bytes</span><span class="p">()[</span><span class="n">end</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="sc">b'0'</span> <span class="o">&amp;&amp;</span> <span class="n">input</span><span class="nf">.as_bytes</span><span class="p">()[</span><span class="n">end</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="sc">b'9'</span> <span class="p">{</span>
            <span class="n">end</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">let</span> <span class="p">(</span><span class="n">integer_str</span><span class="p">,</span> <span class="n">rest</span><span class="p">)</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.split_at</span><span class="p">(</span><span class="n">end</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">integer</span> <span class="o">=</span> <span class="n">integer_str</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.map_err</span><span class="p">(|</span><span class="n">_</span><span class="p">|</span> <span class="s">"Expected integer"</span><span class="p">)</span><span class="o">?</span><span class="p">;</span>
        <span class="nf">Ok</span><span class="p">((</span><span class="nn">Element</span><span class="p">::</span><span class="nf">Integer</span><span class="p">(</span><span class="n">integer</span><span class="p">),</span> <span class="n">rest</span><span class="p">))</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">compare</span><span class="p">(</span><span class="n">left</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">,</span> <span class="n">right</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>

        <span class="k">let</span> <span class="n">left</span> <span class="o">=</span> <span class="nf">parse_list</span><span class="p">(</span><span class="n">left</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">right</span> <span class="o">=</span> <span class="nf">parse_list</span><span class="p">(</span><span class="n">right</span><span class="p">);</span>
        
        <span class="k">match</span> <span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">)</span> <span class="p">{</span>
            <span class="p">(</span><span class="nf">Ok</span><span class="p">((</span><span class="n">left</span><span class="p">,</span> <span class="n">_</span><span class="p">)),</span> <span class="nf">Ok</span><span class="p">((</span><span class="n">right</span><span class="p">,</span> <span class="n">_</span><span class="p">)))</span> <span class="k">=&gt;</span> <span class="n">left</span> <span class="o">&lt;</span> <span class="n">right</span><span class="p">,</span>
            <span class="n">_</span> <span class="k">=&gt;</span> <span class="k">false</span><span class="p">,</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="nd">#[cfg(test)]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>
        <span class="k">use</span> <span class="k">super</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test1</span><span class="p">()</span> <span class="p">{</span>
            <span class="nf">test</span><span class="p">(</span><span class="s">"[1,1,3,1,1]"</span><span class="p">,</span> <span class="s">"[1,1,5,1,1]"</span><span class="p">,</span> <span class="k">true</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test2</span><span class="p">()</span> <span class="p">{</span>
            <span class="nf">test</span><span class="p">(</span><span class="s">"[[1],[2,3,4]]"</span><span class="p">,</span> <span class="s">"[[1],4]"</span><span class="p">,</span> <span class="k">true</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test3</span><span class="p">()</span> <span class="p">{</span>
            <span class="nf">test</span><span class="p">(</span><span class="s">"[9]"</span><span class="p">,</span> <span class="s">"[[8,7,6]]"</span><span class="p">,</span> <span class="k">false</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test4</span><span class="p">()</span> <span class="p">{</span>
            <span class="nf">test</span><span class="p">(</span><span class="s">"[[4,4],4,4]"</span><span class="p">,</span> <span class="s">"[[4,4],4,4,4]"</span><span class="p">,</span> <span class="k">true</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test5</span><span class="p">()</span> <span class="p">{</span>
            <span class="nf">test</span><span class="p">(</span><span class="s">"[7,7,7,7]"</span><span class="p">,</span> <span class="s">"[7,7,7]"</span><span class="p">,</span> <span class="k">false</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test6</span><span class="p">()</span> <span class="p">{</span>
            <span class="nf">test</span><span class="p">(</span><span class="s">"[]"</span><span class="p">,</span> <span class="s">"[3]"</span><span class="p">,</span> <span class="k">true</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test7</span><span class="p">()</span> <span class="p">{</span>
            <span class="nf">test</span><span class="p">(</span><span class="s">"[[[]]]"</span><span class="p">,</span> <span class="s">"[[]]"</span><span class="p">,</span> <span class="k">false</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test8</span><span class="p">()</span> <span class="p">{</span>
            <span class="nf">test</span><span class="p">(</span><span class="s">"[1,[2,[3,[4,[5,6,7]]]],8,9]"</span><span class="p">,</span> <span class="s">"[1,[2,[3,[4,[5,6,0]]]],8,9]"</span><span class="p">,</span> <span class="k">false</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="k">fn</span> <span class="nf">test</span><span class="p">(</span><span class="n">input</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">,</span> <span class="n">output</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">,</span> <span class="n">expected_result</span><span class="p">:</span> <span class="nb">bool</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.to_string</span><span class="p">();</span>
            <span class="k">let</span> <span class="n">output</span> <span class="o">=</span> <span class="n">output</span><span class="nf">.to_string</span><span class="p">();</span>
            <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="nf">compare</span><span class="p">(</span><span class="o">&amp;</span><span class="n">input</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">output</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">expected_result</span><span class="p">,</span> <span class="s">"input: {}, Output: {}"</span><span class="p">,</span> <span class="n">input</span><span class="p">,</span> <span class="n">output</span><span class="p">);</span>
        <span class="p">}</span>
        
    <span class="p">}</span>
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 74/100 - aoc 2022 day12</title><link href="https://maebli.github.io/archive/2023-01-03-100rust-74/" rel="alternate" type="text/html" title="Rust challenge 74/100 - aoc 2022 day12" /><published>2023-01-03T14:05:00+00:00</published><updated>2023-01-03T14:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-74</id><content type="html" xml:base="https://maebli.github.io/archive/2023-01-03-100rust-74/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#74th-challenge">74th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="74th-challenge">74th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>So I’m a bit behind but I’m keen to solve them all - so here goes day 12 of AoC🎅🦀</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Here is solution of part 1 and 2. Part 1 confused me for a bit. I knew I had to use breadth first BFS tree traversal but the code wouldn’t stop. The issue was I had fergotten to add the lines<code class="language-plaintext highlighter-rouge">if !queue.contains(&amp;new_point){</code> which made my queue grow to giant sizes. First I thought I needed to use Dijkstra but that was not the case.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::{</span>
         <span class="n">HashSet</span><span class="p">,</span>
         <span class="n">VecDeque</span>
        <span class="p">};</span>

    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">output</span> <span class="o">=</span> <span class="nf">find_shortest_path</span><span class="p">(</span><span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">),</span><span class="sc">'S'</span><span class="p">);</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"Ans1: {:?}"</span><span class="p">,</span> <span class="n">output</span><span class="p">);</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">output</span> <span class="o">=</span> <span class="nf">find_shortest_path</span><span class="p">(</span><span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">),</span><span class="sc">'a'</span><span class="p">);</span>
        <span class="n">output</span><span class="nf">.sort</span><span class="p">();</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"Ans: {:?}"</span><span class="p">,</span> <span class="n">output</span><span class="nf">.first</span><span class="p">());</span>
    <span class="p">}</span>

    <span class="nd">#[derive(Debug,</span> <span class="nd">PartialEq,</span> <span class="nd">Eq,</span> <span class="nd">Hash,</span> <span class="nd">Clone,</span> <span class="nd">Copy)]</span>
    <span class="k">struct</span> <span class="n">Point</span> <span class="p">{</span>
        <span class="n">x</span><span class="p">:</span> <span class="nb">usize</span><span class="p">,</span>
        <span class="n">y</span><span class="p">:</span> <span class="nb">usize</span><span class="p">,</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">find_shortest_path</span><span class="p">(</span><span class="n">input</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">,</span><span class="n">starting_char</span><span class="p">:</span><span class="nb">char</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span> <span class="p">{</span>
        
        <span class="k">let</span> <span class="k">mut</span> <span class="n">grid</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i64</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>
        <span class="k">let</span> <span class="n">row_size</span><span class="p">:</span> <span class="nb">usize</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.len</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">col_size</span><span class="p">:</span> <span class="nb">usize</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.count</span><span class="p">();</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">starting_points</span> <span class="o">=</span><span class="nd">vec!</span><span class="p">[];</span>
        <span class="k">for</span> <span class="n">line</span> <span class="k">in</span> <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">for</span> <span class="n">c</span> <span class="k">in</span> <span class="n">line</span><span class="nf">.trim</span><span class="p">()</span><span class="nf">.chars</span><span class="p">()</span> <span class="p">{</span>
                <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
                    <span class="n">_</span> <span class="k">if</span> <span class="n">c</span> <span class="o">==</span> <span class="n">starting_char</span> <span class="p">||</span> <span class="n">c</span> <span class="o">==</span> <span class="sc">'S'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                        <span class="n">starting_points</span><span class="nf">.push</span><span class="p">(</span><span class="n">grid</span><span class="nf">.len</span><span class="p">());</span>
                        <span class="k">if</span> <span class="n">c</span> <span class="o">==</span> <span class="sc">'S'</span> <span class="p">{</span>
                            <span class="n">grid</span><span class="nf">.push</span><span class="p">((</span><span class="sc">'a'</span> <span class="k">as</span> <span class="nb">u8</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="k">as</span> <span class="nb">i64</span><span class="p">)</span>
                        <span class="p">}</span><span class="k">else</span><span class="p">{</span>
                            <span class="n">grid</span><span class="nf">.push</span><span class="p">(</span><span class="n">c</span> <span class="k">as</span> <span class="nb">i64</span><span class="p">)</span> 
                        <span class="p">}</span>
                    <span class="p">},</span>
                    <span class="sc">'a'</span><span class="o">..=</span><span class="sc">'z'</span> <span class="k">=&gt;</span> <span class="n">grid</span><span class="nf">.push</span><span class="p">(</span><span class="n">c</span> <span class="k">as</span> <span class="nb">i64</span><span class="p">),</span>
                    <span class="sc">'E'</span>  <span class="k">=&gt;</span> <span class="n">grid</span><span class="nf">.push</span><span class="p">((</span><span class="sc">'z'</span> <span class="k">as</span> <span class="nb">u8</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="k">as</span> <span class="nb">i64</span><span class="p">),</span>
                    <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">(),</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">depths</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>

        <span class="k">for</span> <span class="n">starting_point</span> <span class="k">in</span> <span class="n">starting_points</span> <span class="p">{</span>

            <span class="k">let</span> <span class="n">starting_point</span> <span class="o">=</span> <span class="n">Point</span> <span class="p">{</span> <span class="n">x</span><span class="p">:</span> <span class="n">starting_point</span><span class="o">%</span><span class="n">row_size</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">starting_point</span><span class="o">/</span><span class="n">row_size</span> <span class="p">};</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">queue</span><span class="p">:</span> <span class="n">VecDeque</span><span class="o">&lt;</span><span class="n">Point</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nn">VecDeque</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
            <span class="n">queue</span><span class="nf">.push_back</span><span class="p">(</span><span class="n">starting_point</span><span class="p">);</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">visited</span> <span class="o">=</span> <span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">current_depth</span><span class="p">:</span><span class="nb">usize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">finished</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>

            <span class="k">while</span> <span class="o">!</span><span class="n">queue</span><span class="nf">.is_empty</span><span class="p">()</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">finished</span> <span class="p">{</span>

                <span class="k">let</span> <span class="k">mut</span> <span class="n">level_size</span><span class="p">:</span><span class="nb">usize</span> <span class="o">=</span> <span class="n">queue</span><span class="nf">.len</span><span class="p">();</span>

                <span class="k">while</span> <span class="n">level_size</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">{</span>

                    <span class="n">level_size</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">;</span>

                    <span class="k">let</span> <span class="n">current_point</span> <span class="o">=</span> <span class="n">queue</span><span class="nf">.pop_front</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
                    <span class="k">let</span> <span class="n">current_index</span> <span class="o">=</span> <span class="n">current_point</span><span class="py">.x</span> <span class="o">+</span> <span class="n">current_point</span><span class="py">.y</span><span class="o">*</span><span class="n">row_size</span><span class="p">;</span>
                    <span class="k">let</span> <span class="n">current_char</span> <span class="o">=</span> <span class="n">grid</span><span class="p">[</span><span class="n">current_index</span><span class="p">];</span>

                    <span class="k">if</span> <span class="n">current_char</span> <span class="o">==</span> <span class="p">(</span><span class="sc">'z'</span> <span class="k">as</span> <span class="nb">u8</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="k">as</span> <span class="nb">i64</span> <span class="p">{</span>
                        <span class="n">depths</span><span class="nf">.push</span><span class="p">(</span><span class="n">current_depth</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">);</span>
                        <span class="n">finished</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
                    <span class="p">}</span> <span class="k">else</span>  <span class="p">{</span>

                        <span class="n">visited</span><span class="nf">.insert</span><span class="p">(</span><span class="n">current_index</span><span class="p">);</span>
                        
                        <span class="k">if</span> <span class="n">current_point</span><span class="py">.x</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">grid</span><span class="p">[</span><span class="n">current_point</span><span class="py">.x</span><span class="o">-</span><span class="mi">1</span> <span class="o">+</span> <span class="n">current_point</span><span class="py">.y</span><span class="o">*</span><span class="n">row_size</span><span class="p">]</span><span class="o">-</span><span class="n">current_char</span><span class="p">)</span> <span class="o">&lt;=</span><span class="mi">1</span> <span class="p">{</span>
                            <span class="k">if</span> <span class="o">!</span><span class="n">visited</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">current_point</span><span class="py">.x</span><span class="o">-</span><span class="mi">1</span> <span class="o">+</span> <span class="n">current_point</span><span class="py">.y</span><span class="o">*</span><span class="n">row_size</span><span class="p">))</span> <span class="p">{</span>
                                <span class="k">let</span> <span class="n">new_point</span> <span class="o">=</span> <span class="n">Point</span> <span class="p">{</span> <span class="n">x</span><span class="p">:</span> <span class="n">current_point</span><span class="py">.x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">current_point</span><span class="py">.y</span> <span class="p">};</span>
                                <span class="k">if</span> <span class="o">!</span><span class="n">queue</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_point</span><span class="p">){</span>
                                    <span class="n">queue</span><span class="nf">.push_back</span><span class="p">(</span><span class="n">new_point</span><span class="p">);</span>
                                <span class="p">}</span>
                            <span class="p">}</span>
                        <span class="p">}</span>

                        <span class="k">if</span> <span class="n">current_point</span><span class="py">.x</span> <span class="o">&lt;</span> <span class="n">row_size</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">grid</span><span class="p">[</span><span class="n">current_point</span><span class="py">.x</span><span class="o">+</span><span class="mi">1</span> <span class="o">+</span> <span class="n">current_point</span><span class="py">.y</span><span class="o">*</span><span class="n">row_size</span><span class="p">]</span><span class="o">-</span><span class="n">current_char</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">1</span> <span class="p">{</span>
                            <span class="k">if</span> <span class="o">!</span><span class="n">visited</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">current_point</span><span class="py">.x</span><span class="o">+</span><span class="mi">1</span> <span class="o">+</span> <span class="n">current_point</span><span class="py">.y</span><span class="o">*</span><span class="n">row_size</span><span class="p">))</span> <span class="p">{</span>
                                <span class="k">let</span> <span class="n">new_point</span> <span class="o">=</span> <span class="n">Point</span> <span class="p">{</span> <span class="n">x</span><span class="p">:</span> <span class="n">current_point</span><span class="py">.x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">current_point</span><span class="py">.y</span> <span class="p">};</span>
                                <span class="k">if</span> <span class="o">!</span><span class="n">queue</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_point</span><span class="p">){</span>
                                    <span class="n">queue</span><span class="nf">.push_back</span><span class="p">(</span><span class="n">new_point</span><span class="p">);</span>
                                <span class="p">}</span>
                            <span class="p">}</span>
                        <span class="p">}</span>

                        <span class="k">if</span> <span class="n">current_point</span><span class="py">.y</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">grid</span><span class="p">[</span><span class="n">current_point</span><span class="py">.x</span> <span class="o">+</span> <span class="p">(</span><span class="n">current_point</span><span class="py">.y</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">row_size</span><span class="p">]</span><span class="o">-</span><span class="n">current_char</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">{</span>
                            <span class="k">if</span> <span class="o">!</span><span class="n">visited</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">current_point</span><span class="py">.x</span> <span class="o">+</span> <span class="p">(</span><span class="n">current_point</span><span class="py">.y</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">row_size</span><span class="p">))</span> <span class="p">{</span>
                                <span class="k">let</span> <span class="n">new_point</span> <span class="o">=</span> <span class="n">Point</span> <span class="p">{</span> <span class="n">x</span><span class="p">:</span> <span class="n">current_point</span><span class="py">.x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">current_point</span><span class="py">.y</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">};</span>
                                <span class="k">if</span> <span class="o">!</span><span class="n">queue</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_point</span><span class="p">){</span>
                                    <span class="n">queue</span><span class="nf">.push_back</span><span class="p">(</span><span class="n">new_point</span><span class="p">);</span>
                                <span class="p">}</span>
                            <span class="p">}</span>
                        <span class="p">}</span>

                        <span class="k">if</span> <span class="n">current_point</span><span class="py">.y</span> <span class="o">&lt;</span> <span class="n">col_size</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">grid</span><span class="p">[</span><span class="n">current_point</span><span class="py">.x</span><span class="o">+</span><span class="p">(</span><span class="n">current_point</span><span class="py">.y</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">row_size</span><span class="p">]</span><span class="o">-</span><span class="n">current_char</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">1</span> <span class="p">{</span>
                            <span class="k">if</span> <span class="o">!</span><span class="n">visited</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">current_point</span><span class="py">.x</span><span class="o">+</span><span class="p">(</span><span class="n">current_point</span><span class="py">.y</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">row_size</span><span class="p">))</span> <span class="p">{</span>
                                <span class="k">let</span> <span class="n">new_point</span> <span class="o">=</span> <span class="n">Point</span> <span class="p">{</span> <span class="n">x</span><span class="p">:</span> <span class="n">current_point</span><span class="py">.x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">current_point</span><span class="py">.y</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">};</span>
                                <span class="k">if</span> <span class="o">!</span><span class="n">queue</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">new_point</span><span class="p">){</span>
                                    <span class="n">queue</span><span class="nf">.push_back</span><span class="p">(</span><span class="n">new_point</span><span class="p">);</span>
                                <span class="p">}</span>
                            <span class="p">}</span>
                        <span class="p">}</span>
                    <span class="p">}</span>   
                <span class="p">}</span>

                <span class="n">current_depth</span><span class="o">+=</span><span class="mi">1</span><span class="p">;</span>

            <span class="p">}</span>
        <span class="p">}</span>

        <span class="n">depths</span>
    <span class="p">}</span>


    <span class="nd">#[cfg(test)]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>

        <span class="k">use</span> <span class="k">super</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

        <span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"Sabqponm
        abcryxxl
        accszExk
        acctuvwj
        abdefghi"</span><span class="p">;</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">it_works</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">output</span> <span class="o">=</span> <span class="nf">find_shortest_path</span><span class="p">(</span><span class="n">INPUT</span><span class="p">,</span><span class="sc">'S'</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="nd">vec!</span><span class="p">[</span><span class="mi">31</span><span class="p">]);</span>
        <span class="p">}</span>

    <span class="p">}</span>
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 73/100 - aoc 2022 day11</title><link href="https://maebli.github.io/archive/2022-12-11-100rust-73/" rel="alternate" type="text/html" title="Rust challenge 73/100 - aoc 2022 day11" /><published>2022-12-11T14:05:00+00:00</published><updated>2022-12-11T14:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-73</id><content type="html" xml:base="https://maebli.github.io/archive/2022-12-11-100rust-73/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#73rd-challenge">73rd Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="73rd-challenge">73rd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Solve today’s AOC challange.🎅🦀</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Here’s my solution for part two, the part two is very similar but the modulo operation is removed and a constant division by three is present. I’m not going to generalize the answer, as I don’t see much point in it.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">     <span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="n">fmt</span><span class="p">;</span>

    <span class="k">const</span> <span class="n">NUMBER_OF_ROUNDS</span><span class="p">:</span> <span class="nb">u64</span> <span class="o">=</span> <span class="mi">10000</span><span class="p">;</span>

    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">monkeys</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">)</span><span class="nf">.split</span><span class="p">(</span><span class="s">"Monkey"</span><span class="p">)</span>
            <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="o">!</span><span class="n">x</span><span class="nf">.is_empty</span><span class="p">())</span>
            <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span>
                <span class="k">let</span> <span class="k">mut</span> <span class="n">monkey</span> <span class="o">=</span> <span class="n">Monkey</span><span class="p">{</span>
                    <span class="n">item_worry</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[],</span>
                    <span class="n">operation</span><span class="p">:</span> <span class="nn">Box</span><span class="p">::</span><span class="nf">new</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="p">),</span>
                    <span class="n">test</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                    <span class="n">action_on_fail</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                    <span class="n">action_on_success</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                    <span class="n">inspection_count</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                <span class="p">};</span>
                <span class="n">monkey</span><span class="nf">.parse_monkey</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>
                <span class="n">monkey</span>
            <span class="p">})</span>
            <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Monkey</span><span class="o">&gt;&gt;</span><span class="p">();</span>
        
        <span class="k">let</span> <span class="n">factor</span> <span class="o">=</span> <span class="n">monkeys</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="py">.test</span><span class="p">)</span><span class="py">.product</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">();</span>

        <span class="k">for</span> <span class="n">_</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">NUMBER_OF_ROUNDS</span> <span class="p">{</span>
            <span class="k">for</span> <span class="n">x</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">monkeys</span><span class="nf">.len</span><span class="p">()</span> <span class="p">{</span>
                <span class="n">monkeys</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="nf">.inspect</span><span class="p">(</span><span class="n">factor</span><span class="p">);</span>
                <span class="k">let</span> <span class="n">throw</span> <span class="o">=</span> <span class="n">monkeys</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="nf">.throw</span><span class="p">();</span>
                <span class="k">for</span> <span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">item_worry</span><span class="p">)</span> <span class="k">in</span> <span class="n">throw</span> <span class="p">{</span>
                    <span class="n">monkeys</span><span class="p">[</span><span class="n">action</span><span class="p">]</span><span class="nf">.add_worry</span><span class="p">(</span><span class="n">item_worry</span><span class="p">);</span>
                <span class="p">}</span>
            <span class="p">};</span>
        <span class="p">}</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">res</span> <span class="o">=</span> <span class="n">monkeys</span><span class="nf">.iter</span><span class="p">()</span>
                           <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="py">.inspection_count</span><span class="p">)</span>
                           <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;&gt;</span><span class="p">();</span>
        <span class="n">res</span><span class="nf">.sort</span><span class="p">();</span>

        <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="n">res</span><span class="p">);</span>

        <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="n">res</span><span class="p">[</span><span class="n">res</span><span class="nf">.len</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">res</span><span class="p">[</span><span class="n">res</span><span class="nf">.len</span><span class="p">()</span><span class="o">-</span><span class="mi">2</span><span class="p">]);</span>


    <span class="p">}</span>


    <span class="k">struct</span> <span class="n">Monkey</span> <span class="o">&lt;</span><span class="nv">'a</span><span class="o">&gt;</span><span class="p">{</span>
        <span class="n">item_worry</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">,</span>
        <span class="n">operation</span><span class="p">:</span><span class="nb">Box</span><span class="o">&lt;</span><span class="k">dyn</span> <span class="nf">Fn</span><span class="p">(</span><span class="nb">u64</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span> <span class="o">+</span> <span class="nv">'a</span><span class="o">&gt;</span><span class="p">,</span>
        <span class="n">test</span><span class="p">:</span> <span class="nb">u64</span><span class="p">,</span>
        <span class="n">action_on_fail</span><span class="p">:</span> <span class="nb">u64</span><span class="p">,</span>
        <span class="n">action_on_success</span><span class="p">:</span> <span class="nb">u64</span><span class="p">,</span>
        <span class="n">inspection_count</span><span class="p">:</span> <span class="nb">u64</span><span class="p">,</span>
    <span class="p">}</span>

    <span class="k">impl</span> <span class="nb">PartialEq</span> <span class="k">for</span> <span class="n">Monkey</span><span class="o">&lt;</span><span class="nv">'_</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">fn</span> <span class="nf">eq</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">other</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">Self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
            <span class="k">self</span><span class="py">.item_worry</span> <span class="o">==</span> <span class="n">other</span><span class="py">.item_worry</span>
                <span class="o">&amp;&amp;</span> <span class="k">self</span><span class="py">.test</span> <span class="o">==</span> <span class="n">other</span><span class="py">.test</span>
                <span class="o">&amp;&amp;</span> <span class="k">self</span><span class="py">.action_on_fail</span> <span class="o">==</span> <span class="n">other</span><span class="py">.action_on_fail</span>
                <span class="o">&amp;&amp;</span> <span class="k">self</span><span class="py">.action_on_success</span> <span class="o">==</span> <span class="n">other</span><span class="py">.action_on_success</span>
        <span class="p">}</span>

        <span class="k">fn</span> <span class="nf">ne</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">other</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">Self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
            <span class="o">!</span><span class="k">self</span><span class="nf">.eq</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">impl</span> <span class="nn">fmt</span><span class="p">::</span><span class="n">Debug</span> <span class="k">for</span> <span class="n">Monkey</span><span class="o">&lt;</span><span class="nv">'_</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">fn</span> <span class="nf">fmt</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">f</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="nn">fmt</span><span class="p">::</span><span class="n">Formatter</span><span class="o">&lt;</span><span class="nv">'_</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nn">fmt</span><span class="p">::</span><span class="nb">Result</span> <span class="p">{</span>
            <span class="n">f</span><span class="nf">.debug_struct</span><span class="p">(</span><span class="s">"Monkey"</span><span class="p">)</span>
                <span class="nf">.field</span><span class="p">(</span><span class="s">"item_worry"</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">self</span><span class="py">.item_worry</span><span class="p">)</span>
                <span class="nf">.field</span><span class="p">(</span><span class="s">"test"</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">self</span><span class="py">.test</span><span class="p">)</span>
                <span class="nf">.field</span><span class="p">(</span><span class="s">"action_on_fail"</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">self</span><span class="py">.action_on_fail</span><span class="p">)</span>
                <span class="nf">.field</span><span class="p">(</span><span class="s">"action_on_success"</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">self</span><span class="py">.action_on_success</span><span class="p">)</span>
                <span class="nf">.finish</span><span class="p">()</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">impl</span> <span class="o">&lt;</span><span class="nv">'a</span><span class="o">&gt;</span><span class="n">Monkey</span><span class="o">&lt;</span><span class="nv">'a</span><span class="o">&gt;</span><span class="p">{</span>
        <span class="k">fn</span> <span class="nf">parse_monkey</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span><span class="n">input</span><span class="p">:</span><span class="o">&amp;</span><span class="nv">'a</span> <span class="nb">str</span><span class="p">)</span> <span class="p">{</span>

            <span class="k">let</span> <span class="k">mut</span> <span class="n">lines</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.lines</span><span class="p">();</span>
            <span class="n">lines</span><span class="nf">.next</span><span class="p">();</span>

            <span class="k">self</span><span class="py">.item_worry</span> <span class="o">=</span> <span class="n">lines</span><span class="nf">.next</span><span class="p">()</span>
                <span class="nf">.unwrap</span><span class="p">()</span>
                <span class="nf">.split</span><span class="p">(</span><span class="s">":"</span><span class="p">)</span>
                <span class="nf">.nth</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
                <span class="nf">.unwrap</span><span class="p">()</span>
                <span class="nf">.split</span><span class="p">(</span><span class="s">","</span><span class="p">)</span>
                <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="nf">.trim</span><span class="p">()</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span>
                <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;&gt;</span><span class="p">();</span>

            <span class="k">let</span> <span class="n">operation</span> <span class="o">=</span> <span class="n">lines</span><span class="nf">.next</span><span class="p">()</span>
                        <span class="nf">.unwrap</span><span class="p">()</span>
                        <span class="nf">.split</span><span class="p">(</span><span class="s">"old"</span><span class="p">)</span>
                        <span class="nf">.nth</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
                        <span class="nf">.unwrap</span><span class="p">()</span>
                        <span class="nf">.trim</span><span class="p">();</span>
            
            <span class="k">self</span><span class="py">.test</span> <span class="o">=</span> <span class="n">lines</span><span class="nf">.next</span><span class="p">()</span>
                            <span class="nf">.unwrap</span><span class="p">()</span>
                            <span class="nf">.split</span><span class="p">(</span><span class="s">" "</span><span class="p">)</span>
                            <span class="nf">.last</span><span class="p">()</span>
                            <span class="nf">.unwrap</span><span class="p">()</span>
                            <span class="nf">.trim</span><span class="p">()</span>
                            <span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span>
                            <span class="nf">.unwrap</span><span class="p">();</span>
             
             <span class="k">self</span><span class="py">.operation</span> <span class="o">=</span> <span class="k">match</span> <span class="n">operation</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="p">{</span>
                <span class="sc">'*'</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="k">if</span> <span class="n">operation</span><span class="nf">.len</span><span class="p">()</span> <span class="o">==</span> <span class="mi">1</span> <span class="p">{</span>
                        <span class="nn">Box</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="k">move</span> <span class="p">|</span><span class="n">x</span><span class="p">|</span> <span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">))</span>
                    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                        <span class="k">let</span> <span class="n">n</span> <span class="o">=</span> <span class="n">operation</span><span class="p">[</span><span class="mi">2</span><span class="o">..</span><span class="p">]</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
                        <span class="nn">Box</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="k">move</span> <span class="p">|</span><span class="n">x</span><span class="p">|</span> <span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="n">n</span><span class="p">))</span>
                    <span class="p">}</span>

                <span class="p">},</span>
                <span class="sc">'+'</span> <span class="k">=&gt;</span> 
                    <span class="p">{</span>
                        <span class="k">if</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">=</span> <span class="n">operation</span><span class="p">[</span><span class="mi">2</span><span class="o">..</span><span class="p">]</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.ok</span><span class="p">()</span> <span class="p">{</span>
                            <span class="nn">Box</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="k">move</span> <span class="p">|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="o">+</span><span class="n">n</span><span class="p">)</span>
                        <span class="p">}</span><span class="k">else</span><span class="p">{</span>
                            <span class="nd">panic!</span><span class="p">(</span><span class="s">"Invalid operation"</span><span class="p">);</span>
                        <span class="p">}</span>
                    <span class="p">}</span>

                <span class="n">_</span> <span class="k">=&gt;</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"Invalid operation"</span><span class="p">),</span>
            <span class="p">};</span>          

                
            <span class="k">self</span><span class="py">.action_on_success</span> <span class="o">=</span> <span class="n">lines</span><span class="nf">.next</span><span class="p">()</span>
                            <span class="nf">.unwrap</span><span class="p">()</span>
                            <span class="nf">.split</span><span class="p">(</span><span class="s">" "</span><span class="p">)</span>
                            <span class="nf">.last</span><span class="p">()</span>
                            <span class="nf">.unwrap</span><span class="p">()</span>
                            <span class="nf">.trim</span><span class="p">()</span>
                            <span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span>
                            <span class="nf">.unwrap</span><span class="p">();</span>

            <span class="k">self</span><span class="py">.action_on_fail</span> <span class="o">=</span> <span class="n">lines</span><span class="nf">.next</span><span class="p">()</span>
                            <span class="nf">.unwrap</span><span class="p">()</span>
                            <span class="nf">.split</span><span class="p">(</span><span class="s">" "</span><span class="p">)</span>
                            <span class="nf">.last</span><span class="p">()</span>
                            <span class="nf">.unwrap</span><span class="p">()</span>
                            <span class="nf">.trim</span><span class="p">()</span>
                            <span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span>
                            <span class="nf">.unwrap</span><span class="p">();</span>
        <span class="p">}</span>

        <span class="c1">// create new inspect method</span>
        <span class="k">fn</span> <span class="nf">inspect</span><span class="p">(</span><span class="o">&amp;</span> <span class="k">mut</span> <span class="k">self</span><span class="p">,</span><span class="n">factor</span><span class="p">:</span><span class="nb">u64</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">self</span><span class="py">.item_worry</span><span class="nf">.iter_mut</span><span class="p">()</span><span class="nf">.for_each</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span>
                <span class="o">*</span><span class="n">x</span> <span class="o">=</span> <span class="p">(</span><span class="k">self</span><span class="py">.operation</span><span class="p">)(</span><span class="o">*</span><span class="n">x</span><span class="p">);</span>
                <span class="o">*</span><span class="n">x</span> <span class="o">=</span> <span class="o">*</span><span class="n">x</span> <span class="o">%</span> <span class="n">factor</span><span class="p">;</span>
                <span class="k">self</span><span class="py">.inspection_count</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">});</span>
        <span class="p">}</span>

        <span class="k">fn</span> <span class="nf">throw</span><span class="p">(</span><span class="o">&amp;</span> <span class="k">mut</span> <span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">usize</span><span class="p">,</span><span class="nb">u64</span><span class="p">)</span><span class="o">&gt;</span> <span class="p">{</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">result</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>
            <span class="k">while</span> <span class="o">!</span><span class="k">self</span><span class="py">.item_worry</span><span class="nf">.is_empty</span><span class="p">()</span> <span class="p">{</span>
                <span class="k">let</span> <span class="n">item_worry</span> <span class="o">=</span> <span class="k">self</span><span class="py">.item_worry</span><span class="nf">.remove</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
                <span class="k">if</span> <span class="n">item_worry</span> <span class="o">%</span> <span class="k">self</span><span class="py">.test</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
                    <span class="n">result</span><span class="nf">.push</span><span class="p">((</span><span class="k">self</span><span class="py">.action_on_success</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">,</span><span class="n">item_worry</span><span class="p">))</span>
                <span class="p">}</span><span class="k">else</span><span class="p">{</span>
                    <span class="n">result</span><span class="nf">.push</span><span class="p">((</span><span class="k">self</span><span class="py">.action_on_fail</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">,</span><span class="n">item_worry</span><span class="p">))</span>
                <span class="p">}</span>
            <span class="p">}</span>
            <span class="n">result</span>
        <span class="p">}</span>

        <span class="k">fn</span> <span class="nf">add_worry</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span> <span class="n">item_worry</span><span class="p">:</span><span class="nb">u64</span><span class="p">){</span>
            <span class="k">self</span><span class="py">.item_worry</span><span class="nf">.push</span><span class="p">(</span><span class="n">item_worry</span><span class="p">);</span>
        <span class="p">}</span>

    <span class="p">}</span>




    <span class="nd">#[cfg(test)]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>
        <span class="k">use</span> <span class="k">super</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_parse_monkeys</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">expected_monkeys</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span>
                <span class="n">Monkey</span> <span class="p">{</span>
                    <span class="n">item_worry</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="mi">79</span><span class="p">,</span> <span class="mi">98</span><span class="p">],</span>
                    <span class="n">operation</span><span class="p">:</span> <span class="nn">Box</span><span class="p">::</span><span class="nf">new</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span> <span class="o">*</span> <span class="mi">19</span><span class="p">),</span>
                    <span class="n">test</span><span class="p">:</span> <span class="mi">23</span><span class="p">,</span>
                    <span class="n">action_on_fail</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
                    <span class="n">action_on_success</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
                    <span class="n">inspection_count</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                <span class="p">},</span>
                <span class="n">Monkey</span> <span class="p">{</span>
                    <span class="n">item_worry</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="mi">54</span><span class="p">,</span> <span class="mi">65</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">74</span><span class="p">],</span>
                    <span class="n">operation</span><span class="p">:</span> <span class="nn">Box</span><span class="p">::</span><span class="nf">new</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span>
                    <span class="n">test</span><span class="p">:</span> <span class="mi">19</span><span class="p">,</span>
                    <span class="n">action_on_fail</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
                    <span class="n">action_on_success</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                    <span class="n">inspection_count</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                <span class="p">},</span>
                <span class="n">Monkey</span> <span class="p">{</span>
                    <span class="n">item_worry</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="mi">79</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">97</span><span class="p">],</span>
                    <span class="n">operation</span><span class="p">:</span> <span class="nn">Box</span><span class="p">::</span><span class="nf">new</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span> <span class="o">*</span> <span class="n">x</span><span class="p">),</span>
                    <span class="n">test</span><span class="p">:</span> <span class="mi">13</span><span class="p">,</span>
                    <span class="n">action_on_fail</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="n">action_on_success</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
                    <span class="n">inspection_count</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                <span class="p">},</span>
                <span class="n">Monkey</span> <span class="p">{</span>
                    <span class="n">item_worry</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="mi">74</span><span class="p">],</span>
                    <span class="n">operation</span><span class="p">:</span> <span class="nn">Box</span><span class="p">::</span><span class="nf">new</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">3</span><span class="p">),</span>
                    <span class="n">test</span><span class="p">:</span> <span class="mi">17</span><span class="p">,</span>
                    <span class="n">action_on_fail</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                    <span class="n">action_on_success</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="n">inspection_count</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span>
                <span class="p">},</span>
            <span class="p">];</span>
            
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_parse_monkey</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">expected_monkey</span> <span class="o">=</span> <span class="n">Monkey</span> <span class="p">{</span>
                <span class="n">item_worry</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="mi">79</span><span class="p">,</span> <span class="mi">98</span><span class="p">],</span>
                <span class="n">operation</span><span class="p">:</span> <span class="nn">Box</span><span class="p">::</span><span class="nf">new</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span> <span class="o">*</span> <span class="mi">19</span><span class="p">),</span>
                <span class="n">test</span><span class="p">:</span> <span class="mi">23</span><span class="p">,</span>
                <span class="n">action_on_fail</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
                <span class="n">action_on_success</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
                <span class="n">inspection_count</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
            <span class="p">};</span>
            
            <span class="k">let</span> <span class="k">mut</span> <span class="n">monkey</span> <span class="o">=</span> <span class="n">Monkey</span><span class="p">{</span>
                <span class="n">item_worry</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[],</span>
                <span class="n">operation</span><span class="p">:</span> <span class="nn">Box</span><span class="p">::</span><span class="nf">new</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="p">),</span>
                <span class="n">test</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                <span class="n">action_on_fail</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                <span class="n">action_on_success</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                <span class="n">inspection_count</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
            <span class="p">};</span>

            <span class="n">monkey</span><span class="nf">.parse_monkey</span><span class="p">(</span><span class="s">"Monkey 0:
            Starting items: 79, 98
            Operation: new = old * 19
            Test: divisible by 23
              If true: throw to monkey 2
              If false: throw to monkey 3
          "</span><span class="p">);</span>

          <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="n">monkey</span><span class="p">);</span>
          
        <span class="p">}</span>
    <span class="p">}</span>
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 72/100 - aoc 2022 day10</title><link href="https://maebli.github.io/archive/2022-12-10-100rust-72/" rel="alternate" type="text/html" title="Rust challenge 72/100 - aoc 2022 day10" /><published>2022-12-10T14:05:00+00:00</published><updated>2022-12-10T14:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-72</id><content type="html" xml:base="https://maebli.github.io/archive/2022-12-10-100rust-72/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#72nd-challenge">72nd Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="72nd-challenge">72nd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Solve today’s AOC challange.🎅🦀</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Here’s my solution:</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="nf">signal_strenth</span><span class="p">(</span><span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">));</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="n">x</span><span class="p">);</span>
        <span class="nf">render</span><span class="p">(</span><span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">));</span>
    <span class="p">}</span>


    <span class="k">fn</span> <span class="nf">signal_strenth</span><span class="p">(</span><span class="n">input</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span> <span class="p">{</span>
        <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[</span><span class="mi">1</span><span class="p">],|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">,</span><span class="n">curr</span><span class="p">|{</span>
            <span class="k">let</span> <span class="n">last</span> <span class="o">=</span> <span class="o">*</span><span class="n">acc</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
            <span class="n">acc</span><span class="nf">.push</span><span class="p">(</span><span class="n">last</span><span class="p">);</span>
            <span class="k">if</span> <span class="n">curr</span><span class="p">[</span><span class="o">..</span><span class="mi">4</span><span class="p">]</span> <span class="o">!=</span> <span class="o">*</span><span class="s">"noop"</span><span class="p">{</span>
                <span class="k">let</span> <span class="n">value</span> <span class="o">=</span> <span class="n">curr</span><span class="nf">.split</span><span class="p">(</span><span class="s">" "</span><span class="p">)</span><span class="nf">.last</span><span class="p">()</span>
                                <span class="nf">.unwrap</span><span class="p">()</span>
                                <span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i64</span><span class="o">&gt;</span><span class="p">()</span>
                                <span class="nf">.ok</span><span class="p">()</span>
                                <span class="nf">.unwrap</span><span class="p">();</span>
                <span class="n">acc</span><span class="nf">.push</span><span class="p">(</span><span class="n">last</span><span class="o">+</span><span class="n">value</span><span class="p">);</span>
            <span class="p">};</span>
            <span class="n">acc</span>
        <span class="p">})</span>
        <span class="nf">.iter</span><span class="p">()</span>
        <span class="nf">.enumerate</span><span class="p">()</span>
        <span class="nf">.filter</span><span class="p">(|</span><span class="n">i</span><span class="p">|</span> <span class="p">(</span><span class="n">i</span><span class="na">.0</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="mi">40</span> <span class="o">==</span> <span class="mi">20</span><span class="p">)</span>
        <span class="nf">.map</span><span class="p">(|</span><span class="n">a</span><span class="p">|</span> <span class="p">((</span><span class="n">a</span><span class="na">.0</span> <span class="k">as</span> <span class="nb">i64</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">a</span><span class="na">.1</span><span class="p">)</span>
        <span class="py">.sum</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i64</span><span class="o">&gt;</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u64</span>
    <span class="p">}</span>


    <span class="k">fn</span> <span class="nf">render</span><span class="p">(</span><span class="n">input</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[</span><span class="mi">1</span><span class="p">],|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">,</span><span class="n">curr</span><span class="p">|{</span>
            <span class="k">let</span> <span class="n">last</span> <span class="o">=</span> <span class="o">*</span><span class="n">acc</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
            <span class="n">acc</span><span class="nf">.push</span><span class="p">(</span><span class="n">last</span><span class="p">);</span>
            <span class="k">if</span> <span class="n">curr</span><span class="p">[</span><span class="o">..</span><span class="mi">4</span><span class="p">]</span> <span class="o">!=</span> <span class="o">*</span><span class="s">"noop"</span><span class="p">{</span>
                <span class="k">let</span> <span class="n">value</span> <span class="o">=</span> <span class="n">curr</span><span class="nf">.split</span><span class="p">(</span><span class="s">" "</span><span class="p">)</span><span class="nf">.last</span><span class="p">()</span>
                                <span class="nf">.unwrap</span><span class="p">()</span>
                                <span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i64</span><span class="o">&gt;</span><span class="p">()</span>
                                <span class="nf">.ok</span><span class="p">()</span>
                                <span class="nf">.unwrap</span><span class="p">();</span>
                <span class="n">acc</span><span class="nf">.push</span><span class="p">(</span><span class="n">last</span><span class="o">+</span><span class="n">value</span><span class="p">);</span>
            <span class="p">};</span>
            <span class="n">acc</span>
        <span class="p">})</span>
        <span class="nf">.iter</span><span class="p">()</span>
        <span class="nf">.enumerate</span><span class="p">()</span>
        <span class="nf">.map</span><span class="p">(|</span><span class="n">a</span><span class="p">|</span>  <span class="p">{</span>
            <span class="k">if</span> <span class="p">((</span><span class="n">a</span><span class="na">.0</span><span class="o">%</span><span class="mi">40</span><span class="p">)</span> <span class="k">as</span> <span class="nb">i64</span><span class="o">-</span><span class="n">a</span><span class="na">.1</span><span class="p">)</span><span class="nf">.abs</span><span class="p">()</span> <span class="o">&lt;</span> <span class="mi">2</span> <span class="p">{</span>
                <span class="k">return</span> <span class="sc">'#'</span>
            <span class="p">}</span>
            <span class="sc">'.'</span>
        <span class="p">}</span>
        <span class="p">)</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;&gt;</span><span class="p">();</span>

        <span class="k">let</span> <span class="n">lines</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.chunks</span><span class="p">(</span><span class="mi">40</span><span class="p">)</span><span class="nf">.map</span><span class="p">(|</span><span class="n">a</span><span class="p">|</span> <span class="n">a</span><span class="nf">.iter</span><span class="p">()</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">String</span><span class="o">&gt;</span><span class="p">())</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;&gt;</span><span class="p">();</span>
        <span class="k">for</span> <span class="n">line</span> <span class="k">in</span> <span class="n">lines</span> <span class="p">{</span>
            <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span><span class="n">line</span><span class="p">);</span>
        <span class="p">}</span>
        
    <span class="p">}</span>


    <span class="c1">// test</span>
    <span class="nd">#[cfg(test)]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>
        <span class="k">use</span> <span class="k">super</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>
        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_signal_strenth</span><span class="p">()</span> <span class="p">{</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">signal_strenth</span><span class="p">(</span><span class="nd">include_str!</span><span class="p">(</span><span class="s">"../test_input.txt"</span><span class="p">)),</span><span class="mi">13140</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_render</span><span class="p">()</span> <span class="p">{</span>
            <span class="nf">render</span><span class="p">(</span><span class="nd">include_str!</span><span class="p">(</span><span class="s">"../test_input.txt"</span><span class="p">));</span>
        <span class="p">}</span>
    <span class="p">}</span>
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 71/100 - aoc 2022 day9</title><link href="https://maebli.github.io/archive/2022-12-09-100rust-71/" rel="alternate" type="text/html" title="Rust challenge 71/100 - aoc 2022 day9" /><published>2022-12-09T14:05:00+00:00</published><updated>2022-12-09T14:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-71</id><content type="html" xml:base="https://maebli.github.io/archive/2022-12-09-100rust-71/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#71st-challenge">71st Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="71st-challenge">71st Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Solve today’s AOC challange.🎅🦀</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Here’s my solution:</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">     <span class="k">use</span> <span class="nn">std</span><span class="p">::{</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashSet</span><span class="p">,</span> <span class="nn">borrow</span><span class="p">::{</span><span class="n">Borrow</span><span class="p">,</span> <span class="n">BorrowMut</span><span class="p">}};</span>

    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
       
        <span class="k">let</span> <span class="k">mut</span> <span class="n">rope1</span> <span class="o">=</span> <span class="n">Rope</span><span class="p">{</span>
            <span class="n">history</span><span class="p">:</span> <span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
            <span class="n">positions</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">};</span><span class="mi">10</span><span class="p">],</span>
        <span class="p">};</span>

        <span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">)</span>
                <span class="nf">.lines</span><span class="p">()</span>
                <span class="nf">.map</span><span class="p">(</span><span class="n">parse_steps</span><span class="p">)</span>
                <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">rope1</span><span class="nf">.move_rope</span><span class="p">(</span><span class="n">x</span><span class="nf">.unwrap</span><span class="p">()))</span>
                <span class="nf">.for_each</span><span class="p">(</span><span class="nb">drop</span><span class="p">);</span>
        
        <span class="nd">println!</span><span class="p">(</span><span class="s">"Length of rope 1 {}"</span><span class="p">,</span><span class="n">rope1</span><span class="py">.history</span><span class="nf">.len</span><span class="p">());</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">rope2</span> <span class="o">=</span> <span class="n">Rope</span><span class="p">{</span>
            <span class="n">history</span><span class="p">:</span> <span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
            <span class="n">positions</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">};</span><span class="mi">2</span><span class="p">],</span>
        <span class="p">};</span>

        <span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">)</span>
                <span class="nf">.lines</span><span class="p">()</span>
                <span class="nf">.map</span><span class="p">(</span><span class="n">parse_steps</span><span class="p">)</span>
                <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">rope2</span><span class="nf">.move_rope</span><span class="p">(</span><span class="n">x</span><span class="nf">.unwrap</span><span class="p">()))</span>
                <span class="nf">.for_each</span><span class="p">(</span><span class="nb">drop</span><span class="p">);</span>
        
        <span class="nd">println!</span><span class="p">(</span><span class="s">"Length of rope 2{}"</span><span class="p">,</span><span class="n">rope2</span><span class="py">.history</span><span class="nf">.len</span><span class="p">());</span>

    <span class="p">}</span>


    <span class="nd">#[derive(Debug,PartialEq,Clone)]</span>
    <span class="k">enum</span> <span class="n">Direction</span> <span class="p">{</span>
        <span class="n">Up</span><span class="p">,</span>
        <span class="n">Down</span><span class="p">,</span>
        <span class="nb">Left</span><span class="p">,</span>
        <span class="nb">Right</span><span class="p">,</span>
    <span class="p">}</span>

    <span class="nd">#[derive(Debug,</span> <span class="nd">PartialEq)]</span>
    <span class="k">struct</span> <span class="n">Motion</span> <span class="p">{</span>
        <span class="n">steps</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Step</span><span class="o">&gt;</span>
    <span class="p">}</span>

    <span class="nd">#[derive(Debug,</span> <span class="nd">PartialEq,Clone)]</span>
    <span class="k">struct</span> <span class="n">Step</span> <span class="p">{</span>
        <span class="n">direction</span><span class="p">:</span> <span class="n">Direction</span><span class="p">,</span>
    <span class="p">}</span>

    <span class="nd">#[derive(Debug,</span> <span class="nd">PartialEq,Clone,Hash,Eq)]</span>
    <span class="k">struct</span> <span class="n">Position</span> <span class="p">{</span>
        <span class="n">x</span><span class="p">:</span> <span class="nb">i64</span><span class="p">,</span>
        <span class="n">y</span><span class="p">:</span> <span class="nb">i64</span><span class="p">,</span>
    <span class="p">}</span>
    <span class="nd">#[derive(Debug,</span> <span class="nd">PartialEq,Eq,Clone)]</span>
    <span class="k">struct</span> <span class="n">Rope</span> <span class="p">{</span>
        <span class="n">history</span><span class="p">:</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Position</span><span class="o">&gt;</span><span class="p">,</span>
        <span class="n">positions</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Position</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="p">}</span>

    <span class="k">impl</span> <span class="n">Position</span> <span class="p">{</span>

        <span class="k">fn</span> <span class="nf">get_distance</span><span class="p">(</span><span class="n">a</span><span class="p">:</span><span class="o">&amp;</span><span class="n">Position</span><span class="p">,</span><span class="n">b</span><span class="p">:</span><span class="o">&amp;</span><span class="n">Position</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="p">(</span><span class="nb">i64</span><span class="p">,</span><span class="nb">i64</span><span class="p">)</span>  <span class="p">{</span>
            <span class="p">(</span>
                <span class="p">(</span><span class="n">a</span><span class="py">.x</span><span class="o">-</span> <span class="n">b</span><span class="py">.x</span><span class="p">)</span><span class="nf">.abs</span><span class="p">()</span> <span class="p">,</span> 
                <span class="p">(</span><span class="n">a</span><span class="py">.y</span><span class="o">-</span> <span class="n">b</span><span class="py">.y</span><span class="p">)</span><span class="nf">.abs</span><span class="p">()</span>
            <span class="p">)</span>
        <span class="p">}</span>

        <span class="k">fn</span> <span class="nf">head_is_not_touching_tail</span><span class="p">(</span><span class="n">a</span><span class="p">:</span><span class="o">&amp;</span><span class="n">Position</span><span class="p">,</span><span class="n">b</span><span class="p">:</span><span class="o">&amp;</span><span class="n">Position</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
            <span class="k">let</span> <span class="p">(</span><span class="n">delta_x</span><span class="p">,</span> <span class="n">delta_y</span><span class="p">)</span> <span class="o">=</span> <span class="k">Self</span><span class="p">::</span><span class="nf">get_distance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">);</span>
            <span class="n">delta_x</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="p">||</span> <span class="n">delta_y</span> <span class="o">&gt;</span> <span class="mi">1</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">impl</span> <span class="n">Rope</span> <span class="p">{</span>
        
        <span class="k">fn</span> <span class="nf">move_rope</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span> <span class="n">steps</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Step</span><span class="o">&gt;</span><span class="p">)</span> <span class="p">{</span>

            <span class="k">for</span> <span class="n">step</span> <span class="k">in</span> <span class="n">steps</span> <span class="p">{</span>

                <span class="k">let</span> <span class="k">mut</span> <span class="n">head</span> <span class="o">=</span> <span class="k">self</span><span class="py">.positions</span><span class="nf">.first</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.clone</span><span class="p">();</span>

                <span class="k">match</span> <span class="n">step</span><span class="py">.direction</span> <span class="p">{</span>
                    <span class="nn">Direction</span><span class="p">::</span><span class="n">Up</span> <span class="k">=&gt;</span> <span class="n">head</span><span class="py">.y</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="nn">Direction</span><span class="p">::</span><span class="n">Down</span> <span class="k">=&gt;</span> <span class="n">head</span><span class="py">.y</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="nn">Direction</span><span class="p">::</span><span class="nb">Left</span> <span class="k">=&gt;</span> <span class="n">head</span><span class="py">.x</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="nn">Direction</span><span class="p">::</span><span class="nb">Right</span> <span class="k">=&gt;</span> <span class="n">head</span><span class="py">.x</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">,</span>
                <span class="p">}</span>
                <span class="k">self</span><span class="py">.positions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span><span class="n">head</span><span class="p">;</span>

                <span class="k">self</span><span class="py">.positions</span><span class="nf">.iter</span><span class="p">()</span>
                              <span class="nf">.enumerate</span><span class="p">()</span>
                              <span class="nf">.map</span><span class="p">(|</span><span class="n">i</span><span class="p">|</span> <span class="p">(</span><span class="n">i</span><span class="na">.0</span><span class="p">,</span><span class="n">i</span><span class="na">.0</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span>
                              <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="n">_</span><span class="p">,</span><span class="n">_</span><span class="p">)</span><span class="o">&gt;&gt;</span><span class="p">()</span>
                              <span class="nf">.iter</span><span class="p">()</span>
                              <span class="nf">.for_each</span><span class="p">(|(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)|</span> <span class="p">{</span>
                                    <span class="k">let</span> <span class="n">head</span> <span class="o">=</span> <span class="k">self</span><span class="py">.positions</span><span class="nf">.get</span><span class="p">(</span><span class="o">*</span><span class="n">a</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
                                    <span class="k">if</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="n">tail</span><span class="p">)</span> <span class="o">=</span> <span class="k">self</span><span class="py">.positions</span><span class="nf">.get</span><span class="p">(</span><span class="o">*</span><span class="n">b</span><span class="p">){</span>
                                        
                                        <span class="k">let</span> <span class="k">mut</span> <span class="n">tail</span> <span class="o">=</span> <span class="n">tail</span><span class="nf">.clone</span><span class="p">();</span>
                                        <span class="k">if</span> <span class="nn">Position</span><span class="p">::</span><span class="nf">head_is_not_touching_tail</span><span class="p">(</span><span class="o">&amp;</span><span class="n">head</span><span class="p">,</span><span class="o">&amp;</span><span class="n">tail</span><span class="p">)</span> <span class="p">{</span>
                            
                                            <span class="k">let</span> <span class="p">(</span><span class="n">delta_x</span><span class="p">,</span> <span class="n">delta_y</span><span class="p">)</span> <span class="o">=</span> <span class="nn">Position</span><span class="p">::</span><span class="nf">get_distance</span><span class="p">(</span><span class="o">&amp;</span><span class="n">head</span><span class="p">,</span><span class="o">&amp;</span><span class="n">tail</span><span class="p">);</span>
                        
                                            <span class="k">if</span> <span class="n">delta_x</span> <span class="o">&gt;=</span> <span class="mi">1</span> <span class="p">{</span>
                                                <span class="n">tail</span><span class="py">.x</span> <span class="o">+=</span> <span class="p">(</span><span class="n">head</span><span class="py">.x</span> <span class="o">-</span> <span class="n">tail</span><span class="py">.x</span><span class="p">)</span><span class="nf">.clamp</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
                                            <span class="p">}</span>
                                            <span class="k">if</span> <span class="n">delta_y</span> <span class="o">&gt;=</span> <span class="mi">1</span> <span class="p">{</span>
                                                <span class="n">tail</span><span class="py">.y</span> <span class="o">+=</span> <span class="p">(</span><span class="n">head</span><span class="py">.y</span> <span class="o">-</span> <span class="n">tail</span><span class="py">.y</span><span class="p">)</span><span class="nf">.clamp</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
                                            <span class="p">}</span>
                                        <span class="p">}</span>
                                        <span class="k">self</span><span class="py">.positions</span><span class="p">[</span><span class="o">*</span><span class="n">b</span><span class="p">]</span> <span class="o">=</span> <span class="n">tail</span><span class="p">;</span>
                                    <span class="p">}</span>

                              <span class="p">});</span>
                <span class="k">self</span><span class="py">.history</span><span class="nf">.insert</span><span class="p">(</span><span class="k">self</span><span class="py">.positions</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.clone</span><span class="p">());</span>
            <span class="p">}</span>
            
        <span class="p">}</span>

            

    <span class="p">}</span>


    <span class="k">fn</span> <span class="nf">parse_steps</span><span class="p">(</span><span class="n">input</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Option</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Step</span><span class="o">&gt;&gt;</span> <span class="p">{</span>

        <span class="k">let</span> <span class="n">distance</span> <span class="o">=</span> <span class="n">input</span><span class="p">[</span><span class="mi">2</span><span class="o">..</span><span class="p">]</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.ok</span><span class="p">()</span><span class="o">?</span><span class="p">;</span>
        <span class="k">let</span> <span class="n">direction</span> <span class="o">=</span> <span class="k">match</span> <span class="n">input</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.nth</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">?</span><span class="p">{</span>
            <span class="sc">'U'</span> <span class="k">=&gt;</span> <span class="nn">Direction</span><span class="p">::</span><span class="n">Up</span><span class="p">,</span>
            <span class="sc">'D'</span> <span class="k">=&gt;</span> <span class="nn">Direction</span><span class="p">::</span><span class="n">Down</span><span class="p">,</span>
            <span class="sc">'L'</span> <span class="k">=&gt;</span> <span class="nn">Direction</span><span class="p">::</span><span class="nb">Left</span><span class="p">,</span>
            <span class="sc">'R'</span> <span class="k">=&gt;</span> <span class="nn">Direction</span><span class="p">::</span><span class="nb">Right</span><span class="p">,</span>
            <span class="n">_</span> <span class="k">=&gt;</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"Invalid direction"</span><span class="p">),</span>
        <span class="p">};</span>

        <span class="nf">Some</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[</span><span class="n">Step</span><span class="p">{</span><span class="n">direction</span><span class="p">};</span> <span class="n">distance</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">])</span>
    <span class="p">}</span>


    <span class="nd">#[cfg(test)]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>

        <span class="k">use</span> <span class="k">super</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">motion_parsing</span><span class="p">()</span> <span class="p">{</span>

            <span class="k">let</span> <span class="n">_rope</span> <span class="o">=</span> <span class="n">Rope</span><span class="p">{</span>
                <span class="n">history</span><span class="p">:</span> <span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
                <span class="n">positions</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">};</span><span class="mi">2</span><span class="p">],</span>
            <span class="p">};</span>
            
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"D 142"</span><span class="p">),</span> <span class="nf">Some</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[</span><span class="n">Step</span><span class="p">{</span><span class="n">direction</span><span class="p">:</span> <span class="nn">Direction</span><span class="p">::</span><span class="n">Down</span><span class="p">};</span> <span class="mi">142</span><span class="p">]));</span>

        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">rope_movement</span><span class="p">()</span> <span class="p">{</span>

            <span class="k">let</span> <span class="k">mut</span> <span class="n">rope</span> <span class="o">=</span> <span class="n">Rope</span><span class="p">{</span>
                <span class="n">history</span><span class="p">:</span> <span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
                <span class="n">positions</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">};</span><span class="mi">2</span><span class="p">],</span>
            <span class="p">};</span>

            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"R 1"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="o">*</span><span class="n">rope</span><span class="py">.positions</span><span class="nf">.first</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">});</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="o">*</span><span class="n">rope</span><span class="py">.positions</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">});</span>

            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"R 1"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="o">*</span><span class="n">rope</span><span class="py">.positions</span><span class="nf">.first</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">});</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="o">*</span><span class="n">rope</span><span class="py">.positions</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">});</span>

            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"R 1"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="o">*</span><span class="n">rope</span><span class="py">.positions</span><span class="nf">.first</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">});</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="o">*</span><span class="n">rope</span><span class="py">.positions</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">});</span>

            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"R 1"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="o">*</span><span class="n">rope</span><span class="py">.positions</span><span class="nf">.first</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">});</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="o">*</span><span class="n">rope</span><span class="py">.positions</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">});</span>

            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"U 1"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="o">*</span><span class="n">rope</span><span class="py">.positions</span><span class="nf">.first</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">4</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">1</span><span class="p">});</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="o">*</span><span class="n">rope</span><span class="py">.positions</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">});</span>

            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"U 1"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="o">*</span><span class="n">rope</span><span class="py">.positions</span><span class="nf">.first</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">4</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">2</span><span class="p">});</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="o">*</span><span class="n">rope</span><span class="py">.positions</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">1</span><span class="p">});</span>

        <span class="p">}</span>
        
        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_move_counter</span><span class="p">(){</span>

            <span class="k">let</span> <span class="k">mut</span> <span class="n">rope</span> <span class="o">=</span> <span class="n">Rope</span><span class="p">{</span>
                <span class="n">history</span><span class="p">:</span> <span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
                <span class="n">positions</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">};</span><span class="mi">2</span><span class="p">],</span>
            <span class="p">};</span>
            
            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"R 4"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"U 4"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"L 3"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"D 1"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"R 4"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"D 1"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"L 5"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>
            <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="nf">parse_steps</span><span class="p">(</span><span class="s">"R 2"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">());</span>

            <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">rope</span><span class="py">.history</span><span class="nf">.len</span><span class="p">(),</span><span class="mi">13</span><span class="p">);</span>

        <span class="p">}</span> 

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_head_is_not_touching</span><span class="p">(){</span>

            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Position</span><span class="p">::</span><span class="nf">head_is_not_touching_tail</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="n">y</span><span class="p">:</span><span class="mi">0</span><span class="p">},</span> <span class="o">&amp;</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="n">y</span><span class="p">:</span><span class="mi">0</span><span class="p">}),</span><span class="kc">false</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Position</span><span class="p">::</span><span class="nf">head_is_not_touching_tail</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span><span class="n">y</span><span class="p">:</span><span class="mi">0</span><span class="p">},</span> <span class="o">&amp;</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="n">y</span><span class="p">:</span><span class="mi">0</span><span class="p">}),</span><span class="kc">false</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Position</span><span class="p">::</span><span class="nf">head_is_not_touching_tail</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="n">y</span><span class="p">:</span><span class="mi">1</span><span class="p">},</span> <span class="o">&amp;</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="n">y</span><span class="p">:</span><span class="mi">0</span><span class="p">}),</span><span class="kc">false</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Position</span><span class="p">::</span><span class="nf">head_is_not_touching_tail</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span><span class="n">y</span><span class="p">:</span><span class="mi">1</span><span class="p">},</span> <span class="o">&amp;</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="n">y</span><span class="p">:</span><span class="mi">0</span><span class="p">}),</span><span class="kc">false</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Position</span><span class="p">::</span><span class="nf">head_is_not_touching_tail</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span><span class="n">y</span><span class="p">:</span><span class="mi">0</span><span class="p">},</span> <span class="o">&amp;</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="n">y</span><span class="p">:</span><span class="mi">0</span><span class="p">}),</span><span class="kc">true</span><span class="p">);</span>

        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_get_distance</span><span class="p">(){</span>

            <span class="k">let</span> <span class="k">mut</span> <span class="n">rope</span> <span class="o">=</span> <span class="n">Rope</span><span class="p">{</span>
                <span class="n">history</span><span class="p">:</span> <span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span>
                <span class="n">positions</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span><span class="p">};</span><span class="mi">2</span><span class="p">],</span>
            <span class="p">};</span>
        
            <span class="nd">include_str!</span><span class="p">(</span><span class="s">"../test_input.txt"</span><span class="p">)</span><span class="nf">.lines</span><span class="p">()</span>
                 <span class="nf">.map</span><span class="p">(</span><span class="n">parse_steps</span><span class="p">)</span>
                 <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">rope</span><span class="nf">.move_rope</span><span class="p">(</span><span class="n">x</span><span class="nf">.unwrap</span><span class="p">()))</span>
                 <span class="nf">.for_each</span><span class="p">(</span><span class="nb">drop</span><span class="p">);</span>
            
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">rope</span><span class="py">.history</span><span class="nf">.len</span><span class="p">(),</span> <span class="mi">13</span><span class="p">);</span>
        
        <span class="p">}</span>
    <span class="p">}</span>



    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 70/100 - aoc 2022 day8</title><link href="https://maebli.github.io/archive/2022-12-08-100rust-70/" rel="alternate" type="text/html" title="Rust challenge 70/100 - aoc 2022 day8" /><published>2022-12-08T14:05:00+00:00</published><updated>2022-12-08T14:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-70</id><content type="html" xml:base="https://maebli.github.io/archive/2022-12-08-100rust-70/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#70th-challenge">70th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="70th-challenge">70th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Solve today’s AOC challange.🎅🦀</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Here’s my solution, today was hard.. the Idea was easy, but implemnting it was hard.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">     <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

        <span class="k">let</span> <span class="n">res1</span> <span class="o">=</span> <span class="nn">Map2D</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">))</span><span class="nf">.count_visible_trees</span><span class="p">();</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"Result 1: {}"</span><span class="p">,</span> <span class="n">res1</span><span class="p">);</span>
        
        <span class="k">let</span> <span class="n">res2</span> <span class="o">=</span> <span class="nn">Map2D</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">))</span><span class="nf">.max_scenic_score</span><span class="p">();</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"Result 2: {}"</span><span class="p">,</span> <span class="n">res2</span><span class="p">);</span>
    <span class="p">}</span>


    <span class="k">struct</span> <span class="n">Map2D</span> <span class="p">{</span>
        <span class="n">data</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;&gt;</span><span class="p">,</span>
    <span class="p">}</span>

    <span class="k">impl</span> <span class="n">Map2D</span> <span class="p">{</span>

       <span class="k">fn</span> <span class="nf">from</span><span class="p">(</span><span class="n">input</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="k">Self</span> <span class="p">{</span>
           <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span>
                                       <span class="nf">.map</span><span class="p">(|</span><span class="n">line</span><span class="p">|</span> <span class="n">line</span><span class="nf">.trim</span><span class="p">()</span>
                                                             <span class="nf">.chars</span><span class="p">()</span>
                                                             <span class="nf">.map</span><span class="p">(|</span><span class="n">c</span><span class="p">|</span> <span class="n">c</span><span class="nf">.to_digit</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
                                                             <span class="nf">.unwrap</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">)</span>
                                                             <span class="nf">.collect</span><span class="p">())</span>
                                       <span class="nf">.collect</span><span class="p">();</span>
           <span class="k">Self</span> <span class="p">{</span> <span class="n">data</span><span class="p">:</span> <span class="n">x</span> <span class="p">}</span>
       <span class="p">}</span>

       <span class="k">fn</span> <span class="nf">is_visible</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">x</span><span class="p">:</span> <span class="nb">usize</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="nb">usize</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
           
           <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">||</span> <span class="n">y</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">||</span> <span class="n">x</span> <span class="o">==</span> <span class="k">self</span><span class="py">.data</span><span class="nf">.len</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">||</span> <span class="n">y</span> <span class="o">==</span> <span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="nf">.len</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">{</span>
               <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
           <span class="p">}</span>
           <span class="k">let</span> <span class="n">l</span><span class="o">=*</span><span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="o">..</span><span class="n">y</span><span class="p">]</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.max</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="o">&lt;</span> <span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">];</span>
           <span class="k">let</span> <span class="n">r</span><span class="o">=*</span><span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="o">+</span><span class="mi">1</span><span class="o">..</span><span class="p">]</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.max</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="o">&lt;</span> <span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">];</span>
           <span class="k">let</span> <span class="n">t</span><span class="o">=</span><span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="o">..</span><span class="n">x</span><span class="p">]</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">v</span><span class="p">|</span> <span class="n">v</span><span class="p">[</span><span class="n">y</span><span class="p">])</span><span class="nf">.max</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="o">&lt;</span> <span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">];</span>
           <span class="k">let</span> <span class="n">b</span><span class="o">=</span><span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="o">..</span><span class="p">]</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">v</span><span class="p">|</span> <span class="n">v</span><span class="p">[</span><span class="n">y</span><span class="p">])</span><span class="nf">.max</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="o">&lt;</span> <span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">];</span>
           <span class="n">l</span><span class="p">||</span><span class="n">r</span><span class="p">||</span><span class="n">t</span><span class="p">||</span><span class="n">b</span>
       <span class="p">}</span>

       <span class="k">fn</span> <span class="nf">scenic_score</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">x</span><span class="p">:</span> <span class="nb">usize</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="nb">usize</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span> <span class="p">{</span>
            
            <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">||</span> <span class="n">y</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">||</span> <span class="n">x</span> <span class="o">==</span> <span class="k">self</span><span class="py">.data</span><span class="nf">.len</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">||</span> <span class="n">y</span> <span class="o">==</span> <span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="nf">.len</span><span class="p">()</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="p">;</span>
            <span class="p">}</span>

            <span class="k">let</span> <span class="n">len</span><span class="o">=</span> <span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="nf">.len</span><span class="p">();</span>
            <span class="k">let</span> <span class="n">l</span><span class="p">:</span><span class="nb">u64</span> <span class="o">=</span> <span class="mi">1</span><span class="o">+</span><span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">1</span><span class="o">..</span><span class="n">y</span><span class="p">]</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.rev</span><span class="p">()</span><span class="nf">.map_while</span><span class="p">(|</span><span class="o">&amp;</span><span class="n">v</span><span class="p">|</span> <span class="k">if</span> <span class="n">v</span> <span class="o">&lt;</span> <span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="p">{</span> <span class="nf">Some</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="nb">None</span> <span class="p">})</span><span class="nf">.count</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">;</span>
            <span class="k">let</span> <span class="n">r</span><span class="p">:</span><span class="nb">u64</span> <span class="o">=</span> <span class="mi">1</span><span class="o">+</span><span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="o">+</span><span class="mi">1</span><span class="o">..</span><span class="n">len</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.map_while</span><span class="p">(|</span><span class="o">&amp;</span><span class="n">v</span><span class="p">|</span> <span class="k">if</span> <span class="n">v</span> <span class="o">&lt;</span> <span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="p">{</span> <span class="nf">Some</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="nb">None</span> <span class="p">})</span><span class="nf">.count</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">;</span>
            <span class="k">let</span> <span class="n">t</span><span class="p">:</span><span class="nb">u64</span> <span class="o">=</span> <span class="mi">1</span><span class="o">+</span><span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="n">x</span><span class="p">]</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.rev</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">v</span><span class="p">|</span> <span class="n">v</span><span class="p">[</span><span class="n">y</span><span class="p">])</span><span class="nf">.map_while</span><span class="p">(|</span><span class="n">v</span><span class="p">|</span> <span class="k">if</span> <span class="n">v</span> <span class="o">&lt;</span> <span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="p">{</span> <span class="nf">Some</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="nb">None</span> <span class="p">})</span><span class="nf">.count</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">;</span>
            <span class="k">let</span> <span class="n">b</span><span class="p">:</span><span class="nb">u64</span> <span class="o">=</span> <span class="mi">1</span><span class="o">+</span><span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="o">..</span><span class="n">len</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">v</span><span class="p">|</span> <span class="n">v</span><span class="p">[</span><span class="n">y</span><span class="p">])</span><span class="nf">.map_while</span><span class="p">(|</span><span class="n">v</span><span class="p">|</span> <span class="k">if</span> <span class="n">v</span> <span class="o">&lt;</span> <span class="k">self</span><span class="py">.data</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="p">{</span> <span class="nf">Some</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="nb">None</span> <span class="p">})</span><span class="nf">.count</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">;</span>
            <span class="n">l</span><span class="o">*</span><span class="n">r</span><span class="o">*</span><span class="n">t</span><span class="o">*</span><span class="n">b</span>
       <span class="p">}</span>
     
       <span class="k">fn</span> <span class="nf">count_visible_trees</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">usize</span> <span class="p">{</span>
           <span class="k">self</span><span class="py">.data</span><span class="nf">.iter</span><span class="p">()</span>
                    <span class="nf">.enumerate</span><span class="p">()</span>
                    <span class="nf">.map</span><span class="p">(|(</span><span class="n">x</span><span class="p">,</span> <span class="n">row</span><span class="p">)|</span> <span class="n">row</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.enumerate</span><span class="p">()</span>
                    <span class="nf">.filter</span><span class="p">(|(</span><span class="n">y</span><span class="p">,</span> <span class="n">_</span><span class="p">)|</span> <span class="k">self</span><span class="nf">.is_visible</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="o">*</span><span class="n">y</span><span class="p">))</span>
                    <span class="nf">.count</span><span class="p">())</span>
                    <span class="nf">.sum</span><span class="p">()</span>
       <span class="p">}</span>

       <span class="k">fn</span> <span class="nf">max_scenic_score</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span> <span class="p">{</span>
           <span class="k">self</span><span class="py">.data</span><span class="nf">.iter</span><span class="p">()</span>
                    <span class="nf">.enumerate</span><span class="p">()</span>
                    <span class="nf">.map</span><span class="p">(|(</span><span class="n">x</span><span class="p">,</span> <span class="n">row</span><span class="p">)|</span> <span class="n">row</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.enumerate</span><span class="p">()</span>
                    <span class="nf">.map</span><span class="p">(|(</span><span class="n">y</span><span class="p">,</span> <span class="n">_</span><span class="p">)|</span> <span class="k">self</span><span class="nf">.scenic_score</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">))</span>
                    <span class="nf">.max</span><span class="p">()</span>
                    <span class="nf">.unwrap</span><span class="p">())</span>
                    <span class="nf">.max</span><span class="p">()</span>
                    <span class="nf">.unwrap</span><span class="p">()</span>
        <span class="p">}</span>

     
    <span class="p">}</span>

    <span class="nd">#[cfg(test)]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>

        <span class="k">use</span> <span class="k">crate</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

        <span class="k">const</span> <span class="n">TEST_INPUT</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> 
       <span class="s">"30373
        25512
        65332
        33549
        35390"</span><span class="p">;</span>


        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_genrate_map</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">map</span> <span class="o">=</span> <span class="nn">Map2D</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">TEST_INPUT</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">map</span><span class="py">.data</span><span class="nf">.len</span><span class="p">(),</span> <span class="mi">5</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">map</span><span class="py">.data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="nf">.len</span><span class="p">(),</span> <span class="mi">5</span><span class="p">);</span>
            <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">map</span><span class="py">.data</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_height_map</span><span class="p">()</span> <span class="p">{</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Map2D</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">TEST_INPUT</span><span class="p">)</span><span class="nf">.count_visible_trees</span><span class="p">(),</span> <span class="mi">21</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_is_visible</span><span class="p">(){</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Map2D</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">TEST_INPUT</span><span class="p">)</span><span class="nf">.is_visible</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="kc">true</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Map2D</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">TEST_INPUT</span><span class="p">)</span><span class="nf">.is_visible</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="kc">true</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Map2D</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">TEST_INPUT</span><span class="p">)</span><span class="nf">.is_visible</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="kc">true</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Map2D</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">TEST_INPUT</span><span class="p">)</span><span class="nf">.is_visible</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="kc">true</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Map2D</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">TEST_INPUT</span><span class="p">)</span><span class="nf">.is_visible</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="kc">false</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_scenic_scores</span><span class="p">(){</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Map2D</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">TEST_INPUT</span><span class="p">)</span><span class="nf">.scenic_score</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span><span class="mi">4</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Map2D</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">TEST_INPUT</span><span class="p">)</span><span class="nf">.scenic_score</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">8</span><span class="p">);</span>
        <span class="p">}</span>

    <span class="p">}</span>
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 69/100 - aoc 2022 day7</title><link href="https://maebli.github.io/archive/2022-12-07-100rust-69/" rel="alternate" type="text/html" title="Rust challenge 69/100 - aoc 2022 day7" /><published>2022-12-07T14:05:00+00:00</published><updated>2022-12-07T14:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-69</id><content type="html" xml:base="https://maebli.github.io/archive/2022-12-07-100rust-69/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#69th-challenge">69th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="69th-challenge">69th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Solve today’s AOC challange.🎅🦀</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Here’s my solution, today was hard.. the Idea was easy, but implemnting it was hard.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">     <span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashMap</span><span class="p">;</span>

    <span class="k">const</span> <span class="n">TOTAL_DISK_SPACE</span><span class="p">:</span> <span class="nb">u64</span> <span class="o">=</span> <span class="mi">70000000</span><span class="p">;</span>
    <span class="k">const</span> <span class="n">MINIMUM_FREE_SPACE</span><span class="p">:</span> <span class="nb">u64</span> <span class="o">=</span> <span class="mi">30000000</span><span class="p">;</span>

    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

        <span class="k">let</span> <span class="n">directories</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">)</span><span class="nf">.split_terminator</span><span class="p">(</span><span class="s">"$"</span><span class="p">)</span>
                                    <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="n">x</span><span class="nf">.len</span><span class="p">()</span><span class="o">&gt;</span><span class="mi">0</span><span class="p">)</span>
                                    <span class="nf">.map</span><span class="p">(</span><span class="nn">Command</span><span class="p">::</span><span class="n">parse</span><span class="p">)</span>
                                    <span class="nf">.fold</span><span class="p">((</span><span class="nd">vec!</span><span class="p">[],</span><span class="nn">HashMap</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">String</span><span class="p">,</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;&gt;</span><span class="p">::</span><span class="nf">new</span><span class="p">()),|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">,</span><span class="n">curr</span><span class="p">|</span> <span class="p">{</span>
                                            <span class="k">match</span> <span class="n">curr</span><span class="p">{</span>
                                                <span class="nn">Command</span><span class="p">::</span><span class="nf">CdUp</span><span class="p">()</span> <span class="k">=&gt;</span> <span class="p">{</span><span class="n">acc</span><span class="na">.0</span><span class="nf">.pop</span><span class="p">();},</span>
                                                <span class="nn">Command</span><span class="p">::</span><span class="nf">Cd</span><span class="p">(</span><span class="n">_</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span><span class="n">acc</span><span class="na">.0</span><span class="nf">.push</span><span class="p">(</span><span class="n">curr</span><span class="nf">.name</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.trim</span><span class="p">()</span><span class="nf">.to_string</span><span class="p">());},</span>
                                                <span class="nn">Command</span><span class="p">::</span><span class="nf">Ls</span><span class="p">(</span><span class="n">children</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
                                                    <span class="n">children</span><span class="nf">.into_iter</span><span class="p">()</span>
                                                            <span class="nf">.for_each</span><span class="p">(|</span><span class="k">mut</span> <span class="n">node</span><span class="p">|</span> <span class="p">{</span>
                                                                <span class="k">let</span> <span class="n">child_path</span><span class="o">=</span> <span class="p">[</span><span class="n">acc</span><span class="na">.0</span><span class="nf">.join</span><span class="p">(</span><span class="s">"/"</span><span class="p">),</span><span class="n">node</span><span class="py">.name</span><span class="p">]</span><span class="nf">.join</span><span class="p">(</span><span class="s">"/"</span><span class="p">);</span>
                                                                <span class="k">let</span> <span class="n">parent_path</span><span class="o">=</span> <span class="n">acc</span><span class="na">.0</span><span class="nf">.join</span><span class="p">(</span><span class="s">"/"</span><span class="p">);</span>
                                                                <span class="n">node</span><span class="py">.name</span> <span class="o">=</span> <span class="n">child_path</span><span class="p">;</span>
                                                                <span class="n">acc</span><span class="na">.1</span><span class="nf">.entry</span><span class="p">(</span><span class="n">parent_path</span><span class="p">)</span><span class="nf">.or_insert</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[])</span><span class="nf">.push</span><span class="p">(</span><span class="n">node</span><span class="p">);</span>
                                                    <span class="p">});</span>
                                                <span class="p">}</span>
                                            <span class="p">};</span>
                                            <span class="n">acc</span>
                                    <span class="p">})</span><span class="na">.1</span><span class="p">;</span>
        <span class="k">let</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">directories</span><span class="nf">.iter</span><span class="p">()</span>
                    <span class="nf">.map</span><span class="p">(|(</span><span class="n">k</span><span class="p">,</span><span class="n">_v</span><span class="p">)|</span> <span class="p">{</span>
                        <span class="nf">size_of_node_in_tree</span><span class="p">(</span><span class="nn">String</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">k</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">directories</span><span class="p">)</span>
                    <span class="p">})</span><span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="o">*</span><span class="n">x</span><span class="o">&lt;</span><span class="mi">100000</span><span class="p">)</span><span class="py">.sum</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">();</span>

        <span class="nd">println!</span><span class="p">(</span><span class="s">"Sum of all files below size 10000: {}"</span><span class="p">,</span> <span class="n">sum</span><span class="p">);</span>


        <span class="k">let</span> <span class="n">used_disk_space</span> <span class="o">=</span> <span class="nf">size_of_node_in_tree</span><span class="p">(</span><span class="s">"/"</span><span class="nf">.to_string</span><span class="p">(),</span> <span class="o">&amp;</span><span class="n">directories</span><span class="p">);</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"Used disk space: {}"</span><span class="p">,</span> <span class="n">used_disk_space</span><span class="p">);</span>

        <span class="k">let</span> <span class="n">unused_disk_space</span> <span class="o">=</span> <span class="n">TOTAL_DISK_SPACE</span> <span class="o">-</span> <span class="n">used_disk_space</span><span class="p">;</span>
        <span class="k">let</span> <span class="n">required_additonal_space</span> <span class="o">=</span> <span class="n">MINIMUM_FREE_SPACE</span><span class="o">-</span><span class="n">unused_disk_space</span><span class="p">;</span>
                                             

        <span class="nd">println!</span><span class="p">(</span><span class="s">"Unused disk space: {}"</span><span class="p">,</span> <span class="n">unused_disk_space</span><span class="p">);</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"Additional required space: {}"</span><span class="p">,</span><span class="n">required_additonal_space</span><span class="p">);</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">sum</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">directories</span><span class="nf">.iter</span><span class="p">()</span>
                    <span class="nf">.map</span><span class="p">(|(</span><span class="n">k</span><span class="p">,</span><span class="n">_v</span><span class="p">)|</span> <span class="p">{</span>
                        <span class="nf">size_of_node_in_tree</span><span class="p">(</span><span class="nn">String</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">k</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">directories</span><span class="p">)</span>
                    <span class="p">})</span>
                    <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="o">*</span><span class="n">x</span><span class="o">&gt;</span><span class="n">required_additonal_space</span><span class="p">)</span><span class="nf">.collect</span><span class="p">();</span>
        <span class="n">sum</span><span class="nf">.sort</span><span class="p">();</span>
        
        <span class="nd">println!</span><span class="p">(</span><span class="s">"File to delete: {}"</span><span class="p">,</span> <span class="n">sum</span><span class="nf">.first</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">());</span>



    <span class="p">}</span>

    <span class="nd">#[derive(PartialEq,Debug)]</span>
    <span class="k">struct</span> <span class="n">Node</span> <span class="p">{</span>
        <span class="n">name</span><span class="p">:</span> <span class="nb">String</span><span class="p">,</span>
        <span class="n">size</span><span class="p">:</span> <span class="nb">u64</span><span class="p">,</span>
    <span class="p">}</span>

    <span class="nd">#[derive(PartialEq,Debug)]</span>
    <span class="k">struct</span> <span class="n">Response</span> <span class="p">{</span>
        <span class="n">value</span><span class="p">:</span> <span class="nb">String</span><span class="p">,</span>
    <span class="p">}</span>

    <span class="nd">#[derive(PartialEq,Debug)]</span>
    <span class="k">enum</span> <span class="n">Command</span><span class="p">{</span>
        <span class="nf">CdUp</span><span class="p">(),</span>
        <span class="nf">Cd</span><span class="p">(</span><span class="n">Node</span><span class="p">),</span>
        <span class="nf">Ls</span><span class="p">(</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="p">)</span>
    <span class="p">}</span>


    <span class="k">fn</span> <span class="nf">size_of_node_in_tree</span><span class="p">(</span><span class="n">file_name</span><span class="p">:</span> <span class="nb">String</span><span class="p">,</span> <span class="n">directory_tree</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">HashMap</span><span class="o">&lt;</span><span class="nb">String</span><span class="p">,</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">size</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">if</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span> <span class="o">=</span> <span class="n">directory_tree</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="n">file_name</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">for</span> <span class="n">node</span> <span class="k">in</span> <span class="n">nodes</span> <span class="p">{</span>
                <span class="k">if</span> <span class="n">node</span><span class="py">.size</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
                    <span class="n">size</span> <span class="o">+=</span> <span class="nf">size_of_node_in_tree</span><span class="p">(</span><span class="n">node</span><span class="py">.name</span><span class="nf">.to_string</span><span class="p">(),</span> <span class="n">directory_tree</span><span class="p">);</span>
                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                    <span class="n">size</span> <span class="o">+=</span> <span class="n">node</span><span class="py">.size</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="n">size</span>
    <span class="p">}</span>


    <span class="k">impl</span> <span class="n">Command</span> <span class="p">{</span>
        <span class="k">fn</span> <span class="nf">parse</span><span class="p">(</span><span class="n">input</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Command</span> <span class="p">{</span>

            <span class="k">match</span> <span class="n">input</span><span class="p">[</span><span class="mi">0</span><span class="o">..</span><span class="mi">3</span><span class="p">]</span><span class="nf">.to_owned</span><span class="p">()</span><span class="nf">.as_str</span><span class="p">()</span> <span class="p">{</span>
                <span class="s">" cd"</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="k">if</span> <span class="n">input</span><span class="nf">.len</span><span class="p">()</span><span class="o">&gt;</span><span class="mi">5</span> <span class="o">&amp;&amp;</span> <span class="n">input</span><span class="p">[</span><span class="mi">4</span><span class="o">..</span><span class="mi">6</span><span class="p">]</span><span class="nf">.eq</span><span class="p">(</span><span class="s">".."</span><span class="p">)</span> <span class="p">{</span>
                        <span class="nn">Command</span><span class="p">::</span><span class="nf">CdUp</span><span class="p">()</span>
                    <span class="p">}</span><span class="k">else</span> <span class="p">{</span>
                        <span class="nn">Command</span><span class="p">::</span><span class="nf">Cd</span><span class="p">(</span><span class="n">Node</span><span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="n">input</span><span class="p">[</span><span class="mi">4</span><span class="o">..</span><span class="p">]</span><span class="nf">.trim</span><span class="p">()</span><span class="nf">.to_string</span><span class="p">(),</span> <span class="n">size</span><span class="p">:</span> <span class="mi">0</span><span class="p">})</span>
                    <span class="p">}</span>
                <span class="p">},</span>
                <span class="s">" ls"</span> <span class="k">=&gt;</span> <span class="nn">Command</span><span class="p">::</span><span class="nf">Ls</span><span class="p">({</span>
                    <span class="n">input</span><span class="nf">.lines</span><span class="p">()</span><span class="nf">.skip</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="nf">.fold</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[],</span> <span class="p">|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">,</span> <span class="n">line</span><span class="p">|</span> <span class="p">{</span>
                        <span class="k">let</span> <span class="k">mut</span> <span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="nf">.split_whitespace</span><span class="p">();</span>
                        <span class="k">let</span> <span class="k">mut</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
                        <span class="k">if</span> <span class="k">let</span> <span class="nf">Ok</span><span class="p">(</span><span class="n">number</span><span class="p">)</span><span class="o">=</span><span class="n">line</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">(){</span>
                            <span class="n">n</span> <span class="o">=</span> <span class="n">number</span><span class="p">;</span>
                        <span class="p">}</span>
                        <span class="n">acc</span><span class="nf">.push</span><span class="p">(</span><span class="n">Node</span><span class="p">{</span>
                            <span class="n">name</span><span class="p">:</span> <span class="n">line</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.to_string</span><span class="p">(),</span> 
                            <span class="n">size</span><span class="p">:</span> <span class="n">n</span>
                        <span class="p">});</span>
                        <span class="n">acc</span>
                    <span class="p">})</span>
                <span class="p">}),</span>
                <span class="n">_</span> <span class="k">=&gt;</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"Unknown command '{}'"</span><span class="p">,</span> <span class="n">input</span><span class="p">[</span><span class="mi">0</span><span class="o">..</span><span class="mi">3</span><span class="p">]</span><span class="nf">.to_owned</span><span class="p">()</span><span class="nf">.as_str</span><span class="p">()),</span>
            <span class="p">}</span>
        <span class="p">}</span>

        <span class="k">fn</span> <span class="nf">name</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Option</span><span class="o">&lt;</span><span class="nb">String</span><span class="o">&gt;</span> <span class="p">{</span>
            <span class="k">match</span> <span class="k">self</span> <span class="p">{</span>
                <span class="nn">Command</span><span class="p">::</span><span class="nf">CdUp</span><span class="p">()</span> <span class="k">=&gt;</span> <span class="nb">None</span><span class="p">,</span>
                <span class="nn">Command</span><span class="p">::</span><span class="nf">Cd</span><span class="p">(</span><span class="n">node</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nf">Some</span><span class="p">(</span><span class="n">node</span><span class="py">.name</span><span class="nf">.to_string</span><span class="p">()),</span>
                <span class="nn">Command</span><span class="p">::</span><span class="nf">Ls</span><span class="p">(</span><span class="n">_</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nb">None</span><span class="p">,</span>
            <span class="p">}</span>
            
        <span class="p">}</span>
    <span class="p">}</span>



    <span class="nd">#[cfg(test)]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>
        <span class="k">use</span> <span class="k">super</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

        <span class="k">const</span> <span class="n">LS_INPUT</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">" ls
            dir a
            14848514 b.txt
            8504156 c.dat
            dir d"</span><span class="p">;</span>
        
        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">it_works</span><span class="p">()</span> <span class="p">{</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Command</span><span class="p">::</span><span class="nf">CdUp</span><span class="p">(),</span> <span class="nn">Command</span><span class="p">::</span><span class="nf">parse</span><span class="p">(</span><span class="s">" cd .."</span><span class="p">));</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Command</span><span class="p">::</span><span class="nf">Cd</span><span class="p">(</span><span class="n">Node</span><span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="s">"/"</span><span class="nf">.to_string</span><span class="p">(),</span> <span class="n">size</span><span class="p">:</span> <span class="mi">0</span> <span class="p">}),</span> <span class="nn">Command</span><span class="p">::</span><span class="nf">parse</span><span class="p">(</span><span class="s">" cd /"</span><span class="p">));</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Command</span><span class="p">::</span><span class="nf">Cd</span><span class="p">(</span><span class="n">Node</span><span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="s">"abc"</span><span class="nf">.to_string</span><span class="p">(),</span> <span class="n">size</span><span class="p">:</span> <span class="mi">0</span> <span class="p">}),</span> <span class="nn">Command</span><span class="p">::</span><span class="nf">parse</span><span class="p">(</span><span class="s">" cd abc"</span><span class="p">));</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nn">Command</span><span class="p">::</span><span class="nf">Ls</span><span class="p">(</span>
                    <span class="nd">vec!</span><span class="p">[</span>
                        <span class="n">Node</span> <span class="p">{</span> 
                            <span class="n">name</span><span class="p">:</span> <span class="s">"a"</span><span class="nf">.to_string</span><span class="p">(),</span> 
                            <span class="n">size</span><span class="p">:</span> <span class="mi">0</span> <span class="p">},</span> 
                        <span class="n">Node</span> <span class="p">{</span>
                             <span class="n">name</span><span class="p">:</span> <span class="s">"b.txt"</span><span class="nf">.to_string</span><span class="p">(),</span> 
                             <span class="n">size</span><span class="p">:</span> <span class="mi">14848514</span> <span class="p">},</span>
                        <span class="n">Node</span> <span class="p">{</span> 
                            <span class="n">name</span><span class="p">:</span> <span class="s">"c.dat"</span><span class="nf">.to_string</span><span class="p">(),</span>  
                            <span class="n">size</span><span class="p">:</span> <span class="mi">8504156</span> 
                        <span class="p">},</span> 
                        <span class="n">Node</span> <span class="p">{</span>
                            <span class="n">name</span><span class="p">:</span> <span class="s">"d"</span><span class="nf">.to_string</span><span class="p">(),</span> 
                            <span class="n">size</span><span class="p">:</span> <span class="mi">0</span> 
                        <span class="p">}]</span>
                    <span class="p">),</span> <span class="nn">Command</span><span class="p">::</span><span class="nf">parse</span><span class="p">(</span><span class="n">LS_INPUT</span><span class="p">));</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_size_of_node_in_tree</span><span class="p">()</span> <span class="p">{</span>
           <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span><span class="o">=</span> <span class="nn">HashMap</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
           <span class="n">x</span><span class="nf">.insert</span><span class="p">(</span><span class="s">"x"</span><span class="nf">.to_string</span><span class="p">(),</span><span class="nd">vec!</span><span class="p">[</span>
                <span class="n">Node</span> <span class="p">{</span> 
                    <span class="n">name</span><span class="p">:</span> <span class="s">"a"</span><span class="nf">.to_string</span><span class="p">(),</span> 
                    <span class="n">size</span><span class="p">:</span> <span class="mi">0</span> <span class="p">},</span> 
                <span class="n">Node</span> <span class="p">{</span>
                     <span class="n">name</span><span class="p">:</span> <span class="s">"b.txt"</span><span class="nf">.to_string</span><span class="p">(),</span> 
                     <span class="n">size</span><span class="p">:</span> <span class="mi">14848514</span> <span class="p">},</span>
                <span class="n">Node</span> <span class="p">{</span> 
                    <span class="n">name</span><span class="p">:</span> <span class="s">"c.dat"</span><span class="nf">.to_string</span><span class="p">(),</span>  
                    <span class="n">size</span><span class="p">:</span> <span class="mi">8504156</span> 
                <span class="p">},</span> 
                <span class="n">Node</span> <span class="p">{</span>
                    <span class="n">name</span><span class="p">:</span> <span class="s">"d"</span><span class="nf">.to_string</span><span class="p">(),</span> 
                    <span class="n">size</span><span class="p">:</span> <span class="mi">0</span> 
                <span class="p">}</span>
            <span class="p">]);</span>
            <span class="n">x</span><span class="nf">.insert</span><span class="p">(</span><span class="s">"a"</span><span class="nf">.to_string</span><span class="p">(),</span> <span class="nd">vec!</span><span class="p">[</span>
                <span class="n">Node</span> <span class="p">{</span> 
                    <span class="n">name</span><span class="p">:</span> <span class="s">"c.dat"</span><span class="nf">.to_string</span><span class="p">(),</span>  
                    <span class="n">size</span><span class="p">:</span> <span class="mi">8504156</span> 
                <span class="p">}</span>
            <span class="p">]);</span>
            <span class="n">x</span><span class="nf">.insert</span><span class="p">(</span><span class="s">"d"</span><span class="nf">.to_string</span><span class="p">(),</span> <span class="nd">vec!</span><span class="p">[</span>
                <span class="n">Node</span> <span class="p">{</span> 
                    <span class="n">name</span><span class="p">:</span> <span class="s">"c.dat"</span><span class="nf">.to_string</span><span class="p">(),</span>  
                    <span class="n">size</span><span class="p">:</span> <span class="mi">8504156</span> 
                <span class="p">}</span>
            <span class="p">]);</span>

            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">size_of_node_in_tree</span><span class="p">(</span><span class="s">"x"</span><span class="nf">.to_string</span><span class="p">(),</span><span class="o">&amp;</span><span class="n">x</span><span class="p">),</span> <span class="mi">8504156</span> <span class="o">+</span> <span class="mi">14848514</span> <span class="o">+</span> <span class="mi">8504156</span> <span class="o">+</span> <span class="mi">8504156</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">size_of_node_in_tree</span><span class="p">(</span><span class="s">"a"</span><span class="nf">.to_string</span><span class="p">(),</span><span class="o">&amp;</span><span class="n">x</span><span class="p">),</span> <span class="mi">8504156</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">size_of_node_in_tree</span><span class="p">(</span><span class="s">"d"</span><span class="nf">.to_string</span><span class="p">(),</span><span class="o">&amp;</span><span class="n">x</span><span class="p">),</span> <span class="mi">8504156</span><span class="p">);</span>

        <span class="p">}</span>
    <span class="p">}</span>
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 68/100 - aoc 2022 day6</title><link href="https://maebli.github.io/archive/2022-12-06-100rust-68/" rel="alternate" type="text/html" title="Rust challenge 68/100 - aoc 2022 day6" /><published>2022-12-06T14:05:00+00:00</published><updated>2022-12-06T14:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-68</id><content type="html" xml:base="https://maebli.github.io/archive/2022-12-06-100rust-68/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#68th-challenge">68th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="68th-challenge">68th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Solve today’s AOC challange.🎅🦀</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Here’s my solution, today was really easy in my opinion :)</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">     <span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashSet</span><span class="p">;</span>

    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
       <span class="k">let</span> <span class="n">ans1</span> <span class="o">=</span> <span class="nf">get_signal_start_offset</span><span class="p">(</span><span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">),</span><span class="mi">4</span><span class="p">);</span>
       <span class="nd">println!</span><span class="p">(</span><span class="s">"answer 1: {}"</span><span class="p">,</span> <span class="n">ans1</span><span class="p">);</span>
       <span class="k">let</span> <span class="n">ans1</span> <span class="o">=</span> <span class="nf">get_signal_start_offset</span><span class="p">(</span><span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">),</span><span class="mi">14</span><span class="p">);</span>
       <span class="nd">println!</span><span class="p">(</span><span class="s">"answer 1: {}"</span><span class="p">,</span> <span class="n">ans1</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">get_signal_start_offset</span><span class="p">(</span><span class="n">signal</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">,</span><span class="n">length</span><span class="p">:</span><span class="nb">usize</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">usize</span> <span class="p">{</span>
        <span class="n">signal</span><span class="nf">.as_bytes</span><span class="p">()</span>
              <span class="nf">.windows</span><span class="p">(</span><span class="n">length</span><span class="p">)</span>
              <span class="nf">.enumerate</span><span class="p">()</span>
              <span class="nf">.filter</span><span class="p">(|</span><span class="n">w</span><span class="p">|</span> <span class="p">{</span>
                    <span class="n">w</span><span class="na">.1</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span> <span class="p">|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">,</span> <span class="n">c</span><span class="p">|</span> <span class="p">{</span>
                        <span class="n">acc</span><span class="nf">.insert</span><span class="p">(</span><span class="o">*</span><span class="n">c</span><span class="p">);</span>
                        <span class="n">acc</span>
                    <span class="p">})</span><span class="nf">.len</span><span class="p">()</span> <span class="o">==</span> <span class="n">length</span>
                <span class="p">}</span>
            <span class="p">)</span><span class="nf">.next</span><span class="p">()</span>
            <span class="nf">.unwrap</span><span class="p">()</span>
            <span class="na">.0</span><span class="o">+</span><span class="n">length</span>
    <span class="p">}</span>

    <span class="cm">/* create tests */</span>
    <span class="nd">#[cfg(test)]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>
        <span class="k">use</span> <span class="k">super</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test1</span><span class="p">()</span> <span class="p">{</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">get_signal_start_offset</span><span class="p">(</span><span class="s">"bvwbjplbgvbhsrlpgdmjqwftvncz"</span><span class="p">,</span><span class="mi">4</span><span class="p">),</span> <span class="mi">5</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">get_signal_start_offset</span><span class="p">(</span><span class="s">"nppdvjthqldpwncqszvftbrmjlhg"</span><span class="p">,</span><span class="mi">4</span><span class="p">),</span> <span class="mi">6</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">get_signal_start_offset</span><span class="p">(</span><span class="s">"nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg"</span><span class="p">,</span><span class="mi">4</span><span class="p">),</span> <span class="mi">10</span><span class="p">);</span>
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">get_signal_start_offset</span><span class="p">(</span><span class="s">"zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw"</span><span class="p">,</span><span class="mi">4</span><span class="p">),</span> <span class="mi">11</span><span class="p">);</span> 
            <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">get_signal_start_offset</span><span class="p">(</span><span class="s">"mjqjpqmgbljsphdztnvjfqwrcgsmlb"</span><span class="p">,</span><span class="mi">14</span><span class="p">),</span> <span class="mi">19</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 67/100 - aoc 2022 day5</title><link href="https://maebli.github.io/archive/2022-12-05-100rust-67/" rel="alternate" type="text/html" title="Rust challenge 67/100 - aoc 2022 day5" /><published>2022-12-05T14:05:00+00:00</published><updated>2022-12-05T14:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-67</id><content type="html" xml:base="https://maebli.github.io/archive/2022-12-05-100rust-67/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#67th-challenge">67th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="67th-challenge">67th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Solve today’s AOC challange.🎅🦀</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Here’s my solution, today was really easy in my opinion :)</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">      <span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashMap</span><span class="p">;</span>

    <span class="k">use</span> <span class="nn">itertools</span><span class="p">::</span><span class="n">Itertools</span><span class="p">;</span>

    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="nn">HashMap</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">)</span><span class="nf">.lines</span><span class="p">()</span>
            <span class="nf">.fold</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="n">x</span><span class="p">,</span> <span class="p">|</span> <span class="n">acc</span><span class="p">,</span> <span class="n">line</span><span class="p">|</span> <span class="p">{</span>
                <span class="k">match</span> <span class="n">line</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.nth</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
                    <span class="nf">Some</span><span class="p">(</span><span class="sc">'m'</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nf">move_crates</span><span class="p">(</span><span class="n">acc</span><span class="p">,</span> <span class="n">line</span><span class="p">),</span>
                    <span class="n">_</span> <span class="k">=&gt;</span> <span class="nf">init_crates</span><span class="p">(</span><span class="n">acc</span><span class="p">,</span> <span class="n">line</span><span class="p">),</span>
                <span class="p">};</span>
                <span class="n">acc</span>
            <span class="p">});</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">res</span> <span class="o">=</span> <span class="nn">String</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
        <span class="k">for</span> <span class="n">k</span> <span class="k">in</span> <span class="mi">1</span><span class="o">..</span><span class="n">x</span><span class="nf">.len</span><span class="p">()</span><span class="o">+</span><span class="mi">1</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">v</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.get</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">k</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">))</span><span class="nf">.unwrap</span><span class="p">();</span>
            <span class="n">res</span><span class="nf">.push</span><span class="p">(</span><span class="o">*</span><span class="n">v</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">());</span>
        <span class="p">}</span>

        <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">res</span><span class="p">);</span>
        
    <span class="p">}</span>

    <span class="k">fn</span> <span class="n">init_crates</span><span class="o">&lt;</span><span class="nv">'a</span><span class="o">&gt;</span><span class="p">(</span><span class="n">stacks</span><span class="p">:</span> <span class="o">&amp;</span><span class="nv">'a</span> <span class="k">mut</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="nb">u64</span><span class="p">,</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">char</span><span class="o">&gt;&gt;</span><span class="p">,</span> <span class="n">input</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="o">&amp;</span><span class="nv">'a</span> <span class="k">mut</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="nb">u64</span><span class="p">,</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">char</span><span class="o">&gt;&gt;</span> <span class="p">{</span>

        <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nd">format!</span><span class="p">(</span><span class="s">"{} "</span><span class="p">,</span> <span class="n">input</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.chars</span><span class="p">()</span>
             <span class="nf">.tuples</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|(</span><span class="n">_</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">_</span><span class="p">,</span><span class="n">_</span><span class="p">)|</span> <span class="n">b</span><span class="p">)</span>
             <span class="nf">.enumerate</span><span class="p">()</span>
             <span class="nf">.filter</span><span class="p">(|(</span><span class="n">_</span><span class="p">,</span><span class="n">c</span><span class="p">)|</span> <span class="o">*</span><span class="n">c</span> <span class="o">!=</span> <span class="sc">' '</span> <span class="o">&amp;&amp;</span> <span class="n">c</span><span class="nf">.is_alphabetic</span><span class="p">())</span>
             <span class="nf">.fold</span><span class="p">(</span><span class="n">stacks</span><span class="p">,</span> <span class="p">|</span><span class="n">acc</span><span class="p">,</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">b</span><span class="p">)|</span> <span class="p">{</span>
                    <span class="n">acc</span><span class="nf">.entry</span><span class="p">((</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">)</span><span class="nf">.or_insert</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[])</span><span class="nf">.insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
                    <span class="n">acc</span>
            <span class="p">});</span>
        <span class="n">x</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="n">move_crates</span><span class="o">&lt;</span><span class="nv">'a</span><span class="o">&gt;</span><span class="p">(</span><span class="n">stacks</span><span class="p">:</span> <span class="o">&amp;</span><span class="nv">'a</span> <span class="k">mut</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="nb">u64</span><span class="p">,</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">char</span><span class="o">&gt;&gt;</span><span class="p">,</span> <span class="n">input</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="o">&amp;</span><span class="nv">'a</span> <span class="k">mut</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="nb">u64</span><span class="p">,</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">char</span><span class="o">&gt;&gt;</span> <span class="p">{</span>
       
        <span class="k">let</span> <span class="n">x</span><span class="o">=</span><span class="n">input</span><span class="nf">.split</span><span class="p">(</span><span class="s">" "</span><span class="p">)</span>
                <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.is_ok</span><span class="p">())</span>
                <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span>
                <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;&gt;</span><span class="p">();</span>

        <span class="k">let</span> <span class="p">(</span><span class="n">number</span><span class="p">,</span> <span class="n">origin</span><span class="p">,</span> <span class="n">destination</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span>

        <span class="k">let</span> <span class="n">crates</span> <span class="o">=</span> <span class="n">stacks</span><span class="nf">.get_mut</span><span class="p">(</span><span class="o">&amp;</span><span class="n">origin</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">crates</span> <span class="o">=</span> <span class="n">crates</span><span class="nf">.split_off</span><span class="p">(</span><span class="n">crates</span><span class="nf">.len</span><span class="p">()</span><span class="o">-</span><span class="n">number</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">);</span>
        <span class="c1">// comment out this line for second answer with crate mover 9001</span>
        <span class="n">crates</span><span class="nf">.reverse</span><span class="p">();</span>
        <span class="n">stacks</span><span class="nf">.get_mut</span><span class="p">(</span><span class="o">&amp;</span><span class="n">destination</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.append</span><span class="p">(</span><span class="o">&amp;</span> <span class="k">mut</span> <span class="n">crates</span><span class="p">);</span>


        <span class="n">stacks</span>
    <span class="p">}</span>


    <span class="nd">#[cfg(test)]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>
        <span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashMap</span><span class="p">;</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_init_crates</span><span class="p">()</span> <span class="p">{</span>

            <span class="k">let</span> <span class="n">tests</span> <span class="o">=</span> <span class="p">[</span>
                <span class="p">(</span><span class="s">"            [F] [C] [H] [F] [W] [P]</span><span class="se">\n</span><span class="s">"</span>
                <span class="p">,</span><span class="nn">HashMap</span><span class="p">::</span><span class="nf">from</span><span class="p">([(</span><span class="mi">4</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'F'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'C'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">6</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'H'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">7</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'F'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">8</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'W'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">9</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'P'</span><span class="p">])</span>
                               <span class="p">])</span>
                <span class="p">),</span>
                <span class="p">(</span><span class="s">"[F] [C] [H] [F] [W] [P]</span><span class="se">\n</span><span class="s">"</span>
                <span class="p">,</span><span class="nn">HashMap</span><span class="p">::</span><span class="nf">from</span><span class="p">([(</span><span class="mi">1</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'F'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'C'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'H'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'F'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'W'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">6</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'P'</span><span class="p">])</span>
                               <span class="p">])</span>
                <span class="p">),</span>
                <span class="p">(</span><span class="s">"    [C] [H] [F] [W] [P]</span><span class="se">\n</span><span class="s">"</span>
                <span class="p">,</span><span class="nn">HashMap</span><span class="p">::</span><span class="nf">from</span><span class="p">([</span>
                               <span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'C'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'H'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'F'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'W'</span><span class="p">]),</span>
                               <span class="p">(</span><span class="mi">6</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'P'</span><span class="p">])</span>
                               <span class="p">])</span>
                <span class="p">),</span>
                <span class="p">(</span><span class="s">" 1   2   3 </span><span class="se">\n</span><span class="s">"</span>
                <span class="p">,</span><span class="nn">HashMap</span><span class="p">::</span><span class="nf">from</span><span class="p">([])</span>
                <span class="p">),</span>
                               <span class="p">];</span>
            <span class="k">for</span> <span class="n">test</span> <span class="k">in</span> <span class="n">tests</span> <span class="p">{</span>
                <span class="nd">assert_eq!</span><span class="p">(</span><span class="k">super</span><span class="p">::</span><span class="nf">init_crates</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="nn">HashMap</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span><span class="n">test</span><span class="na">.0</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">test</span><span class="na">.1</span><span class="p">);</span>
            <span class="p">}</span>
        
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_move_crates</span><span class="p">()</span> <span class="p">{</span>

            <span class="k">let</span> <span class="n">test</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span>
                <span class="p">(</span>
                    <span class="p">(</span><span class="nn">HashMap</span><span class="p">::</span><span class="nf">from</span><span class="p">([(</span><span class="mi">1</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'Z'</span><span class="p">,</span><span class="sc">'N'</span><span class="p">,</span><span class="sc">'D'</span><span class="p">]),(</span><span class="mi">2</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'M'</span><span class="p">,</span><span class="sc">'C'</span><span class="p">]),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'P'</span><span class="p">])],),</span><span class="s">"move 1 from 1 to 2"</span><span class="p">),</span>
                    <span class="p">(</span><span class="nn">HashMap</span><span class="p">::</span><span class="nf">from</span><span class="p">([(</span><span class="mi">1</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'Z'</span><span class="p">,</span><span class="sc">'N'</span><span class="p">]),(</span><span class="mi">2</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'M'</span><span class="p">,</span><span class="sc">'C'</span><span class="p">,</span><span class="sc">'D'</span><span class="p">]),(</span><span class="mi">3</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'P'</span><span class="p">])]))</span>
                <span class="p">),</span>
                <span class="p">(</span>
                    <span class="p">(</span><span class="nn">HashMap</span><span class="p">::</span><span class="nf">from</span><span class="p">([(</span><span class="mi">1</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[]),(</span><span class="mi">2</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'M'</span><span class="p">,</span><span class="sc">'C'</span><span class="p">]),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[])],),</span><span class="s">"move 2 from 2 to 1"</span><span class="p">),</span>
                    <span class="p">(</span><span class="nn">HashMap</span><span class="p">::</span><span class="nf">from</span><span class="p">([(</span><span class="mi">1</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">'C'</span><span class="p">,</span><span class="sc">'M'</span><span class="p">]),(</span><span class="mi">2</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[]),(</span><span class="mi">3</span><span class="p">,</span><span class="nd">vec!</span><span class="p">[])]))</span>
                <span class="p">)</span>
            <span class="p">];</span>

            <span class="k">for</span> <span class="k">mut</span> <span class="n">test</span> <span class="k">in</span> <span class="n">test</span> <span class="p">{</span>
                <span class="nd">assert_eq!</span><span class="p">(</span><span class="k">super</span><span class="p">::</span><span class="nf">move_crates</span><span class="p">(</span><span class="o">&amp;</span> <span class="k">mut</span> <span class="n">test</span><span class="na">.0.0</span><span class="p">,</span> <span class="n">test</span><span class="na">.0.1</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">test</span><span class="na">.1</span><span class="p">);</span>
            <span class="p">}</span>

        <span class="p">}</span>
    <span class="p">}</span>
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 66/100 - aoc 2022 day4</title><link href="https://maebli.github.io/archive/2022-12-04-100rust-66/" rel="alternate" type="text/html" title="Rust challenge 66/100 - aoc 2022 day4" /><published>2022-12-04T14:05:00+00:00</published><updated>2022-12-04T14:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-66</id><content type="html" xml:base="https://maebli.github.io/archive/2022-12-04-100rust-66/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#66th-challenge">66th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="66th-challenge">66th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Solve today’s AOC challange.🎅🦀</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Here’s my solution, today was really easy in my opinion :)</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">)</span><span class="nf">.lines</span><span class="p">()</span>
                    <span class="nf">.map</span><span class="p">(|</span><span class="n">line</span><span class="p">|</span> <span class="p">{</span>
                        <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">line</span><span class="nf">.split_once</span><span class="p">(</span><span class="s">","</span><span class="p">);</span>
                        <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.unwrap_or_else</span><span class="p">(||</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"Invalid input: {}"</span><span class="p">,</span> <span class="n">line</span><span class="p">));</span>
                        <span class="p">(</span><span class="nn">Assignment</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">x</span><span class="na">.0</span><span class="p">),</span> <span class="nn">Assignment</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">x</span><span class="na">.1</span><span class="p">))</span>
                    <span class="p">});</span>

        <span class="k">let</span> <span class="n">answer1</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.clone</span><span class="p">()</span>
                    <span class="nf">.filter</span><span class="p">(|(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)|</span> <span class="n">a</span><span class="nf">.is_subset_of</span><span class="p">(</span><span class="o">&amp;</span><span class="n">b</span><span class="p">)</span> <span class="p">||</span> <span class="n">b</span><span class="nf">.is_subset_of</span><span class="p">(</span><span class="o">&amp;</span><span class="n">a</span><span class="p">))</span>
                    <span class="nf">.count</span><span class="p">();</span>

        <span class="k">let</span> <span class="n">answer2</span> <span class="o">=</span> <span class="n">x</span>
                    <span class="nf">.filter</span><span class="p">(|(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)|</span> <span class="n">a</span><span class="nf">.overlaps</span><span class="p">(</span><span class="o">&amp;</span><span class="n">b</span><span class="p">))</span><span class="nf">.count</span><span class="p">();</span>

        <span class="nd">println!</span><span class="p">(</span><span class="s">"Answer 1: {} and Answer 2: {}"</span><span class="p">,</span> <span class="n">answer1</span><span class="p">,</span> <span class="n">answer2</span><span class="p">);</span>
                    

    <span class="p">}</span>


    <span class="k">struct</span> <span class="n">Assignment</span> <span class="p">{</span>
        <span class="n">start</span><span class="p">:</span> <span class="nb">u64</span><span class="p">,</span>
        <span class="n">end</span><span class="p">:</span> <span class="nb">u64</span><span class="p">,</span>
    <span class="p">}</span>

    <span class="k">impl</span> <span class="n">Assignment</span> <span class="p">{</span>

        <span class="k">fn</span> <span class="nf">is_subset_of</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">other</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Assignment</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
            <span class="k">self</span><span class="py">.start</span> <span class="o">&gt;=</span> <span class="n">other</span><span class="py">.start</span> <span class="o">&amp;&amp;</span> <span class="k">self</span><span class="py">.end</span> <span class="o">&lt;=</span> <span class="n">other</span><span class="py">.end</span>
        <span class="p">}</span>

        <span class="k">fn</span> <span class="nf">overlaps</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">other</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Assignment</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
            <span class="k">self</span><span class="py">.start</span> <span class="o">&lt;=</span> <span class="n">other</span><span class="py">.end</span> <span class="o">&amp;&amp;</span> <span class="k">self</span><span class="py">.end</span> <span class="o">&gt;=</span> <span class="n">other</span><span class="py">.start</span>
        <span class="p">}</span>
        
        <span class="k">fn</span> <span class="nf">from</span><span class="p">(</span><span class="n">line</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Assignment</span> <span class="p">{</span>
            <span class="k">let</span> <span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span> <span class="o">=</span> <span class="n">line</span>
                    <span class="nf">.split_once</span><span class="p">(</span><span class="s">"-"</span><span class="p">)</span>
                    <span class="nf">.unwrap_or_else</span><span class="p">(||</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"Invalid input: {}"</span><span class="p">,</span> <span class="n">line</span><span class="p">));</span>
            <span class="n">Assignment</span> <span class="p">{</span>
                <span class="n">start</span><span class="p">:</span> <span class="n">start</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap_or</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span>
                <span class="n">end</span><span class="p">:</span> <span class="n">end</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap_or</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="c1">// add tests</span>
    <span class="nd">#[cfg(test)]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>
        <span class="k">use</span> <span class="k">super</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_is_subset_of</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="n">Assignment</span> <span class="p">{</span> <span class="n">start</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">end</span><span class="p">:</span> <span class="mi">10</span> <span class="p">};</span>
            <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="n">Assignment</span> <span class="p">{</span> <span class="n">start</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">end</span><span class="p">:</span> <span class="mi">10</span> <span class="p">};</span>
            <span class="nd">assert!</span><span class="p">(</span><span class="n">a</span><span class="nf">.is_subset_of</span><span class="p">(</span><span class="o">&amp;</span><span class="n">b</span><span class="p">));</span>

            <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="n">Assignment</span> <span class="p">{</span> <span class="n">start</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">end</span><span class="p">:</span> <span class="mi">10</span> <span class="p">};</span>
            <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="n">Assignment</span> <span class="p">{</span> <span class="n">start</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">end</span><span class="p">:</span> <span class="mi">11</span> <span class="p">};</span>
            <span class="nd">assert!</span><span class="p">(</span><span class="n">a</span><span class="nf">.is_subset_of</span><span class="p">(</span><span class="o">&amp;</span><span class="n">b</span><span class="p">));</span>

            <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="n">Assignment</span> <span class="p">{</span> <span class="n">start</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="n">end</span><span class="p">:</span> <span class="mi">10</span> <span class="p">};</span>
            <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="n">Assignment</span> <span class="p">{</span> <span class="n">start</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">end</span><span class="p">:</span> <span class="mi">10</span> <span class="p">};</span>
            <span class="nd">assert!</span><span class="p">(</span><span class="n">a</span><span class="nf">.is_subset_of</span><span class="p">(</span><span class="o">&amp;</span><span class="n">b</span><span class="p">));</span>
            <span class="nd">assert!</span><span class="p">(</span><span class="o">!</span><span class="n">b</span><span class="nf">.is_subset_of</span><span class="p">(</span><span class="o">&amp;</span><span class="n">a</span><span class="p">));</span>

        <span class="p">}</span>
    <span class="p">}</span>
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 65/100 - aoc 2022 day3</title><link href="https://maebli.github.io/archive/2022-12-02-100rust-65/" rel="alternate" type="text/html" title="Rust challenge 65/100 - aoc 2022 day3" /><published>2022-12-03T14:05:00+00:00</published><updated>2022-12-03T14:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-65</id><content type="html" xml:base="https://maebli.github.io/archive/2022-12-02-100rust-65/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#65th-challenge">65th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="65th-challenge">65th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Solve today’s AOC challange.🎅🦀</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Here’s my solution</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">     <span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::{</span><span class="n">HashSet</span><span class="p">};</span>
    <span class="k">use</span> <span class="nn">itertools</span><span class="p">::{</span><span class="n">Itertools</span><span class="p">};</span>

    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

        <span class="k">let</span> <span class="n">answer</span><span class="p">:</span><span class="nb">u64</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">)</span><span class="nf">.lines</span><span class="p">()</span>
                <span class="nf">.map</span><span class="p">(</span><span class="n">find_only_uniqe_item_in_rucksack</span><span class="p">)</span>
                <span class="nf">.map</span><span class="p">(</span><span class="n">get_priority_of_item</span><span class="p">)</span>
                <span class="nf">.sum</span><span class="p">();</span>
        
        <span class="nd">println!</span><span class="p">(</span><span class="s">"solution 1: {}"</span><span class="p">,</span> <span class="n">answer</span><span class="p">);</span>

        <span class="k">let</span> <span class="n">answer</span><span class="p">:</span><span class="nb">u64</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"../input.txt"</span><span class="p">)</span><span class="nf">.lines</span><span class="p">()</span>
                <span class="nf">.tuples</span><span class="p">()</span>
                <span class="nf">.map</span><span class="p">(</span><span class="n">find_badge_of_group</span><span class="p">)</span>
                <span class="nf">.map</span><span class="p">(</span><span class="n">get_priority_of_item</span><span class="p">)</span>
                <span class="nf">.sum</span><span class="p">();</span>

        <span class="nd">println!</span><span class="p">(</span><span class="s">"solution 2: {}"</span><span class="p">,</span> <span class="n">answer</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">fn</span>  <span class="nf">find_badge_of_group</span><span class="p">(</span><span class="n">group</span><span class="p">:(</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">,</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">,</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">))</span><span class="k">-&gt;</span> <span class="nb">u8</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">e1</span> <span class="p">:</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="nb">char</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">group</span><span class="na">.0</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.collect</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">e2</span> <span class="p">:</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="nb">char</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">group</span><span class="na">.1</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.collect</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">e3</span> <span class="p">:</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="nb">char</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">group</span><span class="na">.2</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.collect</span><span class="p">();</span>
        <span class="n">e1</span><span class="nf">.intersection</span><span class="p">(</span><span class="o">&amp;</span><span class="n">e2</span><span class="p">)</span>
            <span class="nf">.copied</span><span class="p">()</span>
            <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="n">HashSet</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;&gt;</span><span class="p">()</span>
            <span class="nf">.intersection</span><span class="p">(</span><span class="o">&amp;</span><span class="n">e3</span><span class="p">)</span>
            <span class="nf">.copied</span><span class="p">()</span>
            <span class="nf">.next</span><span class="p">()</span>
            <span class="nf">.unwrap_or_else</span><span class="p">(||</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"no intersection found"</span><span class="p">))</span>
            <span class="k">as</span> <span class="nb">u8</span>
    <span class="p">}</span>
    <span class="k">fn</span> <span class="nf">find_only_uniqe_item_in_rucksack</span><span class="p">(</span><span class="n">rucksack</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u8</span> <span class="p">{</span>

        <span class="k">let</span> <span class="n">left_compartment</span><span class="p">:</span><span class="n">HashSet</span><span class="o">&lt;</span><span class="nb">char</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">rucksack</span><span class="p">[</span><span class="o">..</span><span class="p">(</span><span class="n">rucksack</span><span class="nf">.len</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">2</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.collect</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">right_compartment</span><span class="p">:</span><span class="n">HashSet</span><span class="o">&lt;</span><span class="nb">char</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">rucksack</span><span class="p">[(</span><span class="n">rucksack</span><span class="nf">.len</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">2</span><span class="o">+</span><span class="mi">1</span><span class="o">..</span><span class="p">]</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.collect</span><span class="p">();</span>
        
        <span class="o">*</span><span class="n">left_compartment</span><span class="nf">.intersection</span><span class="p">(</span><span class="o">&amp;</span><span class="n">right_compartment</span><span class="p">)</span>
                        <span class="nf">.next</span><span class="p">()</span>
                        <span class="nf">.unwrap_or_else</span><span class="p">(||</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"No unique item found in rucksack: {}"</span><span class="p">,</span> <span class="n">rucksack</span><span class="p">))</span>
                        <span class="k">as</span> <span class="nb">u8</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">get_priority_of_item</span><span class="p">(</span><span class="n">item</span><span class="p">:</span><span class="nb">u8</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span><span class="p">{</span>
        <span class="k">match</span> <span class="n">item</span> <span class="p">{</span>
            <span class="n">x</span> <span class="k">if</span> <span class="n">item</span> <span class="o">&gt;=</span> <span class="sc">b'A'</span> <span class="o">&amp;&amp;</span> <span class="n">item</span> <span class="o">&lt;=</span> <span class="sc">b'Z'</span> <span class="k">=&gt;</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="sc">b'A'</span> <span class="o">+</span> <span class="mi">27</span><span class="p">)</span><span class="nf">.into</span><span class="p">(),</span>
            <span class="n">x</span> <span class="k">if</span> <span class="n">item</span> <span class="o">&gt;=</span> <span class="sc">b'a'</span> <span class="o">&amp;&amp;</span> <span class="n">item</span> <span class="o">&lt;=</span> <span class="sc">b'z'</span> <span class="k">=&gt;</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="sc">b'a'</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span><span class="nf">.into</span><span class="p">(),</span>
            <span class="n">_</span> <span class="k">=&gt;</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"Invalid item"</span><span class="p">)</span>
        <span class="p">}</span>

    <span class="p">}</span>

    <span class="nd">#[cfg(test)]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>

        <span class="k">use</span> <span class="k">super</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_that_if_single_item_found_in_both_compoartents_correctly_found</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">test_input</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">,</span><span class="nb">u8</span><span class="p">)</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span>
                <span class="p">(</span><span class="s">"vJrwpWtwJgWrhcsFMMfFFhFp"</span><span class="p">,</span><span class="sc">b'p'</span><span class="p">),</span>
                <span class="p">(</span><span class="s">"jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL"</span><span class="p">,</span><span class="sc">b'L'</span><span class="p">),</span>
                <span class="p">(</span><span class="s">"PmmdzqPrVvPwwTWBwg"</span><span class="p">,</span><span class="sc">b'P'</span><span class="p">),</span>
                <span class="p">(</span><span class="s">"wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn"</span><span class="p">,</span><span class="sc">b'v'</span><span class="p">),</span>
                <span class="p">(</span><span class="s">"ttgJtRGJQctTZtZT"</span><span class="p">,</span><span class="sc">b't'</span><span class="p">),</span>
                <span class="p">(</span><span class="s">"CrZsJsPPZsGzwwsLwLmpwMDw"</span><span class="p">,</span><span class="sc">b's'</span><span class="p">)</span>
            <span class="p">];</span>
            <span class="k">let</span> <span class="n">_</span> <span class="o">=</span> <span class="n">test_input</span><span class="nf">.iter</span><span class="p">()</span>
                        <span class="nf">.inspect</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">find_only_uniqe_item_in_rucksack</span><span class="p">(</span><span class="n">x</span><span class="na">.0</span><span class="p">),</span><span class="n">x</span><span class="na">.1</span><span class="p">))</span>
                        <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;&gt;</span><span class="p">();</span>
        <span class="p">}</span>

        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">test_priority_calc_of_item</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">test_input</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">u8</span><span class="p">,</span><span class="nb">u64</span><span class="p">)</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span>
                <span class="p">(</span><span class="sc">b'A'</span><span class="p">,</span><span class="mi">27</span><span class="p">),</span>
                <span class="p">(</span><span class="sc">b'a'</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span>
                <span class="p">(</span><span class="sc">b'Z'</span><span class="p">,</span><span class="mi">52</span><span class="p">),</span>
                <span class="p">(</span><span class="sc">b'z'</span><span class="p">,</span><span class="mi">26</span><span class="p">)</span>
            <span class="p">];</span>
            <span class="k">let</span> <span class="n">_</span> <span class="o">=</span> <span class="n">test_input</span><span class="nf">.iter</span><span class="p">()</span>
                            <span class="nf">.inspect</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="nd">assert!</span><span class="p">(</span><span class="nf">get_priority_of_item</span><span class="p">(</span><span class="n">x</span><span class="na">.0</span><span class="p">)</span><span class="o">==</span><span class="n">x</span><span class="na">.1</span><span class="p">))</span>
                            <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;&gt;</span><span class="p">();</span>
        <span class="p">}</span>

    <span class="p">}</span>
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 64/100 - aoc 2022 day2</title><link href="https://maebli.github.io/archive/2022-12-02-100rust-64/" rel="alternate" type="text/html" title="Rust challenge 64/100 - aoc 2022 day2" /><published>2022-12-02T16:05:00+00:00</published><updated>2022-12-02T16:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-64</id><content type="html" xml:base="https://maebli.github.io/archive/2022-12-02-100rust-64/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#64th-challenge">64th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="64th-challenge">64th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Solve today’s AOC challange.🎅🦀</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Here’s my solution, took me a bit longer than expected (again)- Its not elegant or clever but its easy to read :)</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    use std::cmp::Ordering<span class="p">;</span>


    const POINTS_FOR_WIN:u32 <span class="o">=</span> 6<span class="p">;</span>
    const POINTS_FOR_DRAW:u32 <span class="o">=</span> 3<span class="p">;</span>
    const POINTS_FOR_LOSS:u32 <span class="o">=</span> 0<span class="p">;</span>


    fn main<span class="o">()</span> <span class="o">{</span>
    println!<span class="o">(</span><span class="s2">"{} "</span>, GameMove::get_sum_part1<span class="o">(</span>include_str!<span class="o">(</span><span class="s2">"../input.txt"</span><span class="o">)))</span><span class="p">;</span>
    println!<span class="o">(</span><span class="s2">"{} "</span>, GameMove::get_sum_part2<span class="o">(</span>include_str!<span class="o">(</span><span class="s2">"../input.txt"</span><span class="o">)))</span><span class="p">;</span>
    <span class="o">}</span>
    <span class="c">#[derive(PartialOrd, PartialEq, Debug,Eq,Clone)]</span>
    enum GameMove <span class="o">{</span>
    Paper,
    Rock,
    Scissors,
    <span class="o">}</span>



    impl GameMove <span class="o">{</span>
    fn from<span class="o">(</span>i:char<span class="o">)</span> -&gt; Self <span class="o">{</span>
        match i <span class="o">{</span>
            <span class="s1">'X'</span>|<span class="s1">'A'</span> <span class="o">=&gt;</span> GameMove::Rock,
            <span class="s1">'Y'</span>|<span class="s1">'B'</span> <span class="o">=&gt;</span> GameMove::Paper,
            <span class="s1">'Z'</span>|<span class="s1">'C'</span> <span class="o">=&gt;</span> GameMove::Scissors,
            _ <span class="o">=&gt;</span> panic!<span class="o">(</span><span class="s2">"Invalid input"</span><span class="o">)</span>,
        <span class="o">}</span>
    <span class="o">}</span>

    fn value<span class="o">(</span>&amp;self<span class="o">)</span> -&gt; u32 <span class="o">{</span>
        match self <span class="o">{</span>
            GameMove::Rock <span class="o">=&gt;</span> 1,
            GameMove::Paper <span class="o">=&gt;</span> 2,
            GameMove::Scissors <span class="o">=&gt;</span> 3,
        <span class="o">}</span>
    <span class="o">}</span>

    fn read_moves<span class="o">(</span>input:&amp;str<span class="o">)</span> -&gt; Vec&lt;<span class="o">((</span>std::cmp::Ordering,u32<span class="o">)</span>,<span class="o">(</span>std::cmp::Ordering,u32<span class="o">))&gt;{</span>
        input.lines<span class="o">()</span>.map<span class="o">(</span>|line| <span class="o">{</span>
            <span class="nb">let </span>mut parts <span class="o">=</span> line.split_whitespace<span class="o">()</span><span class="p">;</span>
            <span class="nb">let </span>oponent_move <span class="o">=</span> GameMove::from<span class="o">(</span>parts.next<span class="o">()</span>.unwrap<span class="o">()</span>.chars<span class="o">()</span>.next<span class="o">()</span>.unwrap<span class="o">())</span><span class="p">;</span>
            <span class="nb">let </span>second_input <span class="o">=</span> parts.next<span class="o">()</span>.unwrap<span class="o">()</span>.chars<span class="o">()</span>.next<span class="o">()</span>.unwrap<span class="o">()</span><span class="p">;</span>
            <span class="nb">let </span>your_move_part1 <span class="o">=</span> GameMove::from<span class="o">(</span>second_input<span class="o">)</span><span class="p">;</span>
            <span class="nb">let </span>your_move_part2 <span class="o">=</span> oponent_move.from_ordering<span class="o">(</span>second_input<span class="o">)</span><span class="p">;</span>
            <span class="nb">let </span>res_part2 <span class="o">=</span> your_move_part2.cmp<span class="o">(</span>&amp;oponent_move<span class="o">)</span><span class="p">;</span>
            <span class="nb">let </span><span class="nv">res_part1</span><span class="o">=</span> your_move_part1.cmp<span class="o">(</span>&amp;oponent_move<span class="o">)</span><span class="p">;</span>
            <span class="nb">let </span><span class="nv">points_part2</span><span class="o">=</span>match res_part2 <span class="o">{</span>
                Ordering::Equal <span class="o">=&gt;</span> <span class="o">(</span>res_part2,your_move_part2.value<span class="o">()</span>+POINTS_FOR_DRAW<span class="o">)</span>,
                Ordering::Greater <span class="o">=&gt;</span> <span class="o">(</span>res_part2,your_move_part2.value<span class="o">()</span>+POINTS_FOR_WIN<span class="o">)</span>,
                Ordering::Less <span class="o">=&gt;</span> <span class="o">(</span>res_part2,your_move_part2.value<span class="o">()</span>+POINTS_FOR_LOSS<span class="o">)</span>,
            <span class="o">}</span><span class="p">;</span>
            <span class="nb">let </span><span class="nv">points_part1</span><span class="o">=</span>match res_part1 <span class="o">{</span>
                Ordering::Equal <span class="o">=&gt;</span> <span class="o">(</span>res_part1,your_move_part1.value<span class="o">()</span>+POINTS_FOR_DRAW<span class="o">)</span>,
                Ordering::Greater <span class="o">=&gt;</span> <span class="o">(</span>res_part1,your_move_part1.value<span class="o">()</span>+POINTS_FOR_WIN<span class="o">)</span>,
                Ordering::Less <span class="o">=&gt;</span> <span class="o">(</span>res_part1,your_move_part1.value<span class="o">()</span>+POINTS_FOR_LOSS<span class="o">)</span>,
            <span class="o">}</span><span class="p">;</span>
            <span class="o">(</span>points_part1,points_part2<span class="o">)</span>
        <span class="o">})</span>.collect<span class="o">()</span>
    <span class="o">}</span>

    fn get_sum_part1<span class="o">(</span>input:&amp;str<span class="o">)</span> -&gt; u32 <span class="o">{</span>
        GameMove::read_moves<span class="o">(</span>input<span class="o">)</span>.iter<span class="o">()</span>.map<span class="o">(</span>|<span class="o">(</span>a,_<span class="o">)</span>| a.1<span class="o">)</span>.sum<span class="o">()</span>
    <span class="o">}</span>

    fn get_sum_part2<span class="o">(</span>input:&amp;str<span class="o">)</span> -&gt; u32 <span class="o">{</span>
        GameMove::read_moves<span class="o">(</span>input<span class="o">)</span>.iter<span class="o">()</span>.map<span class="o">(</span>|<span class="o">(</span>_,a<span class="o">)</span>| a.1<span class="o">)</span>.sum<span class="o">()</span>
    <span class="o">}</span>

    fn from_ordering<span class="o">(</span>&amp;self,i:char<span class="o">)</span> -&gt; GameMove <span class="o">{</span>
        match i <span class="o">{</span>
            <span class="s1">'Z'</span> <span class="o">=&gt;</span> <span class="o">{</span>
                match <span class="k">*</span>self <span class="o">{</span>
                    GameMove::Rock <span class="o">=&gt;</span> GameMove::Paper,
                    GameMove::Paper <span class="o">=&gt;</span> GameMove::Scissors,
                    GameMove::Scissors <span class="o">=&gt;</span> GameMove::Rock,
                <span class="o">}</span>
            <span class="o">}</span>
            <span class="s1">'Y'</span> <span class="o">=&gt;</span> self.clone<span class="o">()</span>,
            <span class="s1">'X'</span> <span class="o">=&gt;</span> match <span class="k">*</span>self <span class="o">{</span>
                GameMove::Rock <span class="o">=&gt;</span> GameMove::Scissors,
                GameMove::Paper <span class="o">=&gt;</span> GameMove::Rock,
                GameMove::Scissors <span class="o">=&gt;</span> GameMove::Paper,
            <span class="o">}</span>,
            _ <span class="o">=&gt;</span> panic!<span class="o">(</span><span class="s2">"Invalid input"</span><span class="o">)</span>,
        <span class="o">}</span>
    <span class="o">}</span>
    <span class="o">}</span>

    impl Ord <span class="k">for </span>GameMove <span class="o">{</span>
    fn cmp<span class="o">(</span>&amp;self, other: &amp;Self<span class="o">)</span> -&gt; std::cmp::Ordering <span class="o">{</span>
        match other <span class="o">{</span>
            GameMove::Paper <span class="o">=&gt;</span> match self<span class="o">{</span>
                GameMove::Paper <span class="o">=&gt;</span> std::cmp::Ordering::Equal,
                GameMove::Rock <span class="o">=&gt;</span> std::cmp::Ordering::Less,
                GameMove::Scissors <span class="o">=&gt;</span> std::cmp::Ordering::Greater,
            <span class="o">}</span>,
            GameMove::Rock <span class="o">=&gt;</span> match self <span class="o">{</span>
                GameMove::Paper <span class="o">=&gt;</span> std::cmp::Ordering::Greater,
                GameMove::Rock <span class="o">=&gt;</span> std::cmp::Ordering::Equal,
                GameMove::Scissors <span class="o">=&gt;</span> std::cmp::Ordering::Less,
            <span class="o">}</span>,
            GameMove::Scissors <span class="o">=&gt;</span> match self <span class="o">{</span>
                GameMove::Paper <span class="o">=&gt;</span> std::cmp::Ordering::Less,
                GameMove::Rock <span class="o">=&gt;</span> std::cmp::Ordering::Greater,
                GameMove::Scissors <span class="o">=&gt;</span> std::cmp::Ordering::Equal,
            <span class="o">}</span>,
        <span class="o">}</span>
    <span class="o">}</span>
    <span class="o">}</span>

    <span class="c">#[cfg(test)]</span>
    mod tests <span class="o">{</span>
    use std::cmp::Ordering<span class="p">;</span>

    use super::<span class="k">*</span><span class="p">;</span>

    const TEST_INPUT: &amp;str <span class="o">=</span> <span class="s2">"A Y
    B X
    C Z"</span><span class="p">;</span>

    <span class="c">#[test]</span>
    fn testType<span class="o">()</span> <span class="o">{</span>
        assert_eq!<span class="o">(</span>GameMove::Paper.cmp<span class="o">(</span>&amp;GameMove::Paper<span class="o">)</span>, Ordering::Equal<span class="o">)</span><span class="p">;</span>
        assert_eq!<span class="o">(</span>GameMove::Paper.cmp<span class="o">(</span>&amp;GameMove::Rock<span class="o">)</span>, Ordering::Greater<span class="o">)</span><span class="p">;</span>
        assert_eq!<span class="o">(</span>GameMove::Paper.cmp<span class="o">(</span>&amp;GameMove::Scissors<span class="o">)</span>, Ordering::Less<span class="o">)</span><span class="p">;</span>
        assert_eq!<span class="o">(</span>GameMove::Rock.cmp<span class="o">(</span>&amp;GameMove::Scissors<span class="o">)</span>, Ordering::Greater<span class="o">)</span><span class="p">;</span>
        assert_eq!<span class="o">(</span>GameMove::Rock.cmp<span class="o">(</span>&amp;GameMove::Paper<span class="o">)</span>, Ordering::Less<span class="o">)</span><span class="p">;</span>
        assert_eq!<span class="o">(</span>GameMove::Rock.cmp<span class="o">(</span>&amp;GameMove::Rock<span class="o">)</span>, Ordering::Equal<span class="o">)</span><span class="p">;</span>
        assert_eq!<span class="o">(</span>GameMove::Scissors.cmp<span class="o">(</span>&amp;GameMove::Paper<span class="o">)</span>, Ordering::Greater<span class="o">)</span><span class="p">;</span>
        assert_eq!<span class="o">(</span>GameMove::Scissors.cmp<span class="o">(</span>&amp;GameMove::Rock<span class="o">)</span>, Ordering::Less<span class="o">)</span><span class="p">;</span>
        assert_eq!<span class="o">(</span>GameMove::Scissors.cmp<span class="o">(</span>&amp;GameMove::Scissors<span class="o">)</span>, Ordering::Equal<span class="o">)</span><span class="p">;</span>
    <span class="o">}</span>
    <span class="c">#[test]</span>
    fn testInput<span class="o">(){</span>
        assert_eq!<span class="o">(</span>GameMove::get_sum_part1<span class="o">(</span>TEST_INPUT<span class="o">)</span>, 15<span class="o">)</span><span class="p">;</span>
    <span class="o">}</span>
    <span class="o">}</span>

    </code></pre></figure>

<p>To see the source see <a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2022-day2">github</a></p>

<p>See the <a href="https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2021&amp;gist=3f8cd81417f45dca7f890ac95ac8cd9b">playground link</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 63/100 - aoc 2022 day1</title><link href="https://maebli.github.io/archive/2022-12-01-100rust-63/" rel="alternate" type="text/html" title="Rust challenge 63/100 - aoc 2022 day1" /><published>2022-12-01T16:05:00+00:00</published><updated>2022-12-01T16:05:00+00:00</updated><id>https://maebli.github.io/archive/100rust-63</id><content type="html" xml:base="https://maebli.github.io/archive/2022-12-01-100rust-63/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#63d-challenge">63d Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="63d-challenge">63d Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Solve today’s AOC challange.🎅🦀</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Here’s my solution, took me a bit longer than expected- I’m out of practice it seems.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    use std::fs<span class="p">;</span>

    fn main<span class="o">()</span> <span class="o">{</span>
        // <span class="nb">read </span>input.txt file
        <span class="nb">let </span>input <span class="o">=</span> fs::read_to_string<span class="o">(</span><span class="s2">"input.txt"</span><span class="o">)</span>.expect<span class="o">(</span><span class="s2">"Error reading input.txt file"</span><span class="o">)</span><span class="p">;</span>
        <span class="nb">let </span>res <span class="o">=</span> get_elf_with_most_calories<span class="o">(</span>input.as_str<span class="o">())</span><span class="p">;</span>
        println!<span class="o">(</span><span class="s2">"The elf with the most calories has a score of {}"</span>, res.0<span class="o">)</span><span class="p">;</span>
        println!<span class="o">(</span><span class="s2">"The sum of calories of the top three elves is {}"</span>, res.0+res.1+res.2<span class="o">)</span><span class="p">;</span>
    <span class="o">}</span>

    fn get_elf_with_most_calories<span class="o">(</span>input:&amp;str<span class="o">)</span> -&gt; <span class="o">(</span>u32,u32,u32<span class="o">)</span> <span class="o">{</span>
        
        <span class="nb">let </span>mut calories <span class="o">=</span> input.lines<span class="o">()</span>.into_iter<span class="o">()</span>.fold<span class="o">(</span>vec![], |mut acc, line| <span class="o">{</span>
            match line.trim<span class="o">()</span>.parse::&lt;u32&gt;<span class="o">()</span> <span class="o">{</span>
                Ok<span class="o">(</span> n<span class="o">)</span> <span class="o">=&gt;</span> <span class="o">{</span>
                    <span class="nb">let </span><span class="nv">n</span><span class="o">=</span><span class="k">*</span>acc.pop<span class="o">()</span>.get_or_insert<span class="o">(</span>0<span class="o">)</span>+n<span class="p">;</span>
                    acc.push<span class="o">(</span>n<span class="o">)</span><span class="p">;</span>
                <span class="o">}</span>
                _ <span class="o">=&gt;</span> <span class="o">{</span>
                    acc.push<span class="o">(</span>0<span class="o">)</span>
                <span class="o">}</span>
            <span class="o">}</span>
            acc
        <span class="o">})</span><span class="p">;</span>

        calories.sort<span class="o">()</span><span class="p">;</span>
        <span class="o">(</span>calories.pop<span class="o">()</span>.unwrap_or<span class="o">(</span>0<span class="o">)</span>,
         calories.pop<span class="o">()</span>.unwrap_or<span class="o">(</span>0<span class="o">)</span>,
         calories.pop<span class="o">()</span>.unwrap_or<span class="o">(</span>0<span class="o">))</span>

    <span class="o">}</span>


    <span class="c">#[cfg(test)]</span>
    mod tests <span class="o">{</span>

        use crate::<span class="o">{</span>get_elf_with_most_calories<span class="o">}</span><span class="p">;</span>

        const INPUT: &amp;str <span class="o">=</span> <span class="s2">"1000
        2000
        3000
        
        4000
        
        5000
        6000
        
        7000
        8000
        9000
        
        10000"</span><span class="p">;</span>

        <span class="c">#[test]</span>
        fn test_function_get_elf_with_most_calories<span class="o">()</span> <span class="o">{</span>
            assert_eq!<span class="o">(</span>get_elf_with_most_calories<span class="o">(</span>INPUT<span class="o">)</span>.0, 24000<span class="o">)</span><span class="p">;</span>
        <span class="o">}</span>

        <span class="c">#[test]</span>
        fn test_function_get_some_of_top_three<span class="o">(){</span>
            <span class="nb">let </span><span class="nv">i</span><span class="o">=</span>get_elf_with_most_calories<span class="o">(</span>INPUT<span class="o">)</span><span class="p">;</span>
            assert_eq!<span class="o">(</span>i.0+i.1+i.2, 45000<span class="o">)</span><span class="p">;</span>
        <span class="o">}</span>

    <span class="o">}</span>
    </code></pre></figure>

<p>To see the source see <a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2022-day1">github</a></p>

<p>See the <a href="https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2021&amp;gist=a5d952a1c88527a6ee6eb7f7eeefa28a">playground link</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 62/100 - find the middle of points</title><link href="https://maebli.github.io/archive/2022-10-03-100rust-62/" rel="alternate" type="text/html" title="Rust challenge 62/100 - find the middle of points" /><published>2022-11-08T19:42:00+00:00</published><updated>2022-11-08T19:42:00+00:00</updated><id>https://maebli.github.io/archive/100rust-62</id><content type="html" xml:base="https://maebli.github.io/archive/2022-10-03-100rust-62/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#62nd-challenge">62nd Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="62nd-challenge">62nd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Find the center of multiple co-ordinate points.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Longatiude and Latitude can be easily averaged by adding the coordinates togehter and dividing by the number of components. I will use a free api to resolve strings to coordinates. The api is called GeoAdmin and is limited to Switzerland. The API requires no authentication so it is well suited for this challenge.</p>

<p>And here it is, the solution</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    use geocoding::<span class="o">{</span>GeoAdmin,Forward,Point<span class="o">}</span><span class="p">;</span>

    fn main<span class="o">()</span> <span class="o">{</span>

        <span class="nb">let </span><span class="nv">addresses</span><span class="o">=</span> vec![<span class="s2">"Locarno"</span>,<span class="s2">"Lugano"</span>,<span class="s2">"Altdorf"</span><span class="o">]</span><span class="p">;</span>

        <span class="nb">let </span>geoadmin <span class="o">=</span> GeoAdmin::new<span class="o">()</span><span class="p">;</span>

        <span class="nb">let </span>weight <span class="o">=</span> 1.0/<span class="o">(</span>addresses.len<span class="o">()</span> as f64<span class="o">)</span><span class="p">;</span>
        <span class="nb">let </span>mut center <span class="o">=</span> addresses.iter<span class="o">()</span>
        .map<span class="o">(</span>|address|  <span class="o">{</span>
            <span class="k">*</span>geoadmin.forward<span class="o">(</span>address<span class="o">)</span>.unwrap<span class="o">()</span>.get<span class="o">(</span>0<span class="o">)</span>.unwrap<span class="o">()</span>
        <span class="o">})</span>.fold<span class="o">(</span>Point::new<span class="o">(</span>0.0,0.0<span class="o">)</span>, |mut acc, x| <span class="o">{</span>
            acc+<span class="o">=</span>x<span class="p">;</span>
            acc
        <span class="o">})</span><span class="p">;</span>

        <span class="nv">center</span><span class="o">=</span>center<span class="k">*</span>weight<span class="p">;</span>

        println!<span class="o">(</span><span class="s2">"Center: {:?}"</span>,center<span class="o">)</span><span class="p">;</span>
        println!<span class="o">(</span><span class="s2">"https://www.google.com/maps/search/{:?},{:?}"</span>, center.y<span class="o">()</span>,center.x<span class="o">())</span><span class="p">;</span>
        
    <span class="o">}</span>
    </code></pre></figure>

<p>To see the source see <a href="https://github.com/maebli/100rustsnippets/tree/master/lets-meet">github</a></p>

<p>Maybe I’ll make this into something bigger, not sure yet.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 61/100 - reading the generic node’s accleration sensor</title><link href="https://maebli.github.io/archive/2022-10-05-100rust-61/" rel="alternate" type="text/html" title="Rust challenge 61/100 - reading the generic node’s accleration sensor" /><published>2022-10-05T19:30:00+00:00</published><updated>2022-10-05T19:30:00+00:00</updated><id>https://maebli.github.io/archive/100rust-61</id><content type="html" xml:base="https://maebli.github.io/archive/2022-10-05-100rust-61/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#61st-challenge">61st Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="61st-challenge">61st Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Now lets read the next sensor, the accleration sensor :)</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Lets start from a template again, same folder as yesterday.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    cargo generate <span class="se">\</span>
    <span class="nt">--git</span> https://github.com/stm32-rs/stm32wlxx-hal<span class="se">\</span>
    <span class="nt">--name</span> stm32
    </code></pre></figure>

<p>The sensor looks as follows on the generic node. Its on the same i2c bus so powering the bus and initalizing the bus will be the same. The slave address is however <code class="language-plaintext highlighter-rouge">0x33</code> now and we have to read the datasheet to see how we can talk to this little guy. The little guy, LIS2DH12, is an ST chip and described as <code class="language-plaintext highlighter-rouge">MEMS digital output motion sensor: ultra-low-power high-performance 3-axis "femto" accelerometer</code></p>

<p><img src="/assets/img/acclerationsensor.png" alt="" /></p>

<p>I want to just read out the accleration values in all directions, I’m hopeing the default configuration will allow for it. The following is an extract from the register map I’m going to read.</p>

<p><img src="/assets/img/registermap.png" alt="" /></p>

<p>If the <code class="language-plaintext highlighter-rouge">MSb</code> of the <code class="language-plaintext highlighter-rouge">SUB</code> field is <code class="language-plaintext highlighter-rouge">1</code>, the <code class="language-plaintext highlighter-rouge">SUB</code> (register address) is automatically increased to allow multiple data read/writes. We will not do this, so we will just leave the <code class="language-plaintext highlighter-rouge">Msb</code> at <code class="language-plaintext highlighter-rouge">0</code></p>

<p><img src="/assets/img/typical-i2c.png" alt="" />.</p>

<p>So first guess is we send <code class="language-plaintext highlighter-rouge">0x33,0xF</code> to get the <code class="language-plaintext highlighter-rouge">WHO_AM_I</code> register value. However, trying this, yields a NAK. Reading the application notes shows we have to do the following start up sequence.
The address is actually supposed to be <code class="language-plaintext highlighter-rouge">0x19</code> to upper 7bits only when communicating and  and 0x33 / 0x32 includes the LSB bit which defines if it is a read or write.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">     <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">lis2dh12_measurement</span><span class="p">(</span><span class="n">ta</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">TestArgs</span><span class="p">)</span> <span class="p">{</span>

            <span class="nn">defmt</span><span class="p">::</span><span class="nd">warn!</span><span class="p">(</span><span class="s">"A LIS2DH12 sensor must be connected to the board on pins A9 (SCL) &amp; A10 (SDA) for this test to work"</span><span class="p">);</span>

            <span class="k">let</span> <span class="k">mut</span> <span class="n">response</span> <span class="o">=</span><span class="p">[</span><span class="mi">0u8</span><span class="p">];</span>

            <span class="c1">// Read the WHO_AM_I register</span>
            <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="n">ta</span><span class="py">.i2c</span><span class="nf">.write_read</span><span class="p">(</span><span class="mi">0x19</span><span class="p">,</span> <span class="o">&amp;</span><span class="p">[</span><span class="mi">0x0F</span><span class="p">],</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">response</span><span class="p">);</span>

            <span class="k">match</span> <span class="n">result</span> <span class="p">{</span>
                <span class="nf">Ok</span><span class="p">(())</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="nd">assert!</span><span class="p">(</span><span class="n">response</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0x33</span><span class="p">);</span>
                    <span class="nn">defmt</span><span class="p">::</span><span class="nd">info!</span><span class="p">(</span><span class="s">"WHO_AM_I response as expected = {:x} "</span><span class="p">,</span><span class="n">response</span><span class="p">)</span>
                <span class="p">},</span>
                <span class="nf">Err</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">error!</span><span class="p">(</span><span class="s">"I2C error: {:x}. response: {}"</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">response</span><span class="p">),</span>
            <span class="p">}</span>

        <span class="p">}</span>
    <span class="p">}</span>
    </code></pre></figure>

<p>When compiling and running <code class="language-plaintext highlighter-rouge">DEFMT_LOG=info cargo test -p testsuite --target thumbv7em-none-eabi --bin gn_i2c</code> we get the temperature and the humidity and additionality also the <code class="language-plaintext highlighter-rouge">WHO_AM_I</code> response</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">      ────────────────────────────────────────────────────────────────────────────────
    <span class="o">(</span>1/2<span class="o">)</span> running <span class="sb">`</span>lis2dh12_measurement<span class="sb">`</span>...
    └─ gn_i2c::tests::__defmt_test_entry @ src/gn_i2c.rs:71
    WARN  A LIS2DH12 sensor must be connected to the board on pins A9 <span class="o">(</span>SCL<span class="o">)</span> &amp; A10 <span class="o">(</span>SDA<span class="o">)</span> <span class="k">for </span>this <span class="nb">test </span>to work
    └─ gn_i2c::tests::lis2dh12_measurement @ src/gn_i2c.rs:73
    INFO  WHO_AM_I response as expected <span class="o">=</span> <span class="o">[</span>33] 
    └─ gn_i2c::tests::lis2dh12_measurement @ src/gn_i2c.rs:83
    <span class="o">(</span>2/2<span class="o">)</span> running <span class="sb">`</span>shtc3_measurement<span class="sb">`</span>...
    </code></pre></figure>

<p>Check out <a href="https://github.com/maebli/stm32wlxx-hal">my fork</a> of the original repos for the new additonal test of the generic node.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 60/100 - reading the generic node’s sensors</title><link href="https://maebli.github.io/archive/2022-10-03-100rust-60/" rel="alternate" type="text/html" title="Rust challenge 60/100 - reading the generic node’s sensors" /><published>2022-10-03T21:30:00+00:00</published><updated>2022-10-03T21:30:00+00:00</updated><id>https://maebli.github.io/archive/100rust-60</id><content type="html" xml:base="https://maebli.github.io/archive/2022-10-03-100rust-60/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#59th-challenge">59th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="59th-challenge">59th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Build on yesterday’s example and actually read the temperature and the humidity from the sensor</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Lets start from a template again, same folder as yesterday.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    cargo generate <span class="se">\</span>
    <span class="nt">--git</span> https://github.com/stm32-rs/stm32wlxx-hal<span class="se">\</span>
    <span class="nt">--name</span> stm32
    </code></pre></figure>

<p>The template, looks like this, when running <code class="language-plaintext highlighter-rouge">tree -L 3</code></p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    <span class="nb">.</span>
    ├── CHANGELOG.md
    ├── Cargo.lock
    ├── Cargo.toml
    ├── LICENSE-APACHE
    ├── LICENSE-MIT
    ├── README.md
    ├── examples
    │   ├── Cargo.toml
    │   ├── examples
    │   └── src
    ├── hal
    │   ├── Cargo.toml
    │   └── src
    ├── lora-e5-bsp
    │   ├── Cargo.toml
    │   ├── README.md
    │   └── src
    ├── memory.x
    ├── nucleo-wl55jc-bsp
    │   ├── Cargo.toml
    │   ├── README.md
    │   └── src
    ├── rustfmt.toml
    └── testsuite
        ├── Cargo.toml
        ├── README.md
        ├── runall.py
        └── src
    </code></pre></figure>

<p><img src="/assets/img/humiditiytempi2cslave.png" alt="" /></p>

<p>Lets revisit the commands. Yesterday we sucesfully read out the id of the sensor. Today we want to get some tempeperature readings.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>| Command         | Value   |
| --------        | ------- |
| Sleep           | 0xB098  |
| Wakeup          | 0x3517  |
| measurement cmd | 0x7866  |
| readout id      | 0xEFC8  |
</code></pre></div></div>

<p>I actually used the measurement command with clock stretching that reads the rh value first. The formula for calculating the temp and humidity was taken from the datasheet.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="nd">#![no_std]</span>
    <span class="nd">#![no_main]</span>

    <span class="k">use</span> <span class="nn">defmt</span><span class="p">::</span><span class="n">unwrap</span><span class="p">;</span>
    <span class="k">use</span> <span class="n">defmt_rtt</span> <span class="k">as</span> <span class="n">_</span><span class="p">;</span> <span class="c1">// global logger</span>
    <span class="k">use</span> <span class="nn">nucleo_wl55jc_bsp</span><span class="p">::</span><span class="nn">hal</span><span class="p">::{</span>
        <span class="nn">cortex_m</span><span class="p">::{</span><span class="k">self</span><span class="p">,</span> <span class="nn">delay</span><span class="p">::</span><span class="n">Delay</span><span class="p">},</span>
        <span class="nn">embedded_hal</span><span class="p">::</span><span class="nn">blocking</span><span class="p">::</span><span class="nn">i2c</span><span class="p">::{</span><span class="n">WriteRead</span><span class="p">,</span><span class="n">Write</span><span class="p">,</span><span class="n">Read</span><span class="p">},</span>
        <span class="nn">gpio</span><span class="p">::{</span><span class="n">pins</span><span class="p">,</span> <span class="n">Output</span><span class="p">,</span> <span class="n">PinState</span><span class="p">,</span><span class="n">PortB</span><span class="p">,</span><span class="n">PortA</span><span class="p">},</span>
        <span class="nn">i2c</span><span class="p">::{</span><span class="n">I2c1</span><span class="p">},</span>
        <span class="nn">pac</span><span class="p">::{</span><span class="k">self</span><span class="p">},</span>
        <span class="n">rcc</span><span class="p">,</span>
        <span class="nn">util</span><span class="p">::</span><span class="n">new_delay</span><span class="p">,</span>
    <span class="p">};</span>
    <span class="k">use</span> <span class="n">panic_probe</span> <span class="k">as</span> <span class="n">_</span><span class="p">;</span>

    <span class="k">const</span> <span class="n">I2C_FREQUENCY</span><span class="p">:</span> <span class="nb">u32</span> <span class="o">=</span> <span class="mi">100_000</span><span class="p">;</span>

    <span class="nd">#[defmt_test::tests]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>
        <span class="k">use</span> <span class="k">super</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

        <span class="k">struct</span> <span class="n">TestArgs</span> <span class="p">{</span>
            <span class="n">i2c</span><span class="p">:</span> <span class="n">I2c1</span><span class="o">&lt;</span><span class="p">(</span><span class="nn">pins</span><span class="p">::</span><span class="n">A9</span><span class="p">,</span> <span class="nn">pins</span><span class="p">::</span><span class="n">A10</span><span class="p">)</span><span class="o">&gt;</span><span class="p">,</span>
            <span class="n">delay</span><span class="p">:</span> <span class="n">Delay</span><span class="p">,</span>
        <span class="p">}</span>

        <span class="nd">#[init]</span>
        <span class="k">fn</span> <span class="nf">init</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="n">TestArgs</span> <span class="p">{</span>
            <span class="nn">cortex_m</span><span class="p">::</span><span class="nn">interrupt</span><span class="p">::</span><span class="nf">free</span><span class="p">(|</span><span class="n">cs</span><span class="p">|</span> <span class="p">{</span>
                <span class="k">let</span> <span class="k">mut</span> <span class="n">dp</span><span class="p">:</span> <span class="nn">pac</span><span class="p">::</span><span class="n">Peripherals</span> <span class="o">=</span> <span class="nd">unwrap!</span><span class="p">(</span><span class="nn">pac</span><span class="p">::</span><span class="nn">Peripherals</span><span class="p">::</span><span class="nf">take</span><span class="p">());</span>
                <span class="k">let</span> <span class="n">cp</span><span class="p">:</span> <span class="nn">pac</span><span class="p">::</span><span class="n">CorePeripherals</span> <span class="o">=</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">unwrap!</span><span class="p">(</span><span class="nn">pac</span><span class="p">::</span><span class="nn">CorePeripherals</span><span class="p">::</span><span class="nf">take</span><span class="p">());</span>

                <span class="k">unsafe</span> <span class="p">{</span> <span class="nn">rcc</span><span class="p">::</span><span class="nf">set_sysclk_msi_max</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.FLASH</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.PWR</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.RCC</span><span class="p">,</span> <span class="n">cs</span><span class="p">)</span> <span class="p">};</span>
                <span class="k">let</span> <span class="n">gpioa</span><span class="p">:</span> <span class="n">PortA</span> <span class="o">=</span> <span class="nn">PortA</span><span class="p">::</span><span class="nf">split</span><span class="p">(</span><span class="n">dp</span><span class="py">.GPIOA</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.RCC</span><span class="p">);</span>
                <span class="k">let</span> <span class="n">gpiob</span><span class="p">:</span> <span class="n">PortB</span> <span class="o">=</span> <span class="nn">PortB</span><span class="p">::</span><span class="nf">split</span><span class="p">(</span><span class="n">dp</span><span class="py">.GPIOB</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.RCC</span><span class="p">);</span>
     
                <span class="k">let</span> <span class="k">mut</span> <span class="n">sensor_power_enable</span><span class="p">:</span> <span class="n">Output</span><span class="o">&lt;</span><span class="nn">pins</span><span class="p">::</span><span class="n">B12</span><span class="o">&gt;</span> <span class="o">=</span>
                    <span class="nn">cortex_m</span><span class="p">::</span><span class="nn">interrupt</span><span class="p">::</span><span class="nf">free</span><span class="p">(|</span><span class="n">cs</span><span class="p">|</span> <span class="nn">Output</span><span class="p">::</span><span class="nf">default</span><span class="p">(</span><span class="n">gpiob</span><span class="py">.b12</span><span class="p">,</span> <span class="n">cs</span><span class="p">));</span>


                <span class="c1">// Power the sensor</span>
                <span class="n">sensor_power_enable</span><span class="nf">.set_level</span><span class="p">(</span><span class="nn">PinState</span><span class="p">::</span><span class="n">High</span><span class="p">);</span>

                <span class="c1">// wait for the sensor to be powered up</span>
                <span class="k">let</span> <span class="k">mut</span> <span class="n">delay</span><span class="p">:</span> <span class="n">Delay</span> <span class="o">=</span> <span class="nf">new_delay</span><span class="p">(</span><span class="n">cp</span><span class="py">.SYST</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">dp</span><span class="py">.RCC</span><span class="p">);</span>
                <span class="n">delay</span><span class="nf">.delay_us</span><span class="p">(</span><span class="mi">240</span><span class="p">);</span>

                <span class="k">let</span> <span class="n">i2c</span> <span class="o">=</span> <span class="nn">I2c1</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span>
                    <span class="n">dp</span><span class="py">.I2C1</span><span class="p">,</span>
                    <span class="p">(</span><span class="n">gpioa</span><span class="py">.a9</span><span class="p">,</span> <span class="n">gpioa</span><span class="py">.a10</span><span class="p">),</span>
                    <span class="n">I2C_FREQUENCY</span><span class="p">,</span>
                    <span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.RCC</span><span class="p">,</span>
                    <span class="k">false</span><span class="p">,</span>
                    <span class="n">cs</span><span class="p">,</span>
                    <span class="p">);</span>

                <span class="n">TestArgs</span><span class="p">{</span>
                    <span class="n">i2c</span><span class="p">,</span>
                    <span class="n">delay</span>
                <span class="p">}</span>

            <span class="p">})</span>
        <span class="p">}</span>


        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">shtc3_measurement</span><span class="p">(</span><span class="n">ta</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">TestArgs</span><span class="p">)</span> <span class="p">{</span>
            <span class="nn">defmt</span><span class="p">::</span><span class="nd">warn!</span><span class="p">(</span><span class="s">"A SHTC3 sensor must be connected to the board on pins A9 (SCL) &amp; A10 (SDA) for this test to work"</span><span class="p">);</span>

            <span class="k">let</span> <span class="k">mut</span> <span class="n">response</span><span class="p">:</span> <span class="p">[</span><span class="nb">u8</span><span class="p">;</span> <span class="mi">6</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">;</span> <span class="mi">6</span><span class="p">];</span>

            <span class="c1">// send wake up command</span>
            <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="n">ta</span><span class="py">.i2c</span><span class="nf">.write</span><span class="p">(</span><span class="mi">0x70</span><span class="p">,</span> <span class="o">&amp;</span><span class="p">[</span><span class="mi">0x35</span><span class="p">,</span> <span class="mi">0x17</span><span class="p">]);</span>

            <span class="k">match</span> <span class="n">result</span> <span class="p">{</span>
                <span class="nf">Ok</span><span class="p">(())</span> <span class="k">=&gt;</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">info!</span><span class="p">(</span><span class="s">"SHTC3 was woken up"</span><span class="p">),</span>
                <span class="nf">Err</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">error!</span><span class="p">(</span><span class="s">"I2C error: {}"</span><span class="p">,</span> <span class="n">e</span><span class="p">),</span>
            <span class="p">}</span>

            <span class="c1">// get sensor ID</span>
            <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="n">ta</span><span class="py">.i2c</span><span class="nf">.write_read</span><span class="p">(</span><span class="mi">0x70</span><span class="p">,</span> <span class="o">&amp;</span><span class="p">[</span><span class="mi">0xEF</span><span class="p">,</span> <span class="mi">0xC8</span><span class="p">],</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">response</span><span class="p">);</span>

            <span class="k">match</span> <span class="n">result</span> <span class="p">{</span>
                <span class="nf">Ok</span><span class="p">(())</span> <span class="k">=&gt;</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">info!</span><span class="p">(</span><span class="s">"SHTC3 ID = {:x} "</span><span class="p">,</span><span class="n">response</span><span class="p">),</span>
                <span class="nf">Err</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">error!</span><span class="p">(</span><span class="s">"I2C error: {}"</span><span class="p">,</span> <span class="n">e</span><span class="p">),</span>
            <span class="p">}</span>

            <span class="k">for</span> <span class="n">_</span> <span class="k">in</span> <span class="mi">1</span><span class="o">..</span><span class="mi">10</span> <span class="p">{</span>
                <span class="c1">// get measurement read relative humditiy first and enable clock stretching</span>
                <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="n">ta</span><span class="py">.i2c</span><span class="nf">.write_read</span><span class="p">(</span><span class="mi">0x70</span><span class="p">,</span> <span class="o">&amp;</span><span class="p">[</span><span class="mi">0x5C</span><span class="p">,</span> <span class="mi">0x24</span><span class="p">],</span><span class="o">&amp;</span><span class="k">mut</span> <span class="n">response</span><span class="p">);</span>

                <span class="k">match</span> <span class="n">result</span> <span class="p">{</span>
                    <span class="nf">Ok</span><span class="p">(())</span> <span class="k">=&gt;</span> <span class="p">{</span>
                        <span class="nn">defmt</span><span class="p">::</span><span class="nd">info!</span><span class="p">(</span><span class="s">"response:{:x}"</span><span class="p">,</span><span class="n">response</span><span class="p">);</span>
                        <span class="k">let</span> <span class="n">relative_humidity</span> <span class="o">=</span> <span class="mf">100.0</span><span class="o">*</span><span class="p">((</span><span class="n">response</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">as</span> <span class="nb">u16</span> <span class="o">+</span> <span class="p">((</span><span class="n">response</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">as</span> <span class="nb">u16</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="p">))</span> <span class="k">as</span> <span class="nb">f32</span><span class="p">)</span><span class="o">/</span><span class="mf">65535.0</span><span class="p">;</span>
                        <span class="k">let</span> <span class="n">temperature</span> <span class="o">=</span> <span class="p">((</span><span class="n">response</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="k">as</span> <span class="nb">u16</span> <span class="o">+</span> <span class="p">((</span><span class="n">response</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="k">as</span> <span class="nb">u16</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="p">))</span> <span class="k">as</span> <span class="nb">f32</span><span class="p">)</span><span class="o">*</span><span class="mf">175.0</span><span class="o">/</span><span class="mf">65535.0</span> <span class="o">-</span> <span class="mf">45.0</span><span class="p">;</span>
                        <span class="nn">defmt</span><span class="p">::</span><span class="nd">info!</span><span class="p">(</span><span class="s">"rh {}%"</span><span class="p">,</span> <span class="n">relative_humidity</span><span class="p">);</span>
                        <span class="nn">defmt</span><span class="p">::</span><span class="nd">info!</span><span class="p">(</span><span class="s">"temp {}°C"</span><span class="p">,</span> <span class="n">temperature</span><span class="p">);</span>
                    <span class="p">},</span>
                    <span class="nf">Err</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">error!</span><span class="p">(</span><span class="s">"I2C error: {}"</span><span class="p">,</span> <span class="n">e</span><span class="p">),</span>
                <span class="p">}</span>
                <span class="n">ta</span><span class="py">.delay</span><span class="nf">.delay_ms</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>

    <span class="p">}</span>
    </code></pre></figure>

<p>When compiling and running <code class="language-plaintext highlighter-rouge">DEFMT_LOG=info cargo test -p testsuite --target thumbv7em-none-eabi --bin gn_i2c</code> we get the temperature and the humidity! yay, the crc I left untouched for now.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    ───────────────────────────────────────────────────────────────────────────────
    <span class="o">(</span>1/1<span class="o">)</span> running <span class="sb">`</span>shtc3_measurement<span class="sb">`</span>...
    └─ gn_i2c::tests::__defmt_test_entry @ src/gn_i2c.rs:68
    WARN  A SHTC3 sensor must be connected to the board on pins A9 <span class="o">(</span>SCL<span class="o">)</span> &amp; A10 <span class="o">(</span>SDA<span class="o">)</span> <span class="k">for </span>this <span class="nb">test </span>to work
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:69
    INFO  SHTC3 was woken up
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:77
    INFO  SHTC3 ID <span class="o">=</span> <span class="o">[</span>8, 87, 5b, ff, ff, ff] 
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:85
    INFO  response:[7d, 36, 99, 67, 9c, 3e]
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:95
    INFO  rh 48.91127%
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:98
    INFO  temp 25.827805°C
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:99
    INFO  response:[7d, 41, f6, 67, a7, 11]
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:95
    INFO  rh 48.928055%
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:98
    INFO  temp 25.857178°C
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:99
    INFO  response:[7d, 3b, d5, 67, 94, 87]
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:95
    INFO  rh 48.9189%
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:98
    INFO  temp 25.806442°C
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:99
    INFO  response:[7d, 36, 99, 67, a1, b7]
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:95
    INFO  rh 48.91127%
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:98
    INFO  temp 25.841156°C
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:99
    INFO  response:[7d, 37, a8, 67, a2, e4]
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:95
    INFO  rh 48.912796%
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:98
    INFO  temp 25.843826°C
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:99
    INFO  response:[7d, 44, 3, 67, 99, cb]
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:95
    INFO  rh 48.932632%
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:98
    INFO  temp 25.819794°C
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:99
    INFO  response:[7d, 31, e, 67, 9f, 6d]
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:95
    INFO  rh 48.90364%
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:98
    INFO  temp 25.835815°C
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:99
    INFO  response:[7d, 42, a5, 67, af, a8]
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:95
    INFO  rh 48.92958%
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:98
    INFO  temp 25.87854°C
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:99
    INFO  response:[7d, 2e, 63, 67, a2, e4]
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:95
    INFO  rh 48.899063%
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:98
    INFO  temp 25.843826°C
    └─ gn_i2c::tests::shtc3_measurement @ src/gn_i2c.rs:99
    all tests passed!
    └─ gn_i2c::tests::__defmt_test_entry @ src/gn_i2c.rs:19
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 59/100 - talking to the generic node’s sensors</title><link href="https://maebli.github.io/archive/2022-10-02-100rust-59/" rel="alternate" type="text/html" title="Rust challenge 59/100 - talking to the generic node’s sensors" /><published>2022-10-02T21:30:00+00:00</published><updated>2022-10-02T21:30:00+00:00</updated><id>https://maebli.github.io/archive/100rust-59</id><content type="html" xml:base="https://maebli.github.io/archive/2022-10-02-100rust-59/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#59th-challenge">59th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="59th-challenge">59th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Build on yesterday’s example and use the humdity and temperature sensor! 
Here is a picture of the generic node again. Its a piece of hardware with an STM32WL5x and has a bunch of sensors and actuators
as well as the possibility to use LoRaWAN.</p>

<p><img src="/assets/img/genericnode.png" alt="" /></p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Lets start from a template again, same folder as yesterday.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    cargo generate <span class="se">\</span>
    <span class="nt">--git</span> https://github.com/stm32-rs/stm32wlxx-hal<span class="se">\</span>
    <span class="nt">--name</span> stm32
    </code></pre></figure>

<p>The template, looks like this, when running <code class="language-plaintext highlighter-rouge">tree -L 3</code></p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    <span class="nb">.</span>
    ├── CHANGELOG.md
    ├── Cargo.lock
    ├── Cargo.toml
    ├── LICENSE-APACHE
    ├── LICENSE-MIT
    ├── README.md
    ├── examples
    │   ├── Cargo.toml
    │   ├── examples
    │   └── src
    ├── hal
    │   ├── Cargo.toml
    │   └── src
    ├── lora-e5-bsp
    │   ├── Cargo.toml
    │   ├── README.md
    │   └── src
    ├── memory.x
    ├── nucleo-wl55jc-bsp
    │   ├── Cargo.toml
    │   ├── README.md
    │   └── src
    ├── rustfmt.toml
    └── testsuite
        ├── Cargo.toml
        ├── README.md
        ├── runall.py
        └── src
    </code></pre></figure>

<p><img src="/assets/img/humiditiytempi2cslave.png" alt="" /></p>

<p>So the i2c slave has the address <code class="language-plaintext highlighter-rouge">0x70</code> and is connected to first i2c bus of the stm32wl (<code class="language-plaintext highlighter-rouge">SDA</code> = <code class="language-plaintext highlighter-rouge">PA10</code> and <code class="language-plaintext highlighter-rouge">SCL</code> = <code class="language-plaintext highlighter-rouge">PA09</code> ). The slave has the part number <code class="language-plaintext highlighter-rouge">SHTC3</code> which is a “±2% (20-80%RH) Digital humidity and temperature sensor” by the company senserion.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>| Command         | Value   |
| --------        | ------- |
| Sleep           | 0xB098  |
| Wakeup          | 0x3517  |
| measurement cmd | 0x7866  |
| readout id      | 0xEFC8  |
</code></pre></div></div>

<p>The measurement command is without clockststreching and reading temperature first. To get the last measurement <em>“by sending a START condition followed by an I2C read header. The sensor will acknowledge the reception of the read header and send two bytes of data followed by one byte CRC checksum and another two bytes of data followed by one byte CRC checksum.”</em></p>

<p>After starting, I realized, that the reposioriy already contains a very similar test case in the <code class="language-plaintext highlighter-rouge">i2c</code> file for <code class="language-plaintext highlighter-rouge">sht3x</code> which has a slave address of <code class="language-plaintext highlighter-rouge">0x44</code>. There is also an offical <code class="language-plaintext highlighter-rouge">c</code> diver which can be used as a reference which is avaibable under <a href="https://github.com/Sensirion/embedded-sht">documentation</a>.</p>

<p>More importantly, however, there are load switched for the i2c slaves which I did not see at first. You must enable <code class="language-plaintext highlighter-rouge">B12</code> so the sensors are powered. It took me longer than it should have to realize this.. As well as this a timeout of 240uS must be made when booting the device. Because I ran out of time I’m only going to read out the id of the i2c slave for now.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="nd">#![no_std]</span>
    <span class="nd">#![no_main]</span>

    <span class="k">use</span> <span class="nn">defmt</span><span class="p">::</span><span class="n">unwrap</span><span class="p">;</span>
    <span class="k">use</span> <span class="n">defmt_rtt</span> <span class="k">as</span> <span class="n">_</span><span class="p">;</span> <span class="c1">// global logger</span>
    <span class="k">use</span> <span class="nn">nucleo_wl55jc_bsp</span><span class="p">::</span><span class="nn">hal</span><span class="p">::{</span>
        <span class="nn">cortex_m</span><span class="p">::{</span><span class="k">self</span><span class="p">,</span> <span class="nn">delay</span><span class="p">::</span><span class="n">Delay</span><span class="p">},</span>
        <span class="nn">embedded_hal</span><span class="p">::</span><span class="nn">blocking</span><span class="p">::</span><span class="nn">i2c</span><span class="p">::{</span><span class="n">WriteRead</span><span class="p">,</span><span class="n">Write</span><span class="p">},</span>
        <span class="nn">gpio</span><span class="p">::{</span><span class="n">pins</span><span class="p">,</span> <span class="n">Output</span><span class="p">,</span> <span class="n">PinState</span><span class="p">,</span><span class="n">PortB</span><span class="p">,</span><span class="n">PortA</span><span class="p">},</span>
        <span class="nn">i2c</span><span class="p">::{</span><span class="n">I2c1</span><span class="p">},</span>
        <span class="nn">pac</span><span class="p">::{</span><span class="k">self</span><span class="p">},</span>
        <span class="n">rcc</span><span class="p">,</span>
        <span class="nn">util</span><span class="p">::</span><span class="n">new_delay</span><span class="p">,</span>
    <span class="p">};</span>
    <span class="k">use</span> <span class="n">panic_probe</span> <span class="k">as</span> <span class="n">_</span><span class="p">;</span>

    <span class="k">const</span> <span class="n">I2C_FREQUENCY</span><span class="p">:</span> <span class="nb">u32</span> <span class="o">=</span> <span class="mi">100_000</span><span class="p">;</span>

    <span class="nd">#[defmt_test::tests]</span>
    <span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>
        <span class="k">use</span> <span class="k">super</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

        <span class="nd">#[init]</span>
        <span class="k">fn</span> <span class="nf">init</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="n">I2c1</span><span class="o">&lt;</span><span class="p">(</span><span class="nn">pins</span><span class="p">::</span><span class="n">A9</span><span class="p">,</span> <span class="nn">pins</span><span class="p">::</span><span class="n">A10</span><span class="p">)</span><span class="o">&gt;</span> <span class="p">{</span>
            <span class="nn">cortex_m</span><span class="p">::</span><span class="nn">interrupt</span><span class="p">::</span><span class="nf">free</span><span class="p">(|</span><span class="n">cs</span><span class="p">|</span> <span class="p">{</span>
                <span class="k">let</span> <span class="k">mut</span> <span class="n">dp</span><span class="p">:</span> <span class="nn">pac</span><span class="p">::</span><span class="n">Peripherals</span> <span class="o">=</span> <span class="nd">unwrap!</span><span class="p">(</span><span class="nn">pac</span><span class="p">::</span><span class="nn">Peripherals</span><span class="p">::</span><span class="nf">take</span><span class="p">());</span>
                <span class="k">let</span> <span class="n">cp</span><span class="p">:</span> <span class="nn">pac</span><span class="p">::</span><span class="n">CorePeripherals</span> <span class="o">=</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">unwrap!</span><span class="p">(</span><span class="nn">pac</span><span class="p">::</span><span class="nn">CorePeripherals</span><span class="p">::</span><span class="nf">take</span><span class="p">());</span>

                <span class="k">unsafe</span> <span class="p">{</span> <span class="nn">rcc</span><span class="p">::</span><span class="nf">set_sysclk_msi_max</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.FLASH</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.PWR</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.RCC</span><span class="p">,</span> <span class="n">cs</span><span class="p">)</span> <span class="p">};</span>
                <span class="k">let</span> <span class="n">gpioa</span><span class="p">:</span> <span class="n">PortA</span> <span class="o">=</span> <span class="nn">PortA</span><span class="p">::</span><span class="nf">split</span><span class="p">(</span><span class="n">dp</span><span class="py">.GPIOA</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.RCC</span><span class="p">);</span>
                <span class="k">let</span> <span class="n">gpiob</span><span class="p">:</span> <span class="n">PortB</span> <span class="o">=</span> <span class="nn">PortB</span><span class="p">::</span><span class="nf">split</span><span class="p">(</span><span class="n">dp</span><span class="py">.GPIOB</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.RCC</span><span class="p">);</span>
     
                <span class="k">let</span> <span class="k">mut</span> <span class="n">sensor_power_enable</span><span class="p">:</span> <span class="n">Output</span><span class="o">&lt;</span><span class="nn">pins</span><span class="p">::</span><span class="n">B12</span><span class="o">&gt;</span> <span class="o">=</span>
                    <span class="nn">cortex_m</span><span class="p">::</span><span class="nn">interrupt</span><span class="p">::</span><span class="nf">free</span><span class="p">(|</span><span class="n">cs</span><span class="p">|</span> <span class="nn">Output</span><span class="p">::</span><span class="nf">default</span><span class="p">(</span><span class="n">gpiob</span><span class="py">.b12</span><span class="p">,</span> <span class="n">cs</span><span class="p">));</span>


                <span class="c1">// Power the sensor</span>
                <span class="n">sensor_power_enable</span><span class="nf">.set_level</span><span class="p">(</span><span class="nn">PinState</span><span class="p">::</span><span class="n">High</span><span class="p">);</span>
                <span class="k">let</span> <span class="k">mut</span> <span class="n">delay</span><span class="p">:</span> <span class="n">Delay</span> <span class="o">=</span> <span class="nf">new_delay</span><span class="p">(</span><span class="n">cp</span><span class="py">.SYST</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">dp</span><span class="py">.RCC</span><span class="p">);</span>
                <span class="c1">// wait for the sensor to be powered up</span>

                <span class="n">delay</span><span class="nf">.delay_us</span><span class="p">(</span><span class="mi">240</span><span class="p">);</span>

                <span class="nn">I2c1</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span>
                    <span class="n">dp</span><span class="py">.I2C1</span><span class="p">,</span>
                    <span class="p">(</span><span class="n">gpioa</span><span class="py">.a9</span><span class="p">,</span> <span class="n">gpioa</span><span class="py">.a10</span><span class="p">),</span>
                    <span class="n">I2C_FREQUENCY</span><span class="p">,</span>
                    <span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.RCC</span><span class="p">,</span>
                    <span class="k">false</span><span class="p">,</span>
                    <span class="n">cs</span><span class="p">,</span>
                <span class="p">)</span>
            <span class="p">})</span>
        <span class="p">}</span>


        <span class="nd">#[test]</span>
        <span class="k">fn</span> <span class="nf">shtc3_measurement</span><span class="p">(</span><span class="n">i2c</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">I2c1</span><span class="o">&lt;</span><span class="p">(</span><span class="nn">pins</span><span class="p">::</span><span class="n">A9</span><span class="p">,</span> <span class="nn">pins</span><span class="p">::</span><span class="n">A10</span><span class="p">)</span><span class="o">&gt;</span><span class="p">)</span> <span class="p">{</span>
            <span class="nn">defmt</span><span class="p">::</span><span class="nd">warn!</span><span class="p">(</span><span class="s">"A SHTC3 sensor must be connected to the board on pins A9 (SCL) &amp; A10 (SDA) for this test to work"</span><span class="p">);</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">cmd</span><span class="p">:</span> <span class="p">[</span><span class="nb">u8</span><span class="p">;</span> <span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0x35</span><span class="p">,</span> <span class="mi">0x17</span><span class="p">];</span>
            <span class="k">let</span> <span class="k">mut</span> <span class="n">response</span><span class="p">:</span> <span class="p">[</span><span class="nb">u8</span><span class="p">;</span> <span class="mi">3</span><span class="p">]</span> <span class="o">=</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="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="n">i2c</span><span class="nf">.write</span><span class="p">(</span><span class="mi">0x70</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">cmd</span><span class="p">);</span>

            <span class="k">match</span> <span class="n">result</span> <span class="p">{</span>
                <span class="nf">Ok</span><span class="p">(())</span> <span class="k">=&gt;</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">info!</span><span class="p">(</span><span class="s">"SHTC3 was woken up"</span><span class="p">),</span>
                <span class="nf">Err</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">error!</span><span class="p">(</span><span class="s">"I2C error: {}"</span><span class="p">,</span> <span class="n">e</span><span class="p">),</span>
            <span class="p">}</span>

            <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0xEF</span><span class="p">,</span> <span class="mi">0xC8</span><span class="p">];</span>

            <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="n">i2c</span><span class="nf">.write_read</span><span class="p">(</span><span class="mi">0x70</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">cmd</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">response</span><span class="p">);</span>

            <span class="k">match</span> <span class="n">result</span> <span class="p">{</span>
                <span class="nf">Ok</span><span class="p">(())</span> <span class="k">=&gt;</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">info!</span><span class="p">(</span><span class="s">"SHTC3 ID = {:x} "</span><span class="p">,</span><span class="n">response</span><span class="p">),</span>
                <span class="nf">Err</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">error!</span><span class="p">(</span><span class="s">"I2C error: {}"</span><span class="p">,</span> <span class="n">e</span><span class="p">),</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    </code></pre></figure>

<p>When compiling and running <code class="language-plaintext highlighter-rouge">DEFMT_LOG=info cargo test -p testsuite --target thumbv7em-none-eabi --bin gn_i2c</code>we get</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    <span class="o">(</span>1/1<span class="o">)</span> running <span class="sb">`</span>shtc3_measurement<span class="sb">`</span>...
    └─ i2c::tests::__defmt_test_entry @ src/i2c.rs:57
    WARN  A SHTC3 sensor must be connected to the board on pins A9 <span class="o">(</span>SCL<span class="o">)</span> &amp; A10 <span class="o">(</span>SDA<span class="o">)</span> <span class="k">for </span>this <span class="nb">test </span>to work
    └─ i2c::tests::shtc3_measurement @ src/i2c.rs:58
    INFO  SHTC3 was woken up
    └─ i2c::tests::shtc3_measurement @ src/i2c.rs:65
    INFO  SHTC3 ID <span class="o">=</span> <span class="o">[</span>8, 87, 5b] 
    └─ i2c::tests::shtc3_measurement @ src/i2c.rs:74
    all tests passed!
    └─ i2c::tests::__defmt_test_entry @ src/i2c.rs:19
    ───────────────────────────────────────────────
    See the repo on <span class="o">[</span>as a fork of the original repos]<span class="o">(</span>https://github.com/maebli/stm32wlxx-hal<span class="o">)</span><span class="nb">.</span>  For the lazy, here is the <span class="nb">source </span>embedded into this page, this was extremely simple as it is basically a copy of the existing example gpio-blink
    </code></pre></figure>

<p>The output is <code class="language-plaintext highlighter-rouge">[8, 87, 5b]</code> which means the <code class="language-plaintext highlighter-rouge">CRC</code> is <code class="language-plaintext highlighter-rouge">0xb5</code> according to the datasheet <em>bits 11 &amp; 5 to 0: SHTC3 identifier.</em> <code class="language-plaintext highlighter-rouge">0x887 = 0b100010000111 = 0b1xxxxx000111</code>. The datasheet makes it unclear what this number means, but it can probably be used to id the chip.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 58/100 - making the generic node light up</title><link href="https://maebli.github.io/archive/2022-10-01-100rust-58/" rel="alternate" type="text/html" title="Rust challenge 58/100 - making the generic node light up" /><published>2022-10-01T14:30:00+00:00</published><updated>2022-10-01T14:30:00+00:00</updated><id>https://maebli.github.io/archive/100rust-58</id><content type="html" xml:base="https://maebli.github.io/archive/2022-10-01-100rust-58/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#58th-challenge">58th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="58th-challenge">58th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Build on yesterday’s example and use the rgb led to make things light up! 
Here is a picture of the generic node again. Its a piece of hardware with an STM32WL5x and has a bunch of sensors and actuators
as well as the possibility to use LoRaWAN.</p>

<p><img src="/assets/img/genericnode.png" alt="" /></p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Lets start from a template again, same folder as yesterday.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    cargo generate <span class="se">\</span>
    <span class="nt">--git</span> https://github.com/stm32-rs/stm32wlxx-hal<span class="se">\</span>
    <span class="nt">--name</span> stm32
    </code></pre></figure>

<p>The template, looks like this, when running <code class="language-plaintext highlighter-rouge">tree -L 3</code></p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    <span class="nb">.</span>
    ├── CHANGELOG.md
    ├── Cargo.lock
    ├── Cargo.toml
    ├── LICENSE-APACHE
    ├── LICENSE-MIT
    ├── README.md
    ├── examples
    │   ├── Cargo.toml
    │   ├── examples
    │   └── src
    ├── hal
    │   ├── Cargo.toml
    │   └── src
    ├── lora-e5-bsp
    │   ├── Cargo.toml
    │   ├── README.md
    │   └── src
    ├── memory.x
    ├── nucleo-wl55jc-bsp
    │   ├── Cargo.toml
    │   ├── README.md
    │   └── src
    ├── rustfmt.toml
    └── testsuite
        ├── Cargo.toml
        ├── README.md
        ├── runall.py
        └── src
    </code></pre></figure>

<p>To keep things simple, we will add an additional example, instead of doing something complicated, same as last time. The led is actually 3 leds (RGB) According to the <a href="https://www.genericnode.com/docs/sensor-edition/hardware/se-board/">documentation</a></p>

<p><img src="/assets/img/rgb.png" alt="" /></p>

<p>So the leds are connected to <code class="language-plaintext highlighter-rouge">PB5</code> (red) <code class="language-plaintext highlighter-rouge">PB6</code> (green) and <code class="language-plaintext highlighter-rouge">PB7</code> (blue).</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    <span class="nv">$ DEFMT_LOG</span><span class="o">=</span>trace cargo run-ex gpio-rgbled
        Blocking waiting <span class="k">for </span>file lock on build directory
       Compiling defmt-macros v0.3.2
       Compiling defmt v0.3.2
       Compiling panic-probe v0.3.0
       Compiling defmt-rtt v0.3.2
       Compiling stm32wlxx-hal v0.6.1 <span class="o">(</span>/Volumes/data/4_github/learn-rust/stm32wlxx-hal/hal<span class="o">)</span>
       Compiling examples v0.1.0 <span class="o">(</span>/Volumes/data/4_github/learn-rust/stm32wlxx-hal/examples<span class="o">)</span>
        Finished dev <span class="o">[</span>optimized + debuginfo] target<span class="o">(</span>s<span class="o">)</span> <span class="k">in </span>13.03s
         Running <span class="sb">`</span>probe-run <span class="nt">--chip</span> STM32WLE5JCIx <span class="nt">--connect-under-reset</span> target/thumbv7em-none-eabi/debug/examples/gpio-rgbled<span class="sb">`</span>
    <span class="o">(</span>HOST<span class="o">)</span> INFO  flashing program <span class="o">(</span>11 pages / 11.00 KiB<span class="o">)</span>
    <span class="o">(</span>HOST<span class="o">)</span> INFO  success!
    ────────────────────────────────────────────────────────────────────────────────
    INFO  Starting blinky
    └─ gpio_rgbled::__cortex_m_rt_main @ examples/examples/gpio-rgbled.rs:35

    </code></pre></figure>

<p>See the repo on <a href="https://github.com/maebli/stm32wlxx-hal">as a fork of the original repos</a>.  For the lazy, here is the source embedded into this page, this was extremely simple as it is basically a copy of the existing example gpio-blink</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="c1">// Turns the RGB Led red,green,blue,white,off in a loop</span>
    <span class="c1">// will work only for TTN Generic node with STM32WL5x</span>
    <span class="c1">// see https://github.com/TheThingsIndustries/generic-node-se</span>

    <span class="nd">#![no_std]</span>
    <span class="nd">#![no_main]</span>

    <span class="k">use</span> <span class="n">defmt_rtt</span> <span class="k">as</span> <span class="n">_</span><span class="p">;</span> <span class="c1">// global logger</span>
    <span class="k">use</span> <span class="n">panic_probe</span> <span class="k">as</span> <span class="n">_</span><span class="p">;</span> <span class="c1">// panic handler</span>
    <span class="k">use</span> <span class="nn">stm32wlxx_hal</span><span class="p">::{</span>
        <span class="k">self</span> <span class="k">as</span> <span class="n">hal</span><span class="p">,</span>
        <span class="nn">cortex_m</span><span class="p">::{</span><span class="k">self</span><span class="p">,</span> <span class="nn">delay</span><span class="p">::</span><span class="n">Delay</span><span class="p">},</span>
        <span class="nn">gpio</span><span class="p">::{</span><span class="n">pins</span><span class="p">,</span> <span class="n">Output</span><span class="p">,</span> <span class="n">PinState</span><span class="p">,</span> <span class="n">PortB</span><span class="p">},</span>
        <span class="n">pac</span><span class="p">,</span>
        <span class="nn">util</span><span class="p">::</span><span class="n">new_delay</span><span class="p">,</span>
    <span class="p">};</span>

    <span class="nd">#[hal::cortex_m_rt::entry]</span>
    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="o">!</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">dp</span><span class="p">:</span> <span class="nn">pac</span><span class="p">::</span><span class="n">Peripherals</span> <span class="o">=</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">unwrap!</span><span class="p">(</span><span class="nn">pac</span><span class="p">::</span><span class="nn">Peripherals</span><span class="p">::</span><span class="nf">take</span><span class="p">());</span>
        <span class="k">let</span> <span class="n">cp</span><span class="p">:</span> <span class="nn">pac</span><span class="p">::</span><span class="n">CorePeripherals</span> <span class="o">=</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">unwrap!</span><span class="p">(</span><span class="nn">pac</span><span class="p">::</span><span class="nn">CorePeripherals</span><span class="p">::</span><span class="nf">take</span><span class="p">());</span>

        <span class="k">let</span> <span class="n">gpiob</span><span class="p">:</span> <span class="n">PortB</span> <span class="o">=</span> <span class="nn">PortB</span><span class="p">::</span><span class="nf">split</span><span class="p">(</span><span class="n">dp</span><span class="py">.GPIOB</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.RCC</span><span class="p">);</span>
        <span class="k">let</span> <span class="p">(</span><span class="k">mut</span> <span class="n">red_led</span><span class="p">,</span> <span class="k">mut</span> <span class="n">green_led</span><span class="p">,</span> <span class="k">mut</span> <span class="n">blue_led</span><span class="p">):</span> <span class="p">(</span><span class="n">Output</span><span class="o">&lt;</span><span class="nn">pins</span><span class="p">::</span><span class="n">B5</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">Output</span><span class="o">&lt;</span><span class="nn">pins</span><span class="p">::</span><span class="n">B6</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">Output</span><span class="o">&lt;</span><span class="nn">pins</span><span class="p">::</span><span class="n">B7</span><span class="o">&gt;</span><span class="p">)</span> <span class="o">=</span>
            <span class="nn">cortex_m</span><span class="p">::</span><span class="nn">interrupt</span><span class="p">::</span><span class="nf">free</span><span class="p">(|</span><span class="n">cs</span><span class="p">|</span> <span class="p">{</span>
                <span class="p">(</span>
                    <span class="nn">Output</span><span class="p">::</span><span class="nf">default</span><span class="p">(</span><span class="n">gpiob</span><span class="py">.b5</span><span class="p">,</span> <span class="n">cs</span><span class="p">),</span>
                    <span class="nn">Output</span><span class="p">::</span><span class="nf">default</span><span class="p">(</span><span class="n">gpiob</span><span class="py">.b6</span><span class="p">,</span> <span class="n">cs</span><span class="p">),</span>
                    <span class="nn">Output</span><span class="p">::</span><span class="nf">default</span><span class="p">(</span><span class="n">gpiob</span><span class="py">.b7</span><span class="p">,</span> <span class="n">cs</span><span class="p">),</span>
                <span class="p">)</span>
            <span class="p">});</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">delay</span><span class="p">:</span> <span class="n">Delay</span> <span class="o">=</span> <span class="nf">new_delay</span><span class="p">(</span><span class="n">cp</span><span class="py">.SYST</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">dp</span><span class="py">.RCC</span><span class="p">);</span>

        <span class="nn">defmt</span><span class="p">::</span><span class="nd">info!</span><span class="p">(</span><span class="s">"Starting blinky"</span><span class="p">);</span>

        <span class="k">loop</span> <span class="p">{</span>
            <span class="k">for</span> <span class="o">&amp;</span><span class="n">level</span> <span class="k">in</span> <span class="o">&amp;</span><span class="p">[</span><span class="nn">PinState</span><span class="p">::</span><span class="n">High</span><span class="p">,</span> <span class="nn">PinState</span><span class="p">::</span><span class="n">Low</span><span class="p">]</span> <span class="p">{</span>
                <span class="n">red_led</span><span class="nf">.set_level</span><span class="p">(</span><span class="n">level</span><span class="p">);</span>
                <span class="n">delay</span><span class="nf">.delay_ms</span><span class="p">(</span><span class="mi">600</span><span class="p">);</span>
                <span class="n">green_led</span><span class="nf">.set_level</span><span class="p">(</span><span class="n">level</span><span class="p">);</span>
                <span class="n">delay</span><span class="nf">.delay_ms</span><span class="p">(</span><span class="mi">600</span><span class="p">);</span>
                <span class="n">blue_led</span><span class="nf">.set_level</span><span class="p">(</span><span class="n">level</span><span class="p">);</span>
                <span class="n">delay</span><span class="nf">.delay_ms</span><span class="p">(</span><span class="mi">600</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    </code></pre></figure>

<p>And here is what it looks like:</p>

<p><img src="/assets/img/rbgdemo.gif" alt="" /></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 57/100 - making the generic node buzz</title><link href="https://maebli.github.io/archive/2022-09-29-100rust-57/" rel="alternate" type="text/html" title="Rust challenge 57/100 - making the generic node buzz" /><published>2022-09-29T17:30:00+00:00</published><updated>2022-09-29T17:30:00+00:00</updated><id>https://maebli.github.io/archive/100rust-57</id><content type="html" xml:base="https://maebli.github.io/archive/2022-09-29-100rust-57/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#57th-challenge">57th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="57th-challenge">57th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Build on yesterday’s example and use the buzzer of the generic node to make a buzz! 📣
Here is a picture of the generic node again. Its a piece of hardware with an STM32WL5x and has a bunch of sensors and actuators
as well as the possibility to use LoRaWAN.</p>

<p><img src="/assets/img/genericnode.png" alt="" /></p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Lets start from a template again, same folder as yesterday.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    cargo generate <span class="se">\</span>
    <span class="nt">--git</span> https://github.com/stm32-rs/stm32wlxx-hal<span class="se">\</span>
    <span class="nt">--name</span> stm32
    </code></pre></figure>

<p>The template, looks like this, when running <code class="language-plaintext highlighter-rouge">tree -L 3</code></p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    <span class="nb">.</span>
    ├── CHANGELOG.md
    ├── Cargo.lock
    ├── Cargo.toml
    ├── LICENSE-APACHE
    ├── LICENSE-MIT
    ├── README.md
    ├── examples
    │   ├── Cargo.toml
    │   ├── examples
    │   └── src
    ├── hal
    │   ├── Cargo.toml
    │   └── src
    ├── lora-e5-bsp
    │   ├── Cargo.toml
    │   ├── README.md
    │   └── src
    ├── memory.x
    ├── nucleo-wl55jc-bsp
    │   ├── Cargo.toml
    │   ├── README.md
    │   └── src
    ├── rustfmt.toml
    └── testsuite
        ├── Cargo.toml
        ├── README.md
        ├── runall.py
        └── src
    </code></pre></figure>

<p>To run tests we run <code class="language-plaintext highlighter-rouge">DEFMT_LOG=info cargo test -p testsuite --target thumbv7em-none-eabi --bin pka</code>.</p>

<p>To keep things simple, we will add an additional example, instead of doing something complicated. The buzzer is a “Piezo speaker - provides audible feedback.” According to the <a href="https://www.genericnode.com/docs/sensor-edition/hardware/se-board/">documentation</a>
it is connected to <code class="language-plaintext highlighter-rouge">PA15 - internally connected to the piezo speaker</code>. The schematic can be found under <a href="https://github.com/TheThingsIndustries/generic-node-se/blob/develop/Hardware/sch/sch-stm32wl.pdf">following link</a>. The relevant part looks as follows.</p>

<p><img src="/assets/img/buzzer.png" alt="" /></p>

<p>The datasheet of the buzzer <code class="language-plaintext highlighter-rouge">MLT-7525</code> shows that the oscillation frequency is <code class="language-plaintext highlighter-rouge">2700Hz</code> which you can listen to on<a href="https://www.youtube.com/watch?v=eGZvKFEDAE8">youtube</a> - it sounds annoying. 
<img src="/assets/img/buzzer2.png" alt="" />. So we must toggle the output at the resonant frequency of <code class="language-plaintext highlighter-rouge">2700 Hz</code>, which means we need to toggle the GPIO every <code class="language-plaintext highlighter-rouge">185e-6</code> seconds. This means we toggle -&gt; delay_us(185)permantently to activate the buzzer if we do it very simply and in a blocking manner.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    Michaels-MBP-10:stm32 michael<span class="nv">$ DEFMT_LOG</span><span class="o">=</span>trace cargo run-ex buzzer
        Blocking waiting <span class="k">for </span>file lock on build directory
       Compiling defmt-macros v0.3.2
       Compiling defmt v0.3.2
       Compiling panic-probe v0.3.0
       Compiling defmt-rtt v0.3.2
       Compiling stm32wlxx-hal v0.6.1 <span class="o">(</span>/Volumes/data/4_github/learn-rust/100-rust-snippets/stm32/hal<span class="o">)</span>
       Compiling examples v0.1.0 <span class="o">(</span>/Volumes/data/4_github/learn-rust/100-rust-snippets/stm32/examples<span class="o">)</span>
        Finished dev <span class="o">[</span>optimized + debuginfo] target<span class="o">(</span>s<span class="o">)</span> <span class="k">in </span>10.33s
         Running <span class="sb">`</span>probe-run <span class="nt">--chip</span> STM32WLE5JCIx <span class="nt">--connect-under-reset</span> target/thumbv7em-none-eabi/debug/examples/buzzer<span class="sb">`</span>
    <span class="o">(</span>HOST<span class="o">)</span> INFO  flashing program <span class="o">(</span>11 pages / 11.00 KiB<span class="o">)</span>
    <span class="o">(</span>HOST<span class="o">)</span> INFO  success!
    ────────────────────────────────────────────────────────────────────────────────
    INFO  Starting buzzer
    └─ buzzer::__cortex_m_rt_main @ examples/examples/buzzer.rs:27

    </code></pre></figure>

<p>And here we have it the result running on the target:</p>

<iframe src="https://streamable.com/e/kxsmcw" width="200" height="356" frameborder="0" allowfullscreen=""></iframe>

<p>See the repo on <a href="https://github.com/maebli/stm32wlxx-hal">as a fork of the original repos</a>.  For the lazy, here is the source embedded into this page:</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="c1">// Sounds a buzzer, will work only for TTN Generic node with STM32WL5x</span>
    <span class="c1">// see https://github.com/TheThingsIndustries/generic-node-se</span>
    <span class="c1">// The datasheet of the buzzer `MLT-7525` shows that the oscillation frequency is `2700Hz` so the period</span>
    <span class="c1">// is around 185us</span>

    <span class="nd">#![no_std]</span>
    <span class="nd">#![no_main]</span>

    <span class="k">use</span> <span class="n">defmt_rtt</span> <span class="k">as</span> <span class="n">_</span><span class="p">;</span> <span class="c1">// global logger</span>
    <span class="k">use</span> <span class="n">panic_probe</span> <span class="k">as</span> <span class="n">_</span><span class="p">;</span> <span class="c1">// panic handler</span>

    <span class="k">use</span> <span class="nn">stm32wlxx_hal</span><span class="p">::{</span>
        <span class="k">self</span> <span class="k">as</span> <span class="n">hal</span><span class="p">,</span>
        <span class="nn">cortex_m</span><span class="p">::{</span><span class="k">self</span><span class="p">,</span> <span class="nn">delay</span><span class="p">::</span><span class="n">Delay</span><span class="p">},</span>
        <span class="nn">gpio</span><span class="p">::{</span><span class="n">pins</span><span class="p">,</span> <span class="n">Output</span><span class="p">,</span> <span class="n">PinState</span><span class="p">,</span> <span class="n">PortA</span><span class="p">},</span>
        <span class="n">pac</span><span class="p">,</span>
        <span class="nn">util</span><span class="p">::</span><span class="n">new_delay</span><span class="p">,</span>
    <span class="p">};</span>

    <span class="nd">#[hal::cortex_m_rt::entry]</span>
    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="o">!</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">dp</span><span class="p">:</span> <span class="nn">pac</span><span class="p">::</span><span class="n">Peripherals</span> <span class="o">=</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">unwrap!</span><span class="p">(</span><span class="nn">pac</span><span class="p">::</span><span class="nn">Peripherals</span><span class="p">::</span><span class="nf">take</span><span class="p">());</span>
        <span class="k">let</span> <span class="n">cp</span><span class="p">:</span> <span class="nn">pac</span><span class="p">::</span><span class="n">CorePeripherals</span> <span class="o">=</span> <span class="nn">defmt</span><span class="p">::</span><span class="nd">unwrap!</span><span class="p">(</span><span class="nn">pac</span><span class="p">::</span><span class="nn">CorePeripherals</span><span class="p">::</span><span class="nf">take</span><span class="p">());</span>

        <span class="k">let</span> <span class="n">gpioa</span><span class="p">:</span> <span class="n">PortA</span> <span class="o">=</span> <span class="nn">PortA</span><span class="p">::</span><span class="nf">split</span><span class="p">(</span><span class="n">dp</span><span class="py">.GPIOA</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">dp</span><span class="py">.RCC</span><span class="p">);</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">buzzer</span><span class="p">:</span> <span class="n">Output</span><span class="o">&lt;</span><span class="nn">pins</span><span class="p">::</span><span class="n">A15</span><span class="o">&gt;</span> <span class="o">=</span>
            <span class="nn">cortex_m</span><span class="p">::</span><span class="nn">interrupt</span><span class="p">::</span><span class="nf">free</span><span class="p">(|</span><span class="n">cs</span><span class="p">|</span> <span class="nn">Output</span><span class="p">::</span><span class="nf">default</span><span class="p">(</span><span class="n">gpioa</span><span class="py">.a15</span><span class="p">,</span> <span class="n">cs</span><span class="p">));</span>

        <span class="k">let</span> <span class="k">mut</span> <span class="n">delay</span><span class="p">:</span> <span class="n">Delay</span> <span class="o">=</span> <span class="nf">new_delay</span><span class="p">(</span><span class="n">cp</span><span class="py">.SYST</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">dp</span><span class="py">.RCC</span><span class="p">);</span>

        <span class="nn">defmt</span><span class="p">::</span><span class="nd">info!</span><span class="p">(</span><span class="s">"Starting buzzer"</span><span class="p">);</span>

        <span class="k">loop</span> <span class="p">{</span>
            <span class="k">for</span> <span class="o">&amp;</span><span class="n">level</span> <span class="k">in</span> <span class="o">&amp;</span><span class="p">[</span><span class="nn">PinState</span><span class="p">::</span><span class="n">High</span><span class="p">,</span> <span class="nn">PinState</span><span class="p">::</span><span class="n">Low</span><span class="p">]</span> <span class="p">{</span>
                <span class="n">buzzer</span><span class="nf">.set_level</span><span class="p">(</span><span class="n">level</span><span class="p">);</span>
                <span class="n">delay</span><span class="nf">.delay_us</span><span class="p">(</span><span class="mi">185</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    </code></pre></figure>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 56/100 - first steps with stm32L0 and rust</title><link href="https://maebli.github.io/archive/2022-09-25-100rust-56/" rel="alternate" type="text/html" title="Rust challenge 56/100 - first steps with stm32L0 and rust" /><published>2022-09-26T17:30:00+00:00</published><updated>2022-09-26T17:30:00+00:00</updated><id>https://maebli.github.io/archive/100rust-56</id><content type="html" xml:base="https://maebli.github.io/archive/2022-09-25-100rust-56/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#56th-challenge">56th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="56th-challenge">56th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Use yesterdays preperation and run an example on things network generic node</p>

<p><img src="/assets/img/genericnode.png" alt="" /></p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Lets start from a template again, same folder as yesterday.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    cargo generate <span class="se">\</span>
    <span class="nt">--git</span> https://github.com/stm32-rs/stm32wlxx-hal<span class="se">\</span>
    <span class="nt">--name</span> stm32
    </code></pre></figure>

<p>The template, looks like this, when running <code class="language-plaintext highlighter-rouge">tree -L 3</code></p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    <span class="nb">.</span>
    ├── CHANGELOG.md
    ├── Cargo.lock
    ├── Cargo.toml
    ├── LICENSE-APACHE
    ├── LICENSE-MIT
    ├── README.md
    ├── examples
    │   ├── Cargo.toml
    │   ├── examples
    │   └── src
    ├── hal
    │   ├── Cargo.toml
    │   └── src
    ├── lora-e5-bsp
    │   ├── Cargo.toml
    │   ├── README.md
    │   └── src
    ├── memory.x
    ├── nucleo-wl55jc-bsp
    │   ├── Cargo.toml
    │   ├── README.md
    │   └── src
    ├── rustfmt.toml
    └── testsuite
        ├── Cargo.toml
        ├── README.md
        ├── runall.py
        └── src
    </code></pre></figure>

<p>Now we need an ST-Link to flash the device. We remove the two jumpers on the Nucelo STM32L0 so we can use the ST Link on the nucleo to flash the generic node. Hooking things up is simple, just check the datasheet of the nucleo and of the generic node and connect VCC,GND, NRST, SWD CLK.</p>

<p>Next We try the info example to get the board info by running <code class="language-plaintext highlighter-rouge">DEFMT_LOG=trace cargo run-ex info</code>  and the output prints some information about the board, namly its package and its UID from which some production info could be read for example.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    <span class="nv">$ DEFMT_LOG</span><span class="o">=</span>trace cargo run-ex info
       Compiling defmt-macros v0.3.2
       Compiling defmt v0.3.2
       Compiling panic-probe v0.3.0
       Compiling defmt-rtt v0.3.2
       Compiling stm32wlxx-hal v0.6.1 <span class="o">(</span>/Volumes/data/4_github/learn-rust/100-rust-snippets/stm32/hal<span class="o">)</span>
       Compiling examples v0.1.0 <span class="o">(</span>/Volumes/data/4_github/learn-rust/100-rust-snippets/stm32/examples<span class="o">)</span>
        Finished dev <span class="o">[</span>optimized + debuginfo] target<span class="o">(</span>s<span class="o">)</span> <span class="k">in </span>7.09s
         Running <span class="sb">`</span>probe-run <span class="nt">--chip</span> STM32WLE5JCIx <span class="nt">--connect-under-reset</span> target/thumbv7em-none-eabi/debug/examples/info<span class="sb">`</span>
    <span class="o">(</span>HOST<span class="o">)</span> INFO  flashing program <span class="o">(</span>9 pages / 9.00 KiB<span class="o">)</span>
    <span class="o">(</span>HOST<span class="o">)</span> INFO  success!
    ────────────────────────────────────────────────────────────────────────────────
    Flash size: 256 KiB
    └─ info::__cortex_m_rt_main @ examples/examples/info.rs:15
    Package: Ok<span class="o">(</span>UFQFPN48<span class="o">)</span>
    └─ info::__cortex_m_rt_main @ examples/examples/info.rs:16
    UID64: Uid64 <span class="o">{</span> uid: 3635363406995733 <span class="o">}</span>
    └─ info::__cortex_m_rt_main @ examples/examples/info.rs:17
    UID: Uid <span class="o">{</span> uid: <span class="o">[</span>3080236, 1110528013, 540422710] <span class="o">}</span>
    └─ info::__cortex_m_rt_main @ examples/examples/info.rs:18
    ────────────────────────────────────────────────────────────────────────────────
    <span class="o">(</span>HOST<span class="o">)</span> INFO  device halted without error
    </code></pre></figure>

<p>See the repo on <a href="https://github.com/maebli/100rustsnippets/tree/master/stm32wl">github</a>. The setup looks something like the following:</p>

<p><img src="/assets/img/genericnode2.jpg" alt="" /></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 55/100 - running rust on esp32</title><link href="https://maebli.github.io/archive/2022-09-19-100rust-55/" rel="alternate" type="text/html" title="Rust challenge 55/100 - running rust on esp32" /><published>2022-09-19T17:30:00+00:00</published><updated>2022-09-19T17:30:00+00:00</updated><id>https://maebli.github.io/archive/100rust-55</id><content type="html" xml:base="https://maebli.github.io/archive/2022-09-19-100rust-55/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#55th-challenge">55th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="55th-challenge">55th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Run hello world on an esp32 using rust.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>We need to add some addtional toolchain pieces that are not in a default cargo installation the following command so that esp32 binaries can be built:</p>

<p>Call <code class="language-plaintext highlighter-rouge">cargo install -f ldproxy espflash espmonitor</code></p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    curl <span class="nt">-LO</span> https://github.com/esp-rs/rust-build/releases/download/v1.63.0.2/install-rust-toolchain.sh
    <span class="nb">chmod </span>a+x install-rust-toolchain.sh
    ./install-rust-toolchain.sh
    </code></pre></figure>

<p>At the end, I missed it on my first install, the script tells you to add two lines to your <code class="language-plaintext highlighter-rouge">.bashrc</code> (or whatever shell you are using). This is important! It will not work otherwise.</p>

<p>Lets start from a template:</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    cargo generate <span class="se">\</span>
    <span class="nt">--git</span> https://github.com/ivmarkov/rust-esp32-std-demo <span class="se">\</span>
    <span class="nt">--name</span> esp
    </code></pre></figure>

<p>The template, looks like this, when running <code class="language-plaintext highlighter-rouge">tree -L 3</code></p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    ├── Cargo.toml
    ├── LICENSE-APACHE
    ├── LICENSE-MIT
    ├── README.md
    ├── build.rs
    ├── partitions.csv
    ├── qemu.sh
    ├── sdkconfig.defaults
    ├── sdkconfig.defaults.esp32
    ├── sdkconfig.defaults.esp32s2
    ├── src
    │   └── main.rs
    └── ulp
        └── rust-esp32-ulp-blink
    </code></pre></figure>

<p>Next lets  go into the dir <code class="language-plaintext highlighter-rouge">cd esp</code> and run <code class="language-plaintext highlighter-rouge">rustup override set esp</code> so that we just use esp stuff inside this directory. Output will be</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>info: override toolchain for '../100-rust-snippets/esp' set to 'esp'
</code></pre></div></div>

<p>Next add wifi pass and ssid using env. variables again, or the compiler will hit you with the following error</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>   |
100 | const SSID: &amp;str = env!("RUST_ESP32_STD_DEMO_WIFI_SSID");
    |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = note: this error originates in the macro `env` (in Nightly builds, run with -Z macro-backtrace for more info)

error: environment variable `RUST_ESP32_STD_DEMO_WIFI_PASS` not defined
   --&gt; src/main.rs:103:20
    |
103 | const PASS: &amp;str = env!("RUST_ESP32_STD_DEMO_WIFI_PASS");
    |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
</code></pre></div></div>

<p>Next try to build with <code class="language-plaintext highlighter-rouge">cargo build --release</code> and it should work.</p>

<p>There are a number of runners as usual. I had success running <code class="language-plaintext highlighter-rouge">espflash target/xtensa-esp32-espidf/debug/rust-esp32-std-demo</code> and selecting the right usb port. Warning:  I had to hold down the reset button and release to succesfully flash, to get the thing running.  Do this when the expflash app is trying to connect. Output should be as follows:</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">    <span class="nv">$ </span>espflash target/xtensa-esp32-espidf/debug/rust-esp32-std-demo
    Detected 2 serial ports. Ports which match a known common dev board are highlighted.

    Serial port: /dev/cu.usbserial-0001
    Connecting...

    Unable to connect, retrying with extra delay...
    Unable to connect, retrying with default delay...
    Unable to connect, retrying with extra delay...

    Chip <span class="nb">type</span>:         ESP32 <span class="o">(</span>revision 1<span class="o">)</span>
    Crystal frequency: 40MHz
    Flash size:        4MB
    Features:          WiFi, BT, Dual Core, 240MHz, VRef calibration <span class="k">in </span>efuse, Coding Scheme None
    MAC address:       24:6f:28:7c:e9:20
    App/part. size:    1606624/4128768 bytes, 38.91%
    <span class="o">[</span>00:00:01] <span class="c">########################################      16/16      segment 0x1000                                                                                                                                                                                                    [00:00:00] ########################################       1/1       segment 0x8000                                                                                                                                                                                                    [00:01:36] ########################################     936/936     segment 0x10000                                                                                                                                                                                                   </span>
    Flashing has completed!
    </code></pre></figure>

<p>Thats pretty much it, run <code class="language-plaintext highlighter-rouge">èspflash serial-monitor</code>, hold reset button if needed and you should get something like the following:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Hello from Rust!
More complex print ["foo", "bar"]
Result: 0, 1
</code></pre></div></div>

<p>See the repo on <a href="https://github.com/maebli/100rustsnippets/tree/master/pi-pico-helloworld">github</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 54/100 - duplicate file finder</title><link href="https://maebli.github.io/archive/2022-09-18-100rust-54/" rel="alternate" type="text/html" title="Rust challenge 54/100 - duplicate file finder" /><published>2022-09-18T17:30:00+00:00</published><updated>2022-09-18T17:30:00+00:00</updated><id>https://maebli.github.io/archive/100rust-54</id><content type="html" xml:base="https://maebli.github.io/archive/2022-09-18-100rust-54/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#54th-challenge">54th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="54th-challenge">54th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Find all files that have at least two instances and output them on the terminal.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>This is fairly simple, the result is seen here. This was a lot of fun and could be made into actual tool :)</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">     <span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashSet</span><span class="p">;</span>
    <span class="k">use</span> <span class="nn">clap</span><span class="p">::{</span><span class="n">App</span><span class="p">,</span> <span class="n">Arg</span><span class="p">};</span>

    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

        <span class="k">let</span> <span class="n">matches</span> <span class="o">=</span> <span class="nn">App</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="s">"dupdel"</span><span class="p">)</span>
            <span class="nf">.version</span><span class="p">(</span><span class="s">"1.0"</span><span class="p">)</span>
            <span class="nf">.author</span><span class="p">(</span><span class="s">"Maebli"</span><span class="p">)</span>
            <span class="nf">.about</span><span class="p">(</span><span class="s">"Finds duplicate files in current directory recursively"</span><span class="p">)</span>
            <span class="nf">.arg</span><span class="p">(</span><span class="nn">Arg</span><span class="p">::</span><span class="nf">with_name</span><span class="p">(</span><span class="s">"folder"</span><span class="p">)</span>
                <span class="nf">.short</span><span class="p">(</span><span class="sc">'f'</span><span class="p">)</span>
                <span class="nf">.long</span><span class="p">(</span><span class="s">"folder"</span><span class="p">)</span>
                <span class="nf">.help</span><span class="p">(</span><span class="s">"Specify the folder in which the duplicates should be searched"</span><span class="p">)</span>
                <span class="nf">.takes_value</span><span class="p">(</span><span class="k">true</span><span class="p">))</span>
            <span class="nf">.get_matches</span><span class="p">();</span>

        <span class="k">let</span> <span class="n">folder</span> <span class="o">=</span> <span class="n">matches</span><span class="nf">.value_of</span><span class="p">(</span><span class="s">"folder"</span><span class="p">)</span><span class="nf">.unwrap_or</span><span class="p">(</span><span class="s">"."</span><span class="p">);</span>

        <span class="k">let</span> <span class="n">hash_set</span> <span class="o">=</span> <span class="nn">HashSet</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>

        <span class="nf">find_duplicates</span><span class="p">(</span><span class="n">hash_set</span><span class="p">,</span> <span class="n">folder</span><span class="p">);</span>

    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">find_duplicates</span><span class="p">(</span><span class="k">mut</span> <span class="n">hash_set</span><span class="p">:</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u8</span><span class="o">&gt;&gt;</span><span class="p">,</span> <span class="n">folder</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">HashSet</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u8</span><span class="o">&gt;&gt;</span><span class="p">{</span>

        <span class="k">if</span> <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="n">folder</span><span class="p">)</span> <span class="o">=</span> <span class="nn">std</span><span class="p">::</span><span class="nn">fs</span><span class="p">::</span><span class="nf">read_dir</span><span class="p">(</span><span class="n">folder</span><span class="p">)</span><span class="nf">.ok</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">for</span> <span class="n">entry</span> <span class="k">in</span> <span class="n">folder</span> <span class="p">{</span>
                <span class="k">if</span> <span class="k">let</span> <span class="nf">Ok</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span> <span class="o">=</span> <span class="n">entry</span> <span class="p">{</span>
                    <span class="k">if</span> <span class="n">entry</span><span class="nf">.path</span><span class="p">()</span><span class="nf">.exists</span><span class="p">()</span> <span class="p">{</span>
                        <span class="k">if</span> <span class="n">entry</span><span class="nf">.path</span><span class="p">()</span><span class="nf">.is_dir</span><span class="p">()</span> <span class="p">{</span>
                            <span class="n">hash_set</span> <span class="o">=</span> <span class="nf">find_duplicates</span><span class="p">(</span><span class="n">hash_set</span><span class="p">,</span> <span class="n">entry</span><span class="nf">.path</span><span class="p">()</span><span class="nf">.to_str</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">());</span>
                        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                            <span class="k">let</span> <span class="n">file</span> <span class="o">=</span> <span class="nn">std</span><span class="p">::</span><span class="nn">fs</span><span class="p">::</span><span class="nf">read</span><span class="p">(</span><span class="n">entry</span><span class="nf">.path</span><span class="p">())</span><span class="nf">.unwrap</span><span class="p">();</span>
                            <span class="k">if</span> <span class="n">hash_set</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">file</span><span class="p">)</span> <span class="p">{</span>
                                <span class="nd">println!</span><span class="p">(</span><span class="s">"🪡 Found duplicate: {}"</span><span class="p">,</span> <span class="n">entry</span><span class="nf">.path</span><span class="p">()</span><span class="nf">.to_str</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">());</span>
                            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                                <span class="n">hash_set</span><span class="nf">.insert</span><span class="p">(</span><span class="n">file</span><span class="p">);</span>
                            <span class="p">}</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>

        <span class="n">hash_set</span>
    <span class="p">}</span>

    </code></pre></figure>

<p>See the repo on <a href="https://github.com/maebli/100rustsnippets/tree/master/dupdel">github</a>. Intrestingly enough I found <a href="https://github.com/sahib/rmlint">this</a> article which  describes typical pitfalls and  found <a href="https://github.com/sahib/rmlint">this</a> repos  that is apprently one of the best tools for this task.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 53/100 - running rust on pi-pico</title><link href="https://maebli.github.io/archive/2022-09-17-100rust-53/" rel="alternate" type="text/html" title="Rust challenge 53/100 - running rust on pi-pico" /><published>2022-09-15T17:30:00+00:00</published><updated>2022-09-15T17:30:00+00:00</updated><id>https://maebli.github.io/archive/100rust-53</id><content type="html" xml:base="https://maebli.github.io/archive/2022-09-17-100rust-53/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#53rd-challenge">53rd Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>.</p>

<h2 id="53rd-challenge">53rd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Run hello world on a pi pico using rust.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Start from a template</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cargo generate \
--git https://github.com/rp-rs/rp2040-project-template \
--branch main \
--name pi-pico-helloworld
</code></pre></div></div>

<p>The template, looks like this, when running <code class="language-plaintext highlighter-rouge">tree -L 3</code></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>.
├── CODE_OF_CONDUCT.md
├── Cargo.lock
├── Cargo.toml
├── Embed.toml
├── README.md
├── build.rs
├── debug_probes.md
├── memory.x
├── src
│   └── main.rs
└── target
    ├── CACHEDIR.TAG
    ├── release
    │   ├── build
    │   ├── deps
    │   ├── examples
    │   └── incremental
    └── thumbv6m-none-eabi
        ├── CACHEDIR.TAG
        └── release
</code></pre></div></div>

<p>There are a number of runners described in the example. Lets keep it simple and use UF2. We hold the reset button on the pico and plug it into the computer so it is in boot mode. 
Then we change our <code class="language-plaintext highlighter-rouge">.cargo/config</code> so the runner says <code class="language-plaintext highlighter-rouge">runner = "elf2uf2-rs -d</code>. Its already in the file, just need to uncomment it. We will reduce the blinky example even more, to just “hello world”.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="nd">#![no_std]</span>
    <span class="nd">#![no_main]</span>

    <span class="k">use</span> <span class="nn">bsp</span><span class="p">::</span><span class="n">entry</span><span class="p">;</span>
    <span class="k">use</span> <span class="nn">defmt</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>
    <span class="k">use</span> <span class="n">defmt_rtt</span> <span class="k">as</span> <span class="n">_</span><span class="p">;</span>
    <span class="k">use</span> <span class="n">panic_probe</span> <span class="k">as</span> <span class="n">_</span><span class="p">;</span>
    <span class="k">use</span> <span class="n">rp_pico</span> <span class="k">as</span> <span class="n">bsp</span><span class="p">;</span>

    <span class="nd">#[entry]</span>
    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="o">!</span> <span class="p">{</span>
        <span class="nd">info!</span><span class="p">(</span><span class="s">"Hello World!"</span><span class="p">);</span>
        <span class="k">loop</span> <span class="p">{}</span>
    <span class="p">}</span>
    </code></pre></figure>

<p>Thats it, with <code class="language-plaintext highlighter-rouge">cargo run --release</code> the program is flashed :). See the repo on <a href="https://github.com/maebli/100rustsnippets/tree/master/pi-pico-helloworld">github</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 52/100 - x-compiling for cortex-m3 lm3s6965evb on QEMU</title><link href="https://maebli.github.io/archive/2022-09-16-100rust-52/" rel="alternate" type="text/html" title="Rust challenge 52/100 - x-compiling for cortex-m3 lm3s6965evb on QEMU" /><published>2022-09-15T17:30:00+00:00</published><updated>2022-09-15T17:30:00+00:00</updated><id>https://maebli.github.io/archive/100rust-52</id><content type="html" xml:base="https://maebli.github.io/archive/2022-09-16-100rust-52/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#52nd-challenge">52nd Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>. 
Today I would like to tip my toe into some embedded programming.</p>

<h2 id="52nd-challenge">52nd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>I will start off with some QEMU emulation. Challenge today is get the <a href="https://docs.rust-embedded.org/book/start/qemu.html">example</a> up and running.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Following step for setup the tutorial on my macos was a success. The turoial is very well explained. 
See <a href="https://github.com/maebli/100rustsnippets/tree/master/app">github</a> for the generated example (generated using <code class="language-plaintext highlighter-rouge">cargo generate</code>.</p>

<p>Most imporant steps in summary:</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">cargo generate --git https://github.com/rust-embedded/cortex-m-quickstart</code></li>
  <li>start with debugging : <code class="language-plaintext highlighter-rouge">qemu-system-arm   -cpu cortex-m3   -machine lm3s6965evb   -nographic   -semihosting-config enable=on,target=native   -gdb tcp::3333   -S   -kernel target/thumbv7m-none-eabi/debug/examples/hello</code></li>
  <li>connect to debugging session from second shell : <code class="language-plaintext highlighter-rouge">gdb -q target/thumbv7m-none-eabi/debug/examples/hello</code></li>
  <li>running :  <code class="language-plaintext highlighter-rouge">qemu-system-arm   -cpu cortex-m3   -machine lm3s6965evb enable=on,target=native   -kernel target/thumbv7m-none-eabi/debug/examples/hello</code></li>
</ol>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 51/100 - parsing yaml</title><link href="https://maebli.github.io/archive/2022-09-15-100rust-51/" rel="alternate" type="text/html" title="Rust challenge 51/100 - parsing yaml" /><published>2022-09-15T17:30:00+00:00</published><updated>2022-09-15T17:30:00+00:00</updated><id>https://maebli.github.io/archive/100rust-51</id><content type="html" xml:base="https://maebli.github.io/archive/2022-09-15-100rust-51/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#51st-challenge">51st Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>. 
I haven’t posted in a while but I want to get started again.</p>

<h2 id="51st-challenge">51st Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today the challenge is to parse and extract information from a yaml. And not just any yaml, all the yamls in the repos
<a href="https://github.com/TheThingsNetwork/lorawan-devices">things network lorawan devices</a>. Bonus: make some statistics from the files. Lets get started.</p>

<p><img src="/assets/img/ferris4.jpg" alt="" /></p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>This was failry simple but fun. The hard work was done by the <a href="https://lib.rs/crates/yaml-rust">yaml rust</a>.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="k">extern</span> <span class="k">crate</span> <span class="n">yaml_rust</span><span class="p">;</span>
    <span class="k">use</span> <span class="nn">yaml_rust</span><span class="p">::{</span><span class="n">YamlLoader</span><span class="p">,</span> <span class="n">YamlEmitter</span><span class="p">};</span>

    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">vendor_yaml_url</span> <span class="o">=</span> <span class="s">"https://raw.githubusercontent.com/TheThingsNetwork/lorawan-devices/master/vendor/index.yaml"</span><span class="p">;</span>
        <span class="k">let</span> <span class="n">vendor_yaml</span> <span class="o">=</span> <span class="nn">reqwest</span><span class="p">::</span><span class="nn">blocking</span><span class="p">::</span><span class="nf">get</span><span class="p">(</span><span class="n">vendor_yaml_url</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.text</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>

        <span class="k">let</span> <span class="n">vendors</span> <span class="o">=</span> <span class="nn">YamlLoader</span><span class="p">::</span><span class="nf">load_from_str</span><span class="p">(</span><span class="o">&amp;</span><span class="n">vendor_yaml</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">vendors</span> <span class="o">=</span> <span class="n">vendors</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">"vendors"</span><span class="p">]</span><span class="nf">.clone</span><span class="p">();</span>

        <span class="cm">/* minus 1 because there is a "example" vendor */</span>
        <span class="k">let</span> <span class="n">vendor_count</span> <span class="o">=</span> <span class="n">vendors</span><span class="nf">.as_vec</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.len</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>

        <span class="nd">println!</span><span class="p">(</span><span class="s">"There are currently {} vendors in the Things Network device repository. "</span><span class="p">,</span> <span class="n">vendor_count</span><span class="p">);</span>

    <span class="p">}</span>

	</code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/yaml-parsing">github</a> for today’s simple snippet.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 50/100 - telegram bot</title><link href="https://maebli.github.io/archive/2022-09-14-100rust-50/" rel="alternate" type="text/html" title="Rust challenge 50/100 - telegram bot" /><published>2022-09-14T20:00:00+00:00</published><updated>2022-09-14T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-50</id><content type="html" xml:base="https://maebli.github.io/archive/2022-09-14-100rust-50/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#50th-challenge">50th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original</a>. 
I haven’t posted in a while but I want to get started again.</p>

<h2 id="50th-challenge">50th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today the challenge is to create a telegram bot that displays a random number between 0 and 100.</p>

<p><img src="/assets/img/ferris3.png" alt="" /></p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>This was failry simple but fun. The hard work was done by the <a href="https://lib.rs/crates/teloxide">teloxide cargo</a>.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="k">use</span> <span class="nn">teloxide</span><span class="p">::</span><span class="nn">prelude</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>
    <span class="k">use</span> <span class="nn">rand</span><span class="p">::</span><span class="n">Rng</span><span class="p">;</span>

    <span class="nd">#[tokio::main]</span>
    <span class="k">async</span> <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

        <span class="nn">pretty_env_logger</span><span class="p">::</span><span class="nf">init</span><span class="p">();</span>

        <span class="k">let</span> <span class="n">bot</span> <span class="o">=</span> <span class="nn">Bot</span><span class="p">::</span><span class="nf">from_env</span><span class="p">()</span><span class="nf">.auto_send</span><span class="p">();</span>

        <span class="nn">teloxide</span><span class="p">::</span><span class="nf">repl</span><span class="p">(</span><span class="n">bot</span><span class="p">,</span> <span class="p">|</span><span class="n">message</span><span class="p">:</span> <span class="n">Message</span><span class="p">,</span> <span class="n">bot</span><span class="p">:</span> <span class="n">AutoSend</span><span class="o">&lt;</span><span class="n">Bot</span><span class="o">&gt;</span><span class="p">|</span> <span class="k">async</span> <span class="k">move</span> <span class="p">{</span>
            <span class="k">let</span> <span class="n">random_number</span> <span class="o">=</span> <span class="nn">rand</span><span class="p">::</span><span class="nf">thread_rng</span><span class="p">()</span><span class="nf">.gen_range</span><span class="p">(</span><span class="mi">0</span><span class="o">..</span><span class="mi">100</span><span class="p">);</span>
            <span class="n">bot</span><span class="nf">.send_message</span><span class="p">(</span><span class="n">message</span><span class="py">.chat.id</span><span class="p">,</span><span class="nd">format!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span><span class="n">random_number</span><span class="p">))</span><span class="k">.await</span><span class="o">?</span><span class="p">;</span>
            <span class="nf">respond</span><span class="p">(())</span>
        <span class="p">})</span>
            <span class="k">.await</span><span class="p">;</span>
    <span class="p">}</span>

	</code></pre></figure>

<p>Once we define the token setup by the <code class="language-plaintext highlighter-rouge">botfather</code> we can start the bot and interact with it which looks like the following:</p>

<p><img src="/assets/img/telegram-bot.png" alt="" /></p>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/telegram-bot">github</a> for today’s simple snippet.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 49/100 - rust javascript bindings</title><link href="https://maebli.github.io/archive/2022-09-13-100rust-49/" rel="alternate" type="text/html" title="Rust challenge 49/100 - rust javascript bindings" /><published>2022-09-13T20:00:00+00:00</published><updated>2022-09-13T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-49</id><content type="html" xml:base="https://maebli.github.io/archive/2022-09-13-100rust-49/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#49th-challenge">49th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>. 
I haven’t posted in a while but I want to get started again.</p>

<h2 id="49th-challenge">49th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today the challenge will be simple. Use rust bindings to create a hello world. Also, because there is a greate hype around AI generating code and images from text I will use both in this post.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p><img src="/assets/img/ferris1.jpeg" alt="" /></p>

<p><em>Ferris the crab from the rust programming language drawn as marvel comic character. Created using stable diffusion</em></p>

<p><img src="/assets/img/ferris2.png" alt="" /></p>

<p><em>Ferris the crab from the rust programming language drawn as gta character.</em></p>

<p>We will use code pilot from github to generate the javascript binding. With the promt <code class="language-plaintext highlighter-rouge">/* bind javascript */</code> the first prompt is as follows</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="cm">/* bind javascript */</span>
    <span class="k">let</span> <span class="n">js</span> <span class="o">=</span> <span class="nd">include_str!</span><span class="p">(</span><span class="s">"../js/main.js"</span><span class="p">);</span>
	</code></pre></figure>

<p>This looks good at first glance but will actually jsut print out the text contained in our <code class="language-plaintext highlighter-rouge">main.js</code>. <code class="language-plaintext highlighter-rouge">main.js</code> was also generated with a prompt contains the text</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="cm">/*Hello world javascript*/</span>
    <span class="n">console</span><span class="nf">.log</span><span class="p">(</span><span class="s">"Hello world"</span><span class="p">);</span>
    </code></pre></figure>

<p>Sadly that was the only suggestion, so I try with a different approach. Lets try again..</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="cm">/* use js macro cargo */</span>
    <span class="k">use</span> <span class="nn">js</span><span class="p">::</span><span class="n">js</span><span class="p">;</span>

    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="cm">/* bind javascript helloWorld() from js/main.js to rust as function */</span>
    <span class="k">let</span> <span class="n">hello_world</span> <span class="o">=</span> <span class="nd">js!</span> <span class="p">{</span>
        <span class="n">function</span> <span class="nf">helloWorld</span><span class="p">()</span> <span class="p">{</span>
            <span class="n">console</span><span class="nf">.log</span><span class="p">(</span><span class="s">"Hello World!"</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">};</span>

    <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span><span class="n">hello_world</span><span class="p">);</span>

    <span class="p">}</span>
    </code></pre></figure>

<p>Again it looks promising, but it does not work either, so I give up and do some googling. <a href="https://rust-by-example-ext.com/webassembly/nodejshelper.html">Rust by Example</a> tells us to use the cargo <code class="language-plaintext highlighter-rouge">nodejs-helper</code> so lets try to add this to the prompt. Basically the helper just runs the javascript in a nodejs, the repos is found <a href="https://github.com/second-state/nodejs-helper">here</a>.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="k">use</span> <span class="nn">nodejs_helper</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>
    <span class="k">use</span> <span class="nn">wasm_bindgen</span><span class="p">::</span><span class="nn">prelude</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

    <span class="nd">#[wasm_bindgen]</span>
    <span class="k">pub</span> <span class="k">fn</span> <span class="nf">hello_world</span><span class="p">()</span> <span class="p">{</span>
    <span class="nn">nodejs_helper</span><span class="p">::</span><span class="nn">console</span><span class="p">::</span><span class="k">log</span><span class="p">(</span><span class="s">"Timestamp now: "</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="nf">hello_world</span><span class="p">()</span>
    <span class="p">}</span>
    </code></pre></figure>

<p>However this is not what I’m trying to achive, this won’t run like a rust application. So I looked further and found <a href="https://github.com/second-state/wasmedge-quickjs">wasmedge-quickjs</a>.
With this solution you also require wasmedge installed to run. So the code</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="k">use</span> <span class="nn">wasmedge_quickjs</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">ctx</span> <span class="o">=</span> <span class="nn">Context</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
        <span class="k">let</span> <span class="n">code</span> <span class="o">=</span> <span class="s">r#"print('hello quickjs')"#</span><span class="p">;</span>
        <span class="k">let</span> <span class="n">r</span> <span class="o">=</span> <span class="n">ctx</span><span class="nf">.eval_global_str</span><span class="p">(</span><span class="n">code</span><span class="p">);</span>
        <span class="nd">println!</span><span class="p">(</span><span class="s">"return value:{:?}"</span><span class="p">,</span> <span class="n">r</span><span class="p">);</span>
    <span class="p">}</span>
    </code></pre></figure>

<p>is compiled using <code class="language-plaintext highlighter-rouge">$ cargo build --target wasm32-wasi --release</code> and can then be run using <code class="language-plaintext highlighter-rouge">wasmedge --dir .:. target/wasm32-wasi/release/wasmedge_quickjs.wasm</code></p>

<p>This is a somewhat working solution but I will probabyl explore this some more in the future. For now the challenge for today is done.</p>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/binding-javascript">github</a> for today’s simple snippet.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 48/100 - vim as a rust IDE</title><link href="https://maebli.github.io/archive/2022-03-30-100rust-48/" rel="alternate" type="text/html" title="Rust challenge 48/100 - vim as a rust IDE" /><published>2022-03-30T20:00:00+00:00</published><updated>2022-03-30T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-48</id><content type="html" xml:base="https://maebli.github.io/archive/2022-03-30-100rust-48/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#48th-challenge">48th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="48th-challenge">48th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Learn to use neovim to as an alternative IDE as opposed to Intellj. I have been teaching myself VIM and have sen lots of examples of developers using vim to program rust.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p><img src="/assets/img/vimide.png" alt="" /></p>

<p>I chose to try this myself with the following setup:
(1) Use Neovim
(2) Use https://vim-bootstrap.com/ for settingn my config file for rust</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">ans1</span><span class="p">:</span> <span class="nb">i32</span> <span class="o">=</span> <span class="n">INPUT</span>
            <span class="nf">.chars</span><span class="p">()</span>
            <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="k">match</span> <span class="n">x</span> <span class="p">{</span>
                <span class="sc">'('</span> <span class="k">=&gt;</span> <span class="mi">1</span><span class="p">,</span>
                <span class="sc">')'</span> <span class="k">=&gt;</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span>
                <span class="n">_</span> <span class="k">=&gt;</span> <span class="mi">0</span><span class="p">,</span>
            <span class="p">})</span>
            <span class="nf">.sum</span><span class="p">();</span>

        <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">ans1</span><span class="p">);</span>

        <span class="k">let</span> <span class="n">ans2</span> <span class="o">=</span> <span class="n">INPUT</span>
            <span class="nf">.chars</span><span class="p">()</span>
            <span class="nf">.enumerate</span><span class="p">()</span>
            <span class="nf">.fold</span><span class="p">((</span><span class="o">-</span><span class="mi">1i32</span><span class="p">,</span> <span class="mi">0i32</span><span class="p">),</span> <span class="p">|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">,</span> <span class="n">inst</span><span class="p">|</span> <span class="p">{</span>
                <span class="k">match</span> <span class="n">inst</span><span class="na">.1</span> <span class="p">{</span>
                    <span class="sc">'('</span> <span class="k">=&gt;</span> <span class="n">acc</span><span class="na">.1</span> <span class="o">=</span> <span class="n">acc</span><span class="na">.1</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="sc">')'</span> <span class="k">=&gt;</span> <span class="n">acc</span><span class="na">.1</span> <span class="o">=</span> <span class="n">acc</span><span class="na">.1</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{}</span>
                <span class="p">}</span>
                <span class="k">if</span> <span class="n">acc</span><span class="na">.1</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">acc</span><span class="na">.0</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="p">{</span>
                    <span class="n">acc</span><span class="na">.0</span> <span class="o">=</span> <span class="n">inst</span><span class="na">.0</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">+</span> <span class="mi">1</span>
                <span class="p">}</span>
                <span class="n">acc</span>
            <span class="p">})</span>
            <span class="na">.0</span><span class="p">;</span>

        <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">ans2</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="o">=</span>
    <span class="s">"()(((()))(())
    "</span><span class="p">;</span>
	</code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2015-day1">github</a> for today’s simple snippet.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 47/100 - hector tutorial</title><link href="https://maebli.github.io/archive/2022-03-23-100rust-47/" rel="alternate" type="text/html" title="Rust challenge 47/100 - hector tutorial" /><published>2022-03-23T20:00:00+00:00</published><updated>2022-03-23T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-47</id><content type="html" xml:base="https://maebli.github.io/archive/2022-03-23-100rust-47/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#47th-challenge">47th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="47th-challenge">47th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Tody I will be looking at <a href="https://www.philippflenker.com/hecto-chapter-2/">chapter 2 of the hecto tutorial</a>.
Its the basics to get a  DIY text editor working.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>I learnt to read raw text input from <code class="language-plaintext highlighter-rouge">stdio</code> and how it differs to none-raw text input. For now I’m just returning what is entered.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">io</span><span class="p">::</span><span class="n">stdout</span><span class="p">;</span>

	<span class="k">use</span> <span class="nn">crossterm</span><span class="p">::</span><span class="nn">event</span><span class="p">::</span><span class="n">poll</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">crossterm</span><span class="p">::{</span>
	    <span class="nn">cursor</span><span class="p">::</span><span class="n">position</span><span class="p">,</span>
	    <span class="nn">event</span><span class="p">::{</span><span class="n">read</span><span class="p">,</span> <span class="n">DisableMouseCapture</span><span class="p">,</span> <span class="n">EnableMouseCapture</span><span class="p">,</span> <span class="n">Event</span><span class="p">,</span> <span class="n">KeyCode</span><span class="p">},</span>
	    <span class="n">execute</span><span class="p">,</span>
	    <span class="nn">terminal</span><span class="p">::{</span><span class="n">disable_raw_mode</span><span class="p">,</span> <span class="n">enable_raw_mode</span><span class="p">},</span>
	    <span class="nb">Result</span><span class="p">,</span>
	<span class="p">};</span>

	<span class="k">use</span> <span class="nn">crossterm</span><span class="p">::</span><span class="nn">event</span><span class="p">::</span><span class="nn">KeyCode</span><span class="p">::</span><span class="n">Char</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">crossterm</span><span class="p">::</span><span class="nn">style</span><span class="p">::</span><span class="n">Print</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">time</span><span class="p">::</span><span class="n">Duration</span><span class="p">;</span>

	<span class="k">fn</span> <span class="nf">print_events</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="p">()</span><span class="o">&gt;</span> <span class="p">{</span>
	    <span class="k">loop</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="n">event</span> <span class="o">=</span> <span class="nf">read</span><span class="p">()</span><span class="o">?</span><span class="p">;</span>
	        <span class="k">if</span> <span class="k">let</span> <span class="nn">Event</span><span class="p">::</span><span class="nf">Key</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="n">event</span> <span class="p">{</span>
	            <span class="k">match</span> <span class="n">x</span><span class="py">.code</span> <span class="p">{</span>
	                <span class="nf">Char</span><span class="p">(</span><span class="sc">'q'</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="k">return</span> <span class="nf">Ok</span><span class="p">(()),</span>
	                <span class="nf">Char</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
	                    <span class="nd">execute!</span><span class="p">(</span><span class="nf">stdout</span><span class="p">(),</span> <span class="nf">Print</span><span class="p">(</span><span class="n">x</span><span class="nf">.to_string</span><span class="p">()));</span>
	                <span class="p">},</span>
	                <span class="n">_Enter</span> <span class="k">=&gt;</span> <span class="p">{</span>
	                    <span class="nd">execute!</span><span class="p">(</span><span class="nf">stdout</span><span class="p">(),</span> <span class="nf">Print</span><span class="p">(</span><span class="s">"</span><span class="se">\n\r</span><span class="s">"</span><span class="nf">.to_string</span><span class="p">()));</span>
	                <span class="p">}</span>
	                <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{</span>
	                    <span class="nd">execute!</span><span class="p">(</span>
	                        <span class="nf">stdout</span><span class="p">(),</span>
	                        <span class="nf">Print</span><span class="p">(</span><span class="s">"special character"</span><span class="nf">.to_string</span><span class="p">())</span>
	                    <span class="p">);</span>
	                <span class="p">}</span>
	            <span class="p">}</span>
	        <span class="p">}</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="p">()</span><span class="o">&gt;</span> <span class="p">{</span>
	    <span class="nf">enable_raw_mode</span><span class="p">()</span><span class="o">?</span><span class="p">;</span>

	    <span class="k">if</span> <span class="k">let</span> <span class="nf">Err</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="o">=</span> <span class="nf">print_events</span><span class="p">()</span> <span class="p">{</span>
	        <span class="nd">println!</span><span class="p">(</span><span class="s">"Error: {:?}</span><span class="se">\r</span><span class="s">"</span><span class="p">,</span> <span class="n">e</span><span class="p">);</span>
	    <span class="p">}</span>

	    <span class="nf">disable_raw_mode</span><span class="p">()</span>
	<span class="p">}</span>

	</code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/hector">github</a> for today’s simple snippet.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 46/100 - cli tutorial</title><link href="https://maebli.github.io/archive/2022-03-15-100rust-46/" rel="alternate" type="text/html" title="Rust challenge 46/100 - cli tutorial" /><published>2022-03-15T20:00:00+00:00</published><updated>2022-03-15T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-46</id><content type="html" xml:base="https://maebli.github.io/archive/2022-03-15-100rust-46/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#46th-challenge">46th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="46th-challenge">46th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Going back to my original source of information I’m going to challenge my self with <a href="https://doc.rust-lang.org/book/ch12-00-an-io-project.html">chapter 12 of ‘the book’</a>.
Insteand of doing the same example I will make the a <code class="language-plaintext highlighter-rouge">cat</code> instead of a <code class="language-plaintext highlighter-rouge">grep</code> clone.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Here is the comparision of <code class="language-plaintext highlighter-rouge">cat</code> and <code class="language-plaintext highlighter-rouge">cli-tutorial</code>.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">	<span class="nv">$ </span>./cli-tutorial hello-world.txt 
	This is a test.
	This worked just like cat.
	<span class="nv">$ </span><span class="nb">cat </span>hello-world.txt 
	This is a test.
	This worked just like cat.
	<span class="nv">$ </span>
	</code></pre></figure>

<p>And here is the very simple code for it:</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="n">env</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="n">fs</span><span class="p">;</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">args</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">String</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nn">env</span><span class="p">::</span><span class="nf">args</span><span class="p">()</span><span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">if</span> <span class="n">args</span><span class="nf">.len</span><span class="p">()</span> <span class="o">!=</span> <span class="mi">2</span> <span class="p">{</span>
	        <span class="nd">panic!</span><span class="p">(</span><span class="s">"This program takes exactly one argument, the file name."</span><span class="p">)</span>
	    <span class="p">}</span>

	    <span class="k">let</span> <span class="n">filname</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
	    <span class="k">let</span> <span class="n">contents</span> <span class="o">=</span> <span class="nn">fs</span><span class="p">::</span><span class="nf">read_to_string</span><span class="p">(</span><span class="n">filname</span><span class="p">)</span>
	        <span class="nf">.expect</span><span class="p">(</span><span class="s">"Something went wrong reading the file"</span><span class="p">);</span>

	    <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">contents</span><span class="p">);</span>
	<span class="p">}</span>
	</code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/cli-tutorial">github</a> for today’s simple snippet.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 45/100 - a new day a new challenge</title><link href="https://maebli.github.io/archive/2022-03-01-100rust-45/" rel="alternate" type="text/html" title="Rust challenge 45/100 - a new day a new challenge" /><published>2022-03-01T20:00:00+00:00</published><updated>2022-03-01T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-45</id><content type="html" xml:base="https://maebli.github.io/archive/2022-03-01-100rust-45/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#45th-challenge">45th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="45th-challenge">45th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Recently I discovered code wars. Since then I have done a lot of challenges on that platform. It was ok for me for the moment. 
I don’t feel like I have broken the rules of this challenge, but I’m keeping at it doing what ever I’m motivated to do. I’m starting
to reach my limitations and I see I have a gap in algorithms and how they work.</p>

<p>I feel like my solutions are limited by the fact that I do not know how to use fundamental algorithms. I have two new challenges, a series
of algorithms is the first.</p>

<p>So where to start? I started my search by looking for some good cheat sheets on algorithms here is what I found: <a href="https://algs4.cs.princeton.edu/cheatsheet/">a good Overview of various algorithms</a></p>

<p>Graph theroy has inspired be most. I want to learn it, so from my overview I go on a further search and find (an online presentation of the basics)[https://web.stanford.edu/class/cs97si/06-basic-graph-algorithms.pdf]</p>

<p><em>GRAPH</em> consists of <em>nodes</em> and one or bidirectional <em>vertices</em></p>

<p>What do we need as storage?</p>

<p><em>nodes</em> can be stored in arrays</p>

<p><em>edges</em> can be stored in either adjacency matrix or adjacency list. Matrix lists each connection and a 1 if it exists and a 0 if it does not. Matix uses lots of memory <em>O(n^2)</em>. Adjacency List uses less space. Each <em>node</em> has a list of <em>nodes</em> it points to.</p>

<p>Today’s challenge: Prepare a storage for a graph using an adjacency list that consists of arrays and an array of Nodes.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="c1">// Implementation of example</span>
	    <span class="c1">// on page 10 of https://web.stanford.edu/class/cs97si/06-basic-graph-algorithms.pdf</span>
	    <span class="k">const</span> <span class="n">M</span><span class="p">:</span> <span class="nb">usize</span> <span class="o">=</span> <span class="mi">8</span><span class="p">;</span>
	    <span class="k">const</span> <span class="n">N</span><span class="p">:</span> <span class="nb">usize</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">e</span> <span class="o">=</span> <span class="p">[(</span><span class="nn">usize</span><span class="p">::</span><span class="n">MAX</span><span class="p">,</span> <span class="nn">usize</span><span class="p">::</span><span class="n">MAX</span><span class="p">);</span> <span class="n">M</span><span class="p">];</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">le</span> <span class="o">=</span> <span class="p">[</span><span class="nn">usize</span><span class="p">::</span><span class="n">MAX</span><span class="p">;</span> <span class="n">N</span><span class="p">];</span>

	    <span class="k">let</span> <span class="n">edges</span><span class="p">:</span> <span class="p">[(</span><span class="nb">usize</span><span class="p">,</span> <span class="nb">usize</span><span class="p">);</span> <span class="mi">8</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span>
	        <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
	        <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span>
	        <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span>
	        <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</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="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</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="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span>
	    <span class="p">];</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">edge_id</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

	    <span class="k">for</span> <span class="n">edge</span> <span class="k">in</span> <span class="n">edges</span> <span class="p">{</span>
	        <span class="nd">println!</span><span class="p">(</span><span class="s">"Adding Edge: {} -&gt; {}"</span><span class="p">,</span> <span class="n">edge</span><span class="na">.0</span><span class="p">,</span> <span class="n">edge</span><span class="na">.1</span><span class="p">);</span>

	        <span class="k">let</span> <span class="n">from</span> <span class="o">=</span> <span class="n">edge</span><span class="na">.0</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">to</span> <span class="o">=</span> <span class="n">edge</span><span class="na">.1</span><span class="p">;</span>

	        <span class="n">e</span><span class="p">[</span><span class="n">edge_id</span><span class="p">]</span><span class="na">.0</span> <span class="o">=</span> <span class="n">to</span><span class="p">;</span>
	        <span class="n">e</span><span class="p">[</span><span class="n">edge_id</span><span class="p">]</span><span class="na">.1</span> <span class="o">=</span> <span class="n">le</span><span class="p">[</span><span class="n">from</span><span class="p">];</span>
	        <span class="n">le</span><span class="p">[</span><span class="n">from</span><span class="p">]</span> <span class="o">=</span> <span class="n">edge_id</span><span class="p">;</span>

	        <span class="n">edge_id</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
	    <span class="p">}</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"Edges = {:?}"</span><span class="p">,</span> <span class="n">e</span><span class="p">);</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"Last Edges = {:?}"</span><span class="p">,</span> <span class="n">le</span><span class="p">);</span>

	    <span class="c1">// iterate over edges starting from 0</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">id</span> <span class="o">=</span> <span class="n">le</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
	    <span class="k">while</span> <span class="n">e</span><span class="p">[</span><span class="n">id</span><span class="p">]</span><span class="na">.1</span> <span class="o">!=</span> <span class="nn">usize</span><span class="p">::</span><span class="n">MAX</span> <span class="p">{</span>
	        <span class="nd">print!</span><span class="p">(</span><span class="s">" 0 -&gt; {}"</span><span class="p">,</span> <span class="n">e</span><span class="p">[</span><span class="n">id</span><span class="p">]</span><span class="na">.0</span><span class="p">);</span>
	        <span class="n">id</span> <span class="o">=</span> <span class="n">e</span><span class="p">[</span><span class="n">id</span><span class="p">]</span><span class="na">.1</span><span class="p">;</span>
	    <span class="p">}</span>

    	<span class="nd">print!</span><span class="p">(</span><span class="s">" 0 -&gt; {}"</span><span class="p">,</span> <span class="n">e</span><span class="p">[</span><span class="n">id</span><span class="p">]</span><span class="na">.0</span><span class="p">);</span>
	<span class="p">}</span>

	</code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/graph-storage">github</a> <a href="https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2021&amp;gist=804a03902fed26a06e59267654c7a316">link to playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 44/100 - rust on codewards</title><link href="https://maebli.github.io/archive/2022-01-06-100rust-44/" rel="alternate" type="text/html" title="Rust challenge 44/100 - rust on codewards" /><published>2022-01-06T20:00:00+00:00</published><updated>2022-01-06T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-44</id><content type="html" xml:base="https://maebli.github.io/archive/2022-01-06-100rust-44/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#44rd-challenge">44rd Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="https://www.codewars.com/users/maebli/badges/large" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="44rd-challenge">44rd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Recently I discovered code wars. It has some fun learning challenges. Today the challenge is to solve some of the code war challenges.
I have decided to give this blog a bit of a break and just solve challanges. In this article I will share a view I solved. The reset I will
not be sharing.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Encode DNA, in hindsight and by look at solutions of others, this would have been easier to solve with <code class="language-plaintext highlighter-rouge">map</code></p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">dna_strand</span><span class="p">(</span><span class="n">dna</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">String</span> <span class="p">{</span>
	    <span class="n">dna</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="nn">String</span><span class="p">::</span><span class="nf">new</span><span class="p">(),</span> <span class="p">|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">,</span> <span class="n">inst</span><span class="p">|</span> <span class="p">{</span>
	        <span class="k">match</span> <span class="n">inst</span> <span class="p">{</span>
	            <span class="sc">'T'</span> <span class="k">=&gt;</span> <span class="n">acc</span><span class="nf">.push</span><span class="p">(</span><span class="sc">'A'</span><span class="p">),</span>
	            <span class="sc">'A'</span> <span class="k">=&gt;</span> <span class="n">acc</span><span class="nf">.push</span><span class="p">(</span><span class="sc">'T'</span><span class="p">),</span>
	            <span class="sc">'G'</span> <span class="k">=&gt;</span> <span class="n">acc</span><span class="nf">.push</span><span class="p">(</span><span class="sc">'C'</span><span class="p">),</span>
	            <span class="sc">'C'</span> <span class="k">=&gt;</span> <span class="n">acc</span><span class="nf">.push</span><span class="p">(</span><span class="sc">'G'</span><span class="p">),</span>
	            <span class="n">_x</span> <span class="k">=&gt;</span> <span class="nd">panic!</span><span class="p">(</span><span class="s">"wrongly formatted dna sequence"</span><span class="p">),</span>
	        <span class="p">}</span>
	        <span class="n">acc</span>
	    <span class="p">})</span>
	<span class="p">}</span>
	</code></pre></figure>

<p>Next I solved a challenge to sort a <code class="language-plaintext highlighter-rouge">u64</code> according to decimal digits.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">		<span class="k">fn</span> <span class="nf">dna_strand</span><span class="p">(</span><span class="n">dna</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">String</span> <span class="p">{</span>
	<span class="k">use</span> <span class="nn">itertools</span><span class="p">::</span><span class="n">Itertools</span><span class="p">;</span>

	<span class="k">fn</span> <span class="nf">descending_order</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="nb">u64</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span> <span class="p">{</span>
	    <span class="n">x</span><span class="nf">.to_string</span><span class="p">()</span>
	    <span class="nf">.chars</span><span class="p">()</span>
	    <span class="nf">.sorted</span><span class="p">()</span>
	    <span class="nf">.rev</span><span class="p">()</span>
	    <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">String</span><span class="o">&gt;</span><span class="p">()</span>
	    <span class="nf">.parse</span><span class="p">()</span>
	    <span class="nf">.unwrap</span><span class="p">()</span>
	<span class="p">}</span>
	</code></pre></figure>

<p>The challenges were fun and it was very helpful to see solutions of others. I may repeat this in the future.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 43/100 - rust lifetimes - static life times v.s. constants</title><link href="https://maebli.github.io/archive/2022-01-05-100rust-43/" rel="alternate" type="text/html" title="Rust challenge 43/100 - rust lifetimes - static life times v.s. constants" /><published>2022-01-05T20:00:00+00:00</published><updated>2022-01-05T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-43</id><content type="html" xml:base="https://maebli.github.io/archive/2022-01-05-100rust-43/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#43rd-challenge">43rd Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/lifetimes.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="43rd-challenge">43rd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m posting the first time this year. I had to take an unplanned break in the middle of AOC 2021. I plan to finish AOC 2021 and clean up my answers that are unfinished, but first I want to do some other things on other topics. Today’s challeng is to explore the concept of <code class="language-plaintext highlighter-rouge">lifetimes</code> by example.</p>

<p>Today I want to answer the question, what is the difference between <code class="language-plaintext highlighter-rouge">const X:&amp;str = "0"</code> and <code class="language-plaintext highlighter-rouge">let x: &amp;'static str = "0"</code> ?</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>The difference between constant <code class="language-plaintext highlighter-rouge">const</code> and a variable is written in the <a href="https://doc.rust-lang.org/std/keyword.const.html">documentation</a> for the <code class="language-plaintext highlighter-rouge">const</code> key word</p>

<blockquote>
  <p>constants are inlined wherever they’re used, making using them identical to simply replacing the name of the const with its value</p>
</blockquote>

<p>oh the other hand ..</p>

<blockquote>
  <p>Static variables, on the other hand, point to a single location in memory, which all accesses share.</p>
</blockquote>

<p>Also, static variables are variables and can be changes, constants cannot be changed at runtime.</p>

<p>To me it seems this would be useful when implementing a singleton pattern in rust. So I did just that bellow.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="c1">// Boilerplate for my singleton example</span>
	<span class="k">struct</span> <span class="n">A</span><span class="p">;</span>
	<span class="k">static</span> <span class="n">THING</span><span class="p">:</span> <span class="n">A</span> <span class="o">=</span> <span class="n">A</span> <span class="p">{};</span>
	<span class="k">fn</span> <span class="nf">getInstance</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="o">&amp;</span><span class="k">'static</span> <span class="n">A</span> <span class="p">{</span>
	    <span class="o">&amp;</span><span class="n">THING</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="p">{</span>
	        <span class="c1">// The following two lines are identical</span>
	        <span class="c1">// due to static lifetime elision both</span>
	        <span class="c1">// variables have a 'static lifetime</span>
	        <span class="k">const</span> <span class="n">X1</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"a"</span><span class="p">;</span>
	        <span class="k">const</span> <span class="n">X2</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">'static</span> <span class="nb">str</span> <span class="o">=</span> <span class="s">"a"</span><span class="p">;</span>

	        <span class="c1">// The following three lines are identical</span>
	        <span class="c1">// X1 and X2 are replaced with the strings at</span>
	        <span class="c1">// compile time</span>
	        <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="n">X1</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="n">X1</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">c</span> <span class="o">=</span> <span class="n">X2</span><span class="p">;</span>

	        <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">b</span><span class="nf">.as_ptr</span><span class="p">(),</span> <span class="n">a</span><span class="nf">.as_ptr</span><span class="p">());</span>
	        <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">b</span><span class="nf">.as_ptr</span><span class="p">(),</span> <span class="n">c</span><span class="nf">.as_ptr</span><span class="p">());</span>
	        <span class="c1">// When  these constants go out of scope, their references</span>
	        <span class="c1">// can no longer be used, but the data remains in the binary.</span>
	    <span class="p">}</span>

	    <span class="p">{</span>
	        <span class="c1">// Two ways to make a constant with `'static` lifetime.</span>
	        <span class="k">let</span> <span class="n">X1</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">'static</span> <span class="nb">str</span> <span class="o">=</span> <span class="s">"a"</span><span class="p">;</span>
	        <span class="k">static</span> <span class="n">X2</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"a"</span><span class="p">;</span>

	        <span class="c1">// The following will add three references</span>
	        <span class="c1">// non mutable borrows to X1</span>
	        <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="n">X1</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="n">X1</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">c</span> <span class="o">=</span> <span class="n">X2</span><span class="p">;</span>

	        <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">b</span><span class="nf">.as_ptr</span><span class="p">(),</span> <span class="n">a</span><span class="nf">.as_ptr</span><span class="p">());</span>
	        <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">b</span><span class="nf">.as_ptr</span><span class="p">(),</span> <span class="n">c</span><span class="nf">.as_ptr</span><span class="p">());</span>
	        <span class="c1">// When  these constants go out of scope, their references</span>
	        <span class="c1">// can no longer be used, but the data remains in the binary.</span>
	    <span class="p">}</span>

	    <span class="p">{</span>
	        <span class="c1">// Implementing the singleton pattern</span>
	        <span class="k">let</span> <span class="n">_a</span> <span class="o">=</span> <span class="nf">getInstance</span><span class="p">();</span>
	        <span class="k">let</span> <span class="n">_b</span> <span class="o">=</span> <span class="nf">getInstance</span><span class="p">();</span>
	    <span class="p">}</span>
	
	</code></pre></figure>

<p><a href="https://github.com/maebli/100rustsnippets/tree/master/lifetime">github</a>
<a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=501565652360d1cf64b596a2eb07fbd1">playground</a></p>

<p>See also the<a href="https://stackoverflow.com/questions/52751597/what-is-the-difference-between-a-constant-and-a-static-variable-and-which-should/52753798#52753798">stackoverflow thread on the topic.</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 42/100 - advent of code 2021 day 13 part 1</title><link href="https://maebli.github.io/archive/2021-12-13-100rust-42/" rel="alternate" type="text/html" title="Rust challenge 42/100 - advent of code 2021 day 13 part 1" /><published>2021-12-13T20:00:00+00:00</published><updated>2021-12-13T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-42</id><content type="html" xml:base="https://maebli.github.io/archive/2021-12-13-100rust-42/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#42nd-challenge">42nd Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc-squid2.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="42nd-challenge">42nd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving today’s <a href="https://adventofcode.com/2021/day/13">AoC day 13 2021</a>.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>I have solved part1, part 2 will have to wait. I’m going to clean up all my solutions wants the calender is done. At the moment the goal is to stay at today’s challenge.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">cmp</span><span class="p">::</span><span class="n">Ordering</span><span class="p">;</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="n">points</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">u32</span><span class="p">,</span><span class="nb">u32</span><span class="p">)</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">DOTS</span><span class="nf">.lines</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span>
	            <span class="k">let</span> <span class="n">k</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.split_once</span><span class="p">(</span><span class="sc">','</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
	            <span class="p">(</span><span class="n">k</span><span class="na">.0</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">k</span><span class="na">.1</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span>
	        <span class="p">})</span><span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">n</span> <span class="o">=</span> <span class="n">points</span>
	        <span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,|</span><span class="n">max</span><span class="p">,</span><span class="n">inst</span><span class="p">|</span> <span class="n">inst</span><span class="na">.0</span><span class="nf">.max</span><span class="p">(</span><span class="n">max</span><span class="p">)</span><span class="nf">.max</span><span class="p">(</span><span class="n">inst</span><span class="na">.1</span><span class="p">))</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>

	    <span class="k">let</span> <span class="n">folds</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="n">Fold</span><span class="p">,</span><span class="nb">u32</span><span class="p">)</span><span class="o">&gt;=</span> <span class="n">FOLDS</span><span class="nf">.lines</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span>
	            <span class="k">let</span> <span class="n">k</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.split_once</span><span class="p">(</span><span class="s">"="</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
	            <span class="k">match</span> <span class="n">k</span><span class="na">.0</span> <span class="p">{</span>
	                <span class="s">"fold along y"</span> <span class="k">=&gt;</span> <span class="p">(</span><span class="nn">Fold</span><span class="p">::</span><span class="n">Up</span><span class="p">,</span> <span class="n">k</span><span class="na">.1</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()),</span>
	                <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">(</span><span class="nn">Fold</span><span class="p">::</span><span class="nb">Left</span><span class="p">,</span><span class="n">k</span><span class="na">.1</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span>
	            <span class="p">}</span>
	        <span class="p">})</span><span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">i</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">points</span>
	        <span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="na">.0</span> <span class="o">+</span> <span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">*</span> <span class="n">x</span><span class="na">.1</span><span class="p">)</span>
	        <span class="nf">.collect</span><span class="p">();</span>
	    <span class="n">i</span><span class="nf">.sort</span><span class="p">();</span>

	    <span class="n">i</span> <span class="o">=</span> <span class="k">match</span> <span class="n">folds</span><span class="nf">.get</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="p">{</span>
	        <span class="p">(</span><span class="nn">Fold</span><span class="p">::</span><span class="n">Up</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
	            <span class="n">points</span>
	                <span class="nf">.iter</span><span class="p">()</span>
	                <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="na">.0</span> <span class="o">+</span> <span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">*</span> <span class="n">x</span><span class="na">.1</span><span class="p">)</span>
	                <span class="nf">.map</span><span class="p">(|</span><span class="n">i</span><span class="p">|</span> <span class="k">match</span> <span class="n">i</span><span class="nf">.cmp</span><span class="p">(</span><span class="o">&amp;</span><span class="p">((</span><span class="n">n</span> <span class="o">*</span> <span class="n">n</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">))</span> <span class="p">{</span>
	                    <span class="nn">Ordering</span><span class="p">::</span><span class="n">Greater</span> <span class="k">=&gt;</span> <span class="n">n</span> <span class="o">*</span> <span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="p">(</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="n">n</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="n">i</span> <span class="o">%</span> <span class="n">n</span><span class="p">),</span>
	                    <span class="n">_</span> <span class="k">=&gt;</span> <span class="n">i</span>
	                <span class="p">})</span><span class="nf">.collect</span><span class="p">()</span>
	        <span class="p">},</span>
	        <span class="p">(</span><span class="nn">Fold</span><span class="p">::</span><span class="nb">Left</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
	            <span class="n">points</span><span class="nf">.iter</span><span class="p">()</span>
	                <span class="nf">.filter</span><span class="p">(|</span><span class="n">i</span><span class="p">|</span> <span class="n">i</span><span class="na">.0</span> <span class="o">!=</span> <span class="n">n</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
	                <span class="nf">.map</span><span class="p">(|</span><span class="n">i</span><span class="p">|</span> <span class="n">i</span><span class="na">.0</span> <span class="o">+</span> <span class="n">n</span><span class="o">*</span><span class="n">i</span><span class="na">.1</span><span class="p">)</span>
	                <span class="nf">.map</span><span class="p">(|</span><span class="n">i</span><span class="p">|</span> <span class="k">match</span> <span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="n">n</span><span class="p">)</span><span class="nf">.cmp</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">n</span> <span class="o">/</span> <span class="mi">2</span><span class="p">))</span> <span class="p">{</span>
	                    <span class="nn">Ordering</span><span class="p">::</span><span class="n">Greater</span> <span class="k">=&gt;</span> <span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="n">i</span><span class="o">%</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="p">(</span><span class="n">i</span> <span class="o">/</span> <span class="n">n</span><span class="p">)</span> <span class="o">*</span> <span class="n">n</span><span class="p">,</span>
	                    <span class="n">_</span> <span class="k">=&gt;</span> <span class="n">i</span>
	                <span class="p">})</span><span class="nf">.collect</span><span class="p">()</span>
	        <span class="p">},</span>
	        <span class="n">_</span> <span class="k">=&gt;</span> <span class="nd">vec!</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
	    <span class="p">};</span>

	    <span class="n">i</span><span class="nf">.sort</span><span class="p">();</span>
	    <span class="n">i</span><span class="nf">.dedup</span><span class="p">();</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="n">i</span><span class="nf">.len</span><span class="p">());</span>
	<span class="p">}</span>

	<span class="nd">#[derive(Debug)]</span>
	<span class="k">enum</span> <span class="n">Fold</span><span class="p">{</span>
	    <span class="n">Up</span><span class="p">,</span>
	    <span class="nb">Left</span>
	<span class="p">}</span>


	<span class="k">const</span> <span class="n">DOTS</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"0,0
	2,0
	3,0
	6,0
	9,0
	1,1
	4,1
	6,2
	10,2
	0,3
	4,3
	1,4
	3,4
	6,4
	8,4
	9,4
	10,4
	"</span><span class="p">;</span>

	<span class="k">const</span> <span class="n">FOLDS</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span><span class="s">"fold along x=5"</span><span class="p">;</span>
	</code></pre></figure>

<p><a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2021-day13">github</a>
<a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=d94d3b10ca62f0eb8f1674c1463cb8db">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 41/100 - advent of code 2021 day 11 part 1 &amp;amp; 2</title><link href="https://maebli.github.io/archive/2021-12-11-100rust-41/" rel="alternate" type="text/html" title="Rust challenge 41/100 - advent of code 2021 day 11 part 1 &amp;amp; 2" /><published>2021-12-10T20:00:00+00:00</published><updated>2021-12-10T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-41</id><content type="html" xml:base="https://maebli.github.io/archive/2021-12-11-100rust-41/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#41st-challenge">41st Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc-squid2.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="41st-challenge">41st Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving today’s <a href="https://adventofcode.com/2021/day/11">AoC day 11 2021</a>.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>For a change part 2 was easy and part 1 was hard. I’ve found that solving the problem with pen and paper first makes it more efficient.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">const</span> <span class="n">MAX_ITERATIONS</span><span class="p">:</span><span class="nb">i32</span> <span class="o">=</span> <span class="mi">10000</span><span class="p">;</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">energy</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">INPUT</span><span class="nf">.lines</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="nf">.as_bytes</span><span class="p">()})</span>
	        <span class="nf">.fold</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[</span><span class="mi">0u8</span><span class="p">;</span><span class="mi">0</span><span class="p">],|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u8</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">inst</span><span class="p">|{</span>
	            <span class="n">acc</span><span class="nf">.extend</span><span class="p">(</span><span class="n">inst</span><span class="nf">.to_vec</span><span class="p">());</span>
	            <span class="n">acc</span>
	        <span class="p">})</span>
	        <span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{(</span><span class="n">x</span> <span class="o">-</span> <span class="sc">b'0'</span><span class="p">)</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">})</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">len</span> <span class="o">=</span> <span class="n">energy</span><span class="nf">.len</span><span class="p">()</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">;</span>
	    <span class="k">let</span> <span class="n">n</span> <span class="o">=</span> <span class="p">(</span><span class="n">len</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">)</span><span class="nf">.sqrt</span><span class="p">()</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">;</span>
	    <span class="k">let</span> <span class="n">coordinates</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">i32</span><span class="p">,</span><span class="nb">i32</span><span class="p">)</span><span class="o">&gt;</span>  <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="o">..</span><span class="n">len</span><span class="p">)</span><span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{((</span><span class="n">x</span><span class="o">%</span><span class="n">n</span><span class="p">),(</span><span class="n">x</span><span class="o">/</span><span class="n">n</span><span class="p">)</span> <span class="p">)})</span><span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">flashes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

	    <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">MAX_ITERATIONS</span> <span class="p">{</span>

	        <span class="cm">/* step one: increment */</span>
	        <span class="n">energy</span>
	            <span class="nf">.iter_mut</span><span class="p">()</span>
	            <span class="nf">.for_each</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="o">*</span><span class="n">x</span><span class="o">=*</span><span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>

	        <span class="cm">/* step two : increment neighbours*/</span>
	        <span class="k">while</span> <span class="n">energy</span><span class="nf">.contains</span><span class="p">(</span><span class="o">&amp;</span><span class="mi">10</span><span class="p">){</span>

	            <span class="k">let</span> <span class="k">mut</span> <span class="n">neighbours</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>

	            <span class="n">energy</span>
	                <span class="nf">.iter_mut</span><span class="p">()</span>
	                <span class="nf">.enumerate</span><span class="p">()</span>
	                <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{(</span><span class="n">coordinates</span><span class="nf">.get</span><span class="p">(</span><span class="n">x</span><span class="na">.0</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">(),</span><span class="n">x</span><span class="na">.1</span><span class="p">)})</span>
	                <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="o">*</span><span class="n">x</span><span class="na">.1</span> <span class="o">==</span> <span class="mi">10</span><span class="p">)</span>
	                <span class="nf">.for_each</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span>
	                    <span class="o">*</span><span class="n">x</span><span class="na">.1</span> <span class="o">=</span> <span class="o">*</span><span class="n">x</span><span class="na">.1</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
	                    <span class="n">neighbours</span><span class="nf">.push</span><span class="p">(((</span> <span class="n">x</span><span class="na">.0.0</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span> <span class="n">x</span><span class="na">.0.1</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="p">));</span>
	                    <span class="n">neighbours</span><span class="nf">.push</span><span class="p">(((</span> <span class="n">x</span><span class="na">.0.0</span>     <span class="p">)</span> <span class="p">,</span> <span class="p">(</span> <span class="n">x</span><span class="na">.0.1</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="p">));</span>
	                    <span class="n">neighbours</span><span class="nf">.push</span><span class="p">(((</span> <span class="n">x</span><span class="na">.0.0</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span> <span class="n">x</span><span class="na">.0.1</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="p">));</span>
	                    <span class="n">neighbours</span><span class="nf">.push</span><span class="p">(((</span> <span class="n">x</span><span class="na">.0.0</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span> <span class="n">x</span><span class="na">.0.1</span>    <span class="p">)</span> <span class="p">));</span>
	                    <span class="n">neighbours</span><span class="nf">.push</span><span class="p">(((</span> <span class="n">x</span><span class="na">.0.0</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span> <span class="n">x</span><span class="na">.0.1</span>    <span class="p">)</span> <span class="p">));</span>
	                    <span class="n">neighbours</span><span class="nf">.push</span><span class="p">(((</span> <span class="n">x</span><span class="na">.0.0</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span> <span class="n">x</span><span class="na">.0.1</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="p">));</span>
	                    <span class="n">neighbours</span><span class="nf">.push</span><span class="p">(((</span> <span class="n">x</span><span class="na">.0.0</span>     <span class="p">)</span> <span class="p">,</span> <span class="p">(</span> <span class="n">x</span><span class="na">.0.1</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="p">));</span>
	                    <span class="n">neighbours</span><span class="nf">.push</span><span class="p">(((</span> <span class="n">x</span><span class="na">.0.0</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">)</span> <span class="p">,</span> <span class="p">(</span> <span class="n">x</span><span class="na">.0.1</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="p">));</span>
	                <span class="p">});</span>

	            <span class="n">energy</span>
	                <span class="nf">.iter_mut</span><span class="p">()</span>
	                <span class="nf">.zip</span><span class="p">(</span><span class="n">coordinates</span><span class="nf">.iter</span><span class="p">())</span>
	                <span class="nf">.for_each</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span>
	                    <span class="k">let</span> <span class="n">count</span> <span class="o">=</span> <span class="n">neighbours</span><span class="nf">.iter</span><span class="p">()</span>
	                        <span class="nf">.filter</span><span class="p">(|</span><span class="n">n</span><span class="p">|</span><span class="n">n</span><span class="na">.0</span> <span class="o">==</span> <span class="p">(</span><span class="n">x</span><span class="na">.1.0</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">n</span><span class="na">.1</span> <span class="o">==</span> <span class="p">(</span><span class="n">x</span><span class="na">.1.1</span><span class="p">))</span>
	                        <span class="nf">.count</span><span class="p">();</span>
	                    <span class="cm">/* Th next two lines are essential and caused me a lot of trouble */</span>
	                    <span class="k">if</span> <span class="o">*</span><span class="n">x</span><span class="na">.0</span> <span class="o">&lt;</span> <span class="mi">10</span> <span class="p">{</span>
	                        <span class="o">*</span><span class="n">x</span><span class="na">.0</span> <span class="o">=</span> <span class="p">(</span><span class="o">*</span><span class="n">x</span><span class="na">.0</span> <span class="o">+</span> <span class="p">(</span><span class="n">count</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">))</span><span class="nf">.min</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
	                    <span class="p">}</span>

	                <span class="p">});</span>

	        <span class="p">}</span>

	        <span class="cm">/* reset: to zero*/</span>
	         <span class="n">energy</span>
	            <span class="nf">.iter_mut</span><span class="p">()</span>
	            <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="o">**</span><span class="n">x</span> <span class="o">&gt;</span> <span class="mi">9</span><span class="p">)</span>
	            <span class="nf">.for_each</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="o">*</span><span class="n">x</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">flashes</span><span class="o">+=</span><span class="mi">1</span><span class="p">});</span>

	        <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">100</span> <span class="p">{</span>
	            <span class="nf">display_energy</span><span class="p">(</span><span class="o">&amp;</span><span class="n">energy</span><span class="p">);</span>
	            <span class="nd">println!</span><span class="p">(</span><span class="s">"sol1={}"</span><span class="p">,</span><span class="n">flashes</span><span class="p">);</span>
	        <span class="p">}</span>

	        <span class="k">if</span> <span class="n">energy</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="o">**</span><span class="n">x</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span><span class="nf">.count</span><span class="p">()</span> <span class="o">==</span> <span class="n">len</span> <span class="k">as</span> <span class="nb">usize</span> <span class="p">{</span>
	            <span class="nf">display_energy</span><span class="p">(</span><span class="o">&amp;</span><span class="n">energy</span><span class="p">);</span>
	            <span class="nd">println!</span><span class="p">(</span><span class="s">"sol2={}"</span><span class="p">,</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
	            <span class="k">break</span><span class="p">;</span>
	        <span class="p">}</span>



	    <span class="p">}</span>


	    
	<span class="p">}</span>


	<span class="k">fn</span> <span class="nf">display_energy</span><span class="p">(</span><span class="n">energy</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span><span class="p">){</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"current energy level and glowing octopuses:"</span><span class="p">);</span>
	    <span class="k">let</span> <span class="n">n</span> <span class="o">=</span> <span class="p">(</span><span class="n">energy</span><span class="nf">.len</span><span class="p">()</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">)</span><span class="nf">.sqrt</span><span class="p">()</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">;</span>
	    <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">n</span> <span class="p">{</span>
	        <span class="k">for</span> <span class="n">j</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">n</span> <span class="p">{</span>
	            <span class="k">match</span> <span class="n">energy</span><span class="p">[(</span><span class="n">i</span><span class="o">*</span><span class="n">n</span><span class="o">+</span><span class="n">j</span><span class="p">)</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">]</span> <span class="p">{</span>
	                <span class="mi">0</span> <span class="k">=&gt;</span> <span class="nd">print!</span><span class="p">(</span><span class="s">"*"</span><span class="p">),</span>
	                <span class="n">n</span> <span class="k">=&gt;</span> <span class="nd">print!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span><span class="n">n</span><span class="p">),</span>
	            <span class="p">}</span>
	        <span class="p">}</span>
	        <span class="nd">println!</span><span class="p">();</span>
	    <span class="p">}</span>
	    <span class="nd">println!</span><span class="p">();</span>
	    <span class="nd">println!</span><span class="p">();</span>
	<span class="p">}</span>


	<span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"5483143223
	2745854711
	5264556173
	6141336146
	6357385478
	4167524645
	2176841721
	6882881134
	4846848554
	5283751526"</span><span class="p">;</span>
	</code></pre></figure>

<p><a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2021-day11">github</a>
<a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=ff1cd10fe576b827891502744f5df77d">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 40/100 - advent of code 2021 day 10 part 1</title><link href="https://maebli.github.io/archive/2021-12-10-100rust-40/" rel="alternate" type="text/html" title="Rust challenge 40/100 - advent of code 2021 day 10 part 1" /><published>2021-12-10T20:00:00+00:00</published><updated>2021-12-10T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-40</id><content type="html" xml:base="https://maebli.github.io/archive/2021-12-10-100rust-40/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#40th-challenge">40th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc-squid2.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="40th-challenge">40th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving today’s <a href="https://adventofcode.com/2021/day/10">AoC day 10 2021</a>.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>I have not gotten around to solving this challenge. Hopefully I’ll get the time soon.</p>

<p><a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2021-day10">github</a>
<a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=5d4473f8e1fca4c42449501d32176066">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 39/100 - advent of code 2021 day 9 part 1</title><link href="https://maebli.github.io/archive/2021-12-09-100rust-39/" rel="alternate" type="text/html" title="Rust challenge 39/100 - advent of code 2021 day 9 part 1" /><published>2021-12-09T20:00:00+00:00</published><updated>2021-12-09T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-39</id><content type="html" xml:base="https://maebli.github.io/archive/2021-12-09-100rust-39/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#39th-challenge">39th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc-squid.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="39th-challenge">39th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving today’s <a href="https://adventofcode.com/2021/day/8">AoC day 8 2021</a>.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>part 1 easy, part 2 not so much.. there is a bug in here, which I will try to fix tomrrow.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">const</span> <span class="n">N</span><span class="p">:</span><span class="nb">usize</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">tunnel</span> <span class="o">=</span> <span class="n">INPUT</span><span class="nf">.lines</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="nf">.as_bytes</span><span class="p">()})</span>
	        <span class="nf">.fold</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">b'9'</span><span class="p">;</span><span class="n">N</span><span class="o">+</span><span class="mi">2</span><span class="p">],|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u8</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">inst</span><span class="p">|{</span>
	            <span class="n">acc</span><span class="nf">.push</span><span class="p">(</span><span class="sc">b'9'</span><span class="p">);</span>
	            <span class="n">acc</span><span class="nf">.extend</span><span class="p">(</span><span class="n">inst</span><span class="nf">.to_vec</span><span class="p">());</span>
	            <span class="n">acc</span><span class="nf">.push</span><span class="p">(</span><span class="sc">b'9'</span><span class="p">);</span>
	            <span class="n">acc</span>
	        <span class="p">});</span>
	    <span class="n">tunnel</span><span class="nf">.extend</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[</span><span class="sc">b'9'</span><span class="p">;(</span><span class="n">N</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span><span class="o">*</span><span class="mi">2</span><span class="p">]);</span>

	    <span class="k">let</span> <span class="n">x</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span><span class="nb">u8</span><span class="p">)</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">tunnel</span>
	        <span class="nf">.windows</span><span class="p">((</span><span class="n">N</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span><span class="o">*</span><span class="mi">3</span><span class="p">)</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;&amp;</span><span class="p">[</span><span class="nb">u8</span><span class="p">]</span><span class="o">&gt;&gt;</span><span class="p">()</span>
	        <span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.enumerate</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{(</span>
	                    <span class="n">x</span><span class="na">.1</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">x</span><span class="na">.1</span><span class="p">[</span><span class="n">N</span><span class="o">+</span><span class="mi">3</span><span class="p">]</span>
	                    <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="na">.1</span><span class="p">[(</span><span class="n">N</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">x</span><span class="na">.1</span><span class="p">[</span><span class="n">N</span><span class="o">+</span><span class="mi">3</span><span class="p">]</span>
	                    <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="na">.1</span><span class="p">[</span><span class="n">N</span><span class="o">+</span><span class="mi">2</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">x</span><span class="na">.1</span><span class="p">[</span><span class="n">N</span><span class="o">+</span><span class="mi">3</span><span class="p">]</span>
	                    <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="na">.1</span><span class="p">[</span><span class="n">N</span><span class="o">+</span><span class="mi">4</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">x</span><span class="na">.1</span><span class="p">[</span><span class="n">N</span><span class="o">+</span><span class="mi">3</span><span class="p">]</span>
	                <span class="p">,</span> <span class="n">x</span><span class="na">.1</span><span class="p">[</span><span class="n">N</span><span class="o">+</span><span class="mi">3</span><span class="p">]</span><span class="o">-</span> <span class="mi">48</span><span class="p">)</span>
	            <span class="p">})</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">sol1</span><span class="p">:</span><span class="nb">u32</span><span class="o">=</span><span class="n">x</span><span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="n">x</span><span class="na">.0</span><span class="p">)</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="n">x</span><span class="na">.1</span><span class="p">)</span>
	        <span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,|</span><span class="n">acc</span><span class="p">,</span><span class="n">inst</span><span class="p">|{</span><span class="n">acc</span><span class="o">+</span><span class="n">inst</span><span class="o">+</span><span class="mi">1</span><span class="p">});</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="n">sol1</span><span class="p">);</span>

	<span class="p">}</span>


	<span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"2199943210
	3987894921
	9856789892
	8767896789
	9899965678"</span><span class="p">;</span>
	</code></pre></figure>

<p><a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2021-day9">github</a>
<a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=5d4473f8e1fca4c42449501d32176066">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 38/100 - advent of code 2021 day 8 part 1 &amp;amp; 2</title><link href="https://maebli.github.io/archive/2021-12-08-100rust-38/" rel="alternate" type="text/html" title="Rust challenge 38/100 - advent of code 2021 day 8 part 1 &amp;amp; 2" /><published>2021-12-08T20:00:00+00:00</published><updated>2021-12-08T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-38</id><content type="html" xml:base="https://maebli.github.io/archive/2021-12-08-100rust-38/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#38th-challenge">38th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc-squid.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="38th-challenge">38th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving today’s <a href="https://adventofcode.com/2021/day/8">AoC day 8 2021</a>.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>part 1 easy, part 2 not so much.. there is a bug in here, which I will try to fix tomrrow.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">borrow</span><span class="p">::</span><span class="n">BorrowMut</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">io</span><span class="p">::</span><span class="n">BufRead</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">ops</span><span class="p">::</span><span class="n">Range</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">byte_set</span><span class="p">::</span><span class="n">ByteSet</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">itertools</span><span class="p">::</span><span class="n">Itertools</span><span class="p">;</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="n">input</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">,</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">INPUT</span><span class="nf">.lines</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span>
	            <span class="k">let</span> <span class="n">y</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.split_once</span><span class="p">(</span><span class="s">" | "</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
	            <span class="p">(</span><span class="n">y</span><span class="na">.0</span><span class="p">,</span><span class="n">y</span><span class="na">.1</span><span class="p">)})</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">x</span><span class="o">=</span> <span class="n">input</span><span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="na">.1</span><span class="nf">.split_whitespace</span><span class="p">()</span>
	            <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.count</span><span class="p">()})</span>
	            <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</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">4</span><span class="p">,</span><span class="mi">7</span><span class="p">]</span><span class="nf">.contains</span><span class="p">(</span><span class="n">x</span><span class="p">)})</span>
	            <span class="nf">.count</span><span class="p">()})</span>
	        <span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,|</span><span class="n">acc</span><span class="p">,</span><span class="n">inst</span><span class="p">|</span><span class="n">acc</span><span class="o">+</span><span class="n">inst</span><span class="p">);</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"sol1:{:?}"</span><span class="p">,</span><span class="n">x</span><span class="p">);</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">sol2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

	    <span class="k">for</span> <span class="n">x</span> <span class="k">in</span> <span class="n">input</span> <span class="p">{</span>

	        <span class="k">let</span> <span class="n">k</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">ByteSet</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">x</span><span class="na">.0</span><span class="nf">.split_whitespace</span><span class="p">()</span>
	            <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="n">x</span><span class="nf">.chars</span><span class="p">()</span>
	                          <span class="nf">.sorted</span><span class="p">()</span>
	                          <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">String</span><span class="o">&gt;</span><span class="p">()</span>
	            <span class="p">)</span><span class="nf">.sorted_by</span><span class="p">(|</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">|{</span><span class="nn">Ord</span><span class="p">::</span><span class="nf">cmp</span><span class="p">(</span><span class="o">&amp;</span><span class="n">a</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.count</span><span class="p">()</span> <span class="p">,</span><span class="o">&amp;</span><span class="n">b</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.count</span><span class="p">())})</span>
	            <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="nn">ByteSet</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="o">&amp;*</span><span class="n">x</span><span class="p">)})</span>
	            <span class="nf">.collect</span><span class="p">();</span>

	        <span class="k">let</span> <span class="n">one</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">four</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">seven</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">eight</span> <span class="o">=</span> <span class="mi">9</span><span class="p">;</span>


	        <span class="k">let</span> <span class="n">three</span> <span class="o">=</span> <span class="n">k</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.position</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="n">x</span> <span class="o">==</span> <span class="p">{</span>
	                <span class="n">k</span><span class="nf">.iter</span><span class="p">()</span>
	                    <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="nf">.len</span><span class="p">()</span> <span class="o">==</span> <span class="mi">5</span> <span class="o">&amp;&amp;</span> <span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">one</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.is_subset</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
	                    <span class="nf">.next</span><span class="p">()</span>
	                    <span class="nf">.unwrap</span><span class="p">()</span>
	            <span class="p">}</span>
	        <span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>

	        <span class="k">let</span> <span class="n">nine</span> <span class="o">=</span> <span class="n">k</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.position</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="n">x</span> <span class="o">==</span> <span class="p">{</span>
	                <span class="n">k</span><span class="nf">.iter</span><span class="p">()</span>
	                    <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="nf">.len</span><span class="p">()</span> <span class="o">==</span> <span class="mi">6</span> <span class="o">&amp;&amp;</span> <span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">three</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.is_subset</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
	                    <span class="nf">.next</span><span class="p">()</span>
	                    <span class="nf">.unwrap</span><span class="p">()</span>
	            <span class="p">}</span>
	        <span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>

	        <span class="k">let</span> <span class="n">six</span> <span class="o">=</span> <span class="n">k</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.position</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="n">x</span> <span class="o">==</span> <span class="p">{</span>
	                <span class="n">k</span><span class="nf">.iter</span><span class="p">()</span>
	                    <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="nf">.len</span><span class="p">()</span> <span class="o">==</span> <span class="mi">6</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">nine</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.is_subset</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
	                    <span class="nf">.next</span><span class="p">()</span>
	                    <span class="nf">.unwrap</span><span class="p">()</span>
	            <span class="p">}</span>
	        <span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>


	        <span class="k">let</span> <span class="n">two</span> <span class="o">=</span> <span class="n">k</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.position</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="n">x</span> <span class="o">==</span> <span class="p">{</span>
	                 <span class="n">k</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.enumerate</span><span class="p">()</span>
	                     <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="na">.0</span> <span class="o">!=</span> <span class="n">three</span><span class="p">})</span>
	                     <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="na">.1</span><span class="p">)</span>
	                     <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="nf">.len</span><span class="p">()</span> <span class="o">==</span> <span class="mi">5</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">six</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.is_subset</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
	                     <span class="nf">.next</span><span class="p">()</span>
	                     <span class="nf">.unwrap</span><span class="p">()</span>
	            <span class="p">}</span>
	        <span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>


	        <span class="k">let</span> <span class="n">zero</span> <span class="o">=</span> <span class="n">k</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.position</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="n">x</span> <span class="o">==</span> <span class="p">{</span>
	            <span class="n">k</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.enumerate</span><span class="p">()</span>
	                <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="na">.0</span> <span class="o">!=</span> <span class="n">six</span> <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="na">.0</span> <span class="o">!=</span><span class="n">nine</span><span class="p">})</span>
	                <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="na">.1</span><span class="p">)</span>
	                <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="nf">.len</span><span class="p">()</span> <span class="o">==</span> <span class="mi">6</span><span class="p">)</span>
	                <span class="nf">.next</span><span class="p">()</span>
	                <span class="nf">.unwrap</span><span class="p">()</span>
	        <span class="p">}</span>
	        <span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>

	        <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="n">zero</span><span class="p">,</span><span class="n">one</span><span class="p">,</span><span class="n">two</span><span class="p">,</span><span class="n">three</span><span class="p">,</span><span class="n">four</span><span class="p">,</span><span class="n">six</span><span class="p">,</span><span class="n">seven</span><span class="p">,</span><span class="n">eight</span><span class="p">,</span><span class="n">nine</span><span class="p">];</span>
	        <span class="k">let</span> <span class="n">five</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="o">..</span><span class="mi">10</span><span class="p">)</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="o">!</span><span class="n">a</span><span class="nf">.contains</span><span class="p">(</span><span class="n">x</span><span class="p">)})</span><span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">usize</span><span class="o">&gt;&gt;</span><span class="p">();</span>
	        <span class="k">let</span> <span class="n">five</span> <span class="o">=</span> <span class="o">*</span><span class="n">five</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>

	        <span class="k">let</span> <span class="n">sorted</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span>
	            <span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">zero</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">(),</span>
	            <span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">one</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">(),</span>
	            <span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">two</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">(),</span>
	            <span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">three</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">(),</span>
	            <span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">four</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">(),</span>
	            <span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">five</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">(),</span>
	            <span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">six</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">(),</span>
	            <span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">seven</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">(),</span>
	            <span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">eight</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">(),</span>
	            <span class="n">k</span><span class="nf">.get</span><span class="p">(</span><span class="n">nine</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">(),];</span>

	        <span class="k">let</span> <span class="k">mut</span> <span class="n">k</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">ByteSet</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">x</span><span class="na">.1</span><span class="nf">.split_whitespace</span><span class="p">()</span>
	            <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="n">x</span><span class="nf">.chars</span><span class="p">()</span>
	                <span class="nf">.sorted</span><span class="p">()</span>
	                <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">String</span><span class="o">&gt;</span><span class="p">()</span>
	            <span class="p">)</span>
	            <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="nn">ByteSet</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="o">&amp;*</span><span class="n">x</span><span class="p">)})</span>
	            <span class="nf">.collect</span><span class="p">();</span>

	        <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

	        <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="n">k</span> <span class="p">{</span>
	            <span class="n">x</span><span class="o">+=</span><span class="n">sorted</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.position</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="n">i</span><span class="nf">.as_bytes</span><span class="p">()</span> <span class="o">==</span> <span class="n">x</span><span class="nf">.as_bytes</span><span class="p">())</span><span class="nf">.unwrap</span><span class="p">();</span>
	            <span class="n">x</span><span class="o">*=</span><span class="mi">10</span><span class="p">;</span>
	        <span class="p">}</span>
	        <span class="n">x</span><span class="o">/=</span><span class="mi">10</span><span class="p">;</span>

	        <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span><span class="n">x</span><span class="p">);</span>
	        <span class="n">sol2</span><span class="o">+=</span> <span class="n">x</span><span class="p">;</span>

	    <span class="p">}</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span><span class="n">sol2</span><span class="p">);</span>


	<span class="p">}</span>



	<span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe
	edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc
	fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg
	fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb
	aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea
	fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb
	dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe
	bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef
	egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb
	gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce"</span><span class="p">;</span>

	</code></pre></figure>

<p><a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2021-day8">github</a>
<a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=421e630ebf245d5359d7b3b1a855307c">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 37/100 - advent of code 2021 day 7 part 1 &amp;amp; 2</title><link href="https://maebli.github.io/archive/2021-12-07-100rust-37/" rel="alternate" type="text/html" title="Rust challenge 37/100 - advent of code 2021 day 7 part 1 &amp;amp; 2" /><published>2021-12-07T20:00:00+00:00</published><updated>2021-12-07T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-37</id><content type="html" xml:base="https://maebli.github.io/archive/2021-12-07-100rust-37/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#37th-challenge">37th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc-squid.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="37th-challenge">37th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving today’s <a href="https://adventofcode.com/2021/day/7">AoC day 7 2021</a>.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>This challenge was fun, more brute force friendly than yesterdays challenge.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">v</span> <span class="o">=</span><span class="n">INPUT</span><span class="nf">.split</span><span class="p">(</span><span class="s">","</span><span class="p">)</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span>
	        <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;&gt;</span><span class="p">();</span>

	    <span class="n">v</span><span class="nf">.sort</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">c</span> <span class="o">=</span> <span class="n">v</span><span class="nf">.len</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">median</span> <span class="o">=</span> <span class="k">match</span> <span class="n">c</span><span class="o">%</span><span class="mi">2</span> <span class="p">{</span>
	        <span class="mi">1</span> <span class="k">=&gt;</span> <span class="o">*</span><span class="n">v</span><span class="nf">.get</span><span class="p">(</span><span class="n">c</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="k">as</span> <span class="nb">f32</span><span class="p">,</span>
	        <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">((</span><span class="n">v</span><span class="nf">.get</span><span class="p">(</span><span class="n">c</span><span class="o">/</span><span class="mi">2</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span><span class="o">+</span><span class="n">v</span><span class="nf">.get</span><span class="p">(</span><span class="n">c</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">())</span> <span class="k">as</span> <span class="nb">f32</span><span class="p">)</span><span class="nf">.abs</span><span class="p">()</span> <span class="o">/</span> <span class="mf">2f32</span>
	    <span class="p">};</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"sol1:{}"</span><span class="p">,</span><span class="n">v</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,|</span><span class="n">acc</span><span class="p">,</span><span class="n">inst</span><span class="p">|{</span><span class="n">acc</span><span class="o">+</span><span class="p">(</span><span class="o">*</span><span class="n">inst</span><span class="o">-</span><span class="p">(</span><span class="n">median</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">))</span><span class="nf">.abs</span><span class="p">()}));</span>

	    <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="o">..*</span><span class="p">(</span><span class="n">v</span><span class="nf">.get</span><span class="p">(</span><span class="n">v</span><span class="nf">.len</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()))</span>
	        <span class="nf">.fold</span><span class="p">(</span><span class="nn">i32</span><span class="p">::</span><span class="n">MAX</span><span class="p">,|</span><span class="n">acc</span><span class="p">,</span> <span class="n">k</span><span class="p">|</span>
	            <span class="p">{(</span><span class="n">v</span><span class="nf">.iter</span><span class="p">()</span>
	                <span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,|</span><span class="n">acc</span><span class="p">,</span><span class="n">inst</span><span class="p">|</span><span class="n">acc</span><span class="o">+</span><span class="nf">find_fuel2</span><span class="p">((</span><span class="o">*</span><span class="n">inst</span><span class="o">-</span><span class="n">k</span><span class="p">)</span><span class="nf">.abs</span><span class="p">()))</span>
	            <span class="p">)</span><span class="nf">.min</span><span class="p">(</span><span class="n">acc</span><span class="p">)</span>
	            <span class="p">}</span>
	        <span class="p">);</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"sol2:{}"</span><span class="p">,</span><span class="n">x</span><span class="p">);</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">find_fuel2</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="nb">i32</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">i32</span><span class="p">{</span>
	     <span class="n">x</span><span class="o">*</span><span class="p">(</span><span class="n">x</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="p">}</span>

	<span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"16,1,2,0,4,2,7,1,2,14"</span><span class="p">;</span>

	</code></pre></figure>

<p><a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2021-day7">github</a>
<a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=d2cb739f7d536d226a3994feec0d1e7c">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 36/100 - advent of code 2021 day 6 part 1 &amp;amp; 2</title><link href="https://maebli.github.io/archive/2021-12-06-100rust-36/" rel="alternate" type="text/html" title="Rust challenge 36/100 - advent of code 2021 day 6 part 1 &amp;amp; 2" /><published>2021-12-06T20:00:00+00:00</published><updated>2021-12-06T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-36</id><content type="html" xml:base="https://maebli.github.io/archive/2021-12-06-100rust-36/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#36th-challenge">36th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a>
        <ul>
          <li><a href="#rotate_left">rotate_left(..)</a></li>
          <li><a href="#include_str">include_str!(””)</a></li>
          <li><a href="#bench">bench()</a></li>
          <li><a href="#let-mut-state--0u64-9">let mut state = [0u64; 9];</a></li>
          <li><a href="#xor_insert0">x.or_insert(0)</a></li>
          <li><a href="#xfor_each">x.for_each()</a></li>
          <li><a href="#use-itertoolsiterate-itertools">use itertools::{iterate, Itertools};</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<p><img src="/assets/img/aoc.png" alt="" /></p>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="36th-challenge">36th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving today’s <a href="https://adventofcode.com/2021/day/6">AoC day 6 2021</a>.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Ok, maybe slightly different approach of learning today. I’m going to look at the functions used by other rust solutions before starting. If I don’t know them I will learn their meaning
before I start. Lets take a look at the <a href="https://www.reddit.com/r/adventofcode/comments/r9z49j/2021_day_6_solutions/">Reddit Mega Thread for Day 6</a>.</p>

<p>Skimming through the thread I found the following functional calls, seems nothing too special going on today. Maybe I need to add the whole scope into my search.</p>

<h4 id="rotate_left">rotate_left(..)</h4>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">0x12345678u32</span><span class="p">;</span>
	    
	    <span class="k">for</span> <span class="n">_</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="mi">9</span> <span class="p">{</span>

	        <span class="nd">println!</span><span class="p">(</span><span class="s">"{:#x}"</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="n">n</span><span class="nf">.rotate_left</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="cm">/* outputs :
	0x12345678
	0x23456781
	0x34567812
	0x45678123
	0x56781234
	0x67812345
	0x78123456
	0x81234567
	0x12345678 */</span> 
	</code></pre></figure>

<h4 id="include_str">include_str!(“”)</h4>

<p>This adds a string literal into the code source. I prefer to just create one in my code with <code class="language-plaintext highlighter-rouge">const INPUT:&amp;str..</code></p>

<h4 id="bench">bench()</h4>

<p>Used to benchmark a method, if you’re interested in the speed of your code which I’m currently not.</p>

<h4 id="let-mut-state--0u64-9">let mut state = [0u64; 9];</h4>

<p>Initalizing an array with <code class="language-plaintext highlighter-rouge">u64</code>int length <code class="language-plaintext highlighter-rouge">9</code>.</p>

<h4 id="xor_insert0">x.or_insert(0)</h4>

<p>See the <a href="https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html">rust doc</a>.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::</span><span class="n">HashMap</span><span class="p">;</span>

	<span class="k">let</span> <span class="k">mut</span> <span class="n">map</span><span class="p">:</span> <span class="n">HashMap</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="p">,</span> <span class="nb">u32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nn">HashMap</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>

	<span class="n">map</span><span class="nf">.entry</span><span class="p">(</span><span class="s">"poneyland"</span><span class="p">)</span><span class="nf">.or_insert</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
	<span class="nd">assert_eq!</span><span class="p">(</span><span class="n">map</span><span class="p">[</span><span class="s">"poneyland"</span><span class="p">],</span> <span class="mi">3</span><span class="p">);</span>

	<span class="o">*</span><span class="n">map</span><span class="nf">.entry</span><span class="p">(</span><span class="s">"poneyland"</span><span class="p">)</span><span class="nf">.or_insert</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="o">*=</span> <span class="mi">2</span><span class="p">;</span>
	<span class="nd">assert_eq!</span><span class="p">(</span><span class="n">map</span><span class="p">[</span><span class="s">"poneyland"</span><span class="p">],</span> <span class="mi">6</span><span class="p">);</span>
	</code></pre></figure>

<h4 id="xfor_each">x.for_each()</h4>

<p>Like most languages, rust has a for_each iteration method. See <a href="https://stackoverflow.com/questions/28651259/modifying-self-in-iter-mut-map-aka-mutable-functional-collection-operat">Stackoverflow thread on when to use for_each</a>.</p>

<h4 id="use-itertoolsiterate-itertools">use itertools::{iterate, Itertools};</h4>

<p>This is a handy dandy toolbox for powerful iterator operations. I defentely want to invest some time to get to know the scope of the lib.</p>

<p>Ok that didn’t help much. The first part was easy but I implemented it badly keeping track of every fishes individual clock rather than the number of fishes with a given clock.
I ended up cheating off of the answer of <a href="https://github.com/yorhodes/advent-of-code/blob/master/2021/day6/src/main.rs">Github User yorhodes</a> after trying recursive approach, filter
approach and what not but always trying to keep track of every fish … oh well better luck next time.</p>

<p>Oh well better luck next time.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 35/100 - advent of code 2021 day 5 part 1 &amp;amp; 2</title><link href="https://maebli.github.io/archive/2021-12-05-100rust-35/" rel="alternate" type="text/html" title="Rust challenge 35/100 - advent of code 2021 day 5 part 1 &amp;amp; 2" /><published>2021-12-05T20:00:00+00:00</published><updated>2021-12-05T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-35</id><content type="html" xml:base="https://maebli.github.io/archive/2021-12-05-100rust-35/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#35th-challenge">35th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="35th-challenge">35th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving today’s <a href="https://adventofcode.com/2021/day/5">AoC day 5 2021</a>.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Ok this part was straight forward but a tad tedious felt a bit like work, second part was fun made my solution more genneral.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="n">cmp</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">cmp</span><span class="p">::</span><span class="n">Ordering</span><span class="p">;</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="n">lines</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Line</span><span class="o">&gt;=</span><span class="n">INPUT</span>
	        <span class="nf">.lines</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="nn">Line</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">x</span><span class="p">)})</span>
	        <span class="c1">// Uncomment for challenge 1 result</span>
	        <span class="c1">//.filter(|x|{x.is_horizontal()|x.is_vertical()})</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">d</span> <span class="o">=</span> <span class="nn">SquareMap</span><span class="p">::</span><span class="nf">of_size</span><span class="p">(</span><span class="n">MAX_X_AND_Y_COORDINATE</span><span class="p">);</span>

	    <span class="n">d</span><span class="nf">.consume_lines</span><span class="p">(</span><span class="n">lines</span><span class="p">);</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span><span class="n">d</span><span class="nf">.danger_point_count</span><span class="p">());</span>
	<span class="p">}</span>

	<span class="nd">#[derive(Debug)]</span>
	<span class="k">struct</span> <span class="n">SquareMap</span> <span class="p">{</span>
	    <span class="n">size</span><span class="p">:</span><span class="nb">usize</span><span class="p">,</span>
	    <span class="n">fields</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="n">SquareMap</span> <span class="p">{</span>

	    <span class="k">fn</span> <span class="nf">of_size</span><span class="p">(</span><span class="n">s</span><span class="p">:</span><span class="nb">usize</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">SquareMap</span> <span class="p">{</span>
	        <span class="n">SquareMap</span> <span class="p">{</span> <span class="n">size</span><span class="p">:</span><span class="n">s</span><span class="p">,</span><span class="n">fields</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="mi">0</span><span class="p">;</span> <span class="n">s</span><span class="o">*</span><span class="n">s</span><span class="p">]</span> <span class="p">}</span>
	    <span class="p">}</span>

	    <span class="k">pub</span> <span class="k">fn</span> <span class="nf">increment_danger</span><span class="p">(</span><span class="o">&amp;</span> <span class="k">mut</span> <span class="k">self</span><span class="p">,</span> <span class="n">p</span><span class="p">:</span><span class="n">Point</span><span class="p">){</span>
	        <span class="k">let</span> <span class="n">i</span> <span class="o">=</span><span class="p">(</span> <span class="n">p</span><span class="py">.x</span> <span class="o">+</span> <span class="n">p</span><span class="py">.y</span> <span class="o">*</span> <span class="p">(</span><span class="k">self</span><span class="py">.size</span> <span class="k">as</span> <span class="nb">u32</span><span class="p">)</span> <span class="p">)</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">;</span>
	        <span class="k">self</span><span class="py">.fields</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">+=</span><span class="mi">1</span><span class="p">;</span>
	    <span class="p">}</span>

	    <span class="k">pub</span> <span class="k">fn</span> <span class="nf">consume_line</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span> <span class="n">l</span><span class="p">:</span><span class="n">Line</span><span class="p">){</span>

	        <span class="k">let</span> <span class="n">g</span> <span class="o">=</span> <span class="n">l</span><span class="nf">.gradient</span><span class="p">();</span>

	        <span class="k">let</span> <span class="k">mut</span> <span class="n">p</span> <span class="o">=</span> <span class="n">l</span><span class="py">.start</span><span class="p">;</span>

	        <span class="k">for</span> <span class="n">_</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="p">(</span><span class="n">l</span><span class="nf">.length</span><span class="p">()</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
	            <span class="nn">SquareMap</span><span class="p">::</span><span class="nf">increment_danger</span><span class="p">(</span><span class="k">self</span><span class="p">,</span><span class="n">p</span><span class="p">);</span>
	            <span class="n">p</span><span class="py">.x</span> <span class="o">=</span> <span class="p">(</span><span class="n">p</span><span class="py">.x</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">+</span> <span class="n">g</span><span class="py">.x</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u32</span><span class="p">;</span>
	            <span class="n">p</span><span class="py">.y</span> <span class="o">=</span> <span class="p">(</span><span class="n">p</span><span class="py">.y</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">+</span> <span class="n">g</span><span class="py">.y</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u32</span><span class="p">;</span>
	        <span class="p">}</span>

	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">consume_lines</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span> <span class="n">l</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Line</span><span class="o">&gt;</span><span class="p">){</span>
	        <span class="k">for</span> <span class="n">line</span> <span class="k">in</span> <span class="n">l</span> <span class="p">{</span>
	            <span class="nn">SquareMap</span><span class="p">::</span><span class="nf">consume_line</span><span class="p">(</span><span class="k">self</span><span class="p">,</span> <span class="n">line</span><span class="p">);</span>
	        <span class="p">}</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">danger_point_count</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u32</span> <span class="p">{</span>
	        <span class="k">self</span><span class="py">.fields</span><span class="nf">.iter</span><span class="p">()</span>
	            <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span> <span class="o">**</span><span class="n">x</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="p">})</span>
	            <span class="nf">.count</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u32</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="nd">#[derive(Debug)]</span>
	<span class="k">struct</span> <span class="n">Gradient</span> <span class="p">{</span>
	    <span class="n">x</span><span class="p">:</span><span class="nb">i32</span><span class="p">,</span>
	    <span class="n">y</span><span class="p">:</span><span class="nb">i32</span>
	<span class="p">}</span>

	<span class="nd">#[derive(Debug,</span> <span class="nd">Clone,</span> <span class="nd">Copy)]</span>
	<span class="k">struct</span> <span class="n">Point</span> <span class="p">{</span>
	    <span class="n">x</span><span class="p">:</span><span class="nb">u32</span><span class="p">,</span>
	    <span class="n">y</span><span class="p">:</span><span class="nb">u32</span>
	<span class="p">}</span>


	<span class="k">impl</span> <span class="n">Point</span> <span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">from</span><span class="p">(</span><span class="n">s</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Point</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">s</span><span class="nf">.split_once</span><span class="p">(</span><span class="s">","</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
	        <span class="n">Point</span><span class="p">{</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="na">.0</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="na">.1</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="p">}</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="nd">#[derive(Debug)]</span>
	<span class="k">struct</span> <span class="n">Line</span><span class="p">{</span>
	    <span class="n">start</span><span class="p">:</span><span class="n">Point</span><span class="p">,</span>
	    <span class="n">end</span><span class="p">:</span><span class="n">Point</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="n">Line</span> <span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">from</span><span class="p">(</span><span class="n">s</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Line</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="n">s</span><span class="nf">.split_once</span><span class="p">(</span><span class="s">" -&gt; "</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
	        <span class="n">Line</span><span class="p">{</span> <span class="n">start</span><span class="p">:</span> <span class="nn">Point</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">a</span><span class="na">.0</span><span class="p">),</span> <span class="n">end</span><span class="p">:</span> <span class="nn">Point</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">a</span><span class="na">.1</span><span class="p">)</span> <span class="p">}</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">gradient</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Gradient</span> <span class="p">{</span>

	        <span class="k">let</span> <span class="n">dx</span> <span class="o">=</span> <span class="k">self</span><span class="py">.end.x</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">-</span> <span class="k">self</span><span class="py">.start.x</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">dy</span>  <span class="o">=</span> <span class="k">self</span><span class="py">.end.y</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">-</span> <span class="k">self</span><span class="py">.start.y</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">;</span>

	        <span class="k">let</span> <span class="n">dx</span> <span class="o">=</span> <span class="k">match</span> <span class="mi">0</span><span class="nf">.cmp</span><span class="p">(</span><span class="o">&amp;</span><span class="n">dx</span><span class="p">)</span> <span class="p">{</span>
	            <span class="nn">Ordering</span><span class="p">::</span><span class="n">Less</span> <span class="k">=&gt;</span> <span class="mi">1</span><span class="p">,</span>
	            <span class="nn">Ordering</span><span class="p">::</span><span class="n">Greater</span> <span class="k">=&gt;</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span>
	            <span class="n">_</span> <span class="k">=&gt;</span> <span class="mi">0</span>
	        <span class="p">};</span>

	        <span class="k">let</span> <span class="n">dy</span> <span class="o">=</span> <span class="k">match</span> <span class="mi">0</span><span class="nf">.cmp</span><span class="p">(</span><span class="o">&amp;</span><span class="n">dy</span><span class="p">)</span> <span class="p">{</span>
	            <span class="nn">Ordering</span><span class="p">::</span><span class="n">Less</span> <span class="k">=&gt;</span> <span class="mi">1</span><span class="p">,</span>
	            <span class="nn">Ordering</span><span class="p">::</span><span class="n">Greater</span> <span class="k">=&gt;</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span>
	            <span class="n">_</span> <span class="k">=&gt;</span> <span class="mi">0</span>
	        <span class="p">};</span>

	        <span class="n">Gradient</span><span class="p">{</span>
	            <span class="n">x</span><span class="p">:</span> <span class="n">dx</span><span class="p">,</span>
	            <span class="n">y</span><span class="p">:</span> <span class="n">dy</span>
	        <span class="p">}</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">length</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u32</span> <span class="p">{</span>
	        <span class="nn">cmp</span><span class="p">::</span><span class="nf">max</span><span class="p">((</span><span class="k">self</span><span class="py">.end.x</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">-</span> <span class="k">self</span><span class="py">.start.x</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">)</span><span class="nf">.abs</span><span class="p">(),</span>
	            <span class="p">(</span><span class="k">self</span><span class="py">.end.y</span> <span class="k">as</span> <span class="nb">i32</span> <span class="o">-</span> <span class="k">self</span><span class="py">.start.y</span> <span class="k">as</span> <span class="nb">i32</span><span class="p">)</span><span class="nf">.abs</span><span class="p">())</span> <span class="k">as</span> <span class="nb">u32</span>

	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">is_horizontal</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span><span class="nb">bool</span> <span class="p">{</span>
	        <span class="k">self</span><span class="nf">.gradient</span><span class="p">()</span><span class="py">.x</span> <span class="o">==</span> <span class="mi">0</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">is_vertical</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span><span class="nb">bool</span> <span class="p">{</span>
	        <span class="k">self</span><span class="nf">.gradient</span><span class="p">()</span><span class="py">.y</span> <span class="o">==</span> <span class="mi">0</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">const</span> <span class="n">MAX_X_AND_Y_COORDINATE</span><span class="p">:</span><span class="nb">usize</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> <span class="c1">// change to 1000 for challenge input</span>
	<span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"0,9 -&gt; 5,9
	8,0 -&gt; 0,8
	9,4 -&gt; 3,4
	2,2 -&gt; 2,1
	7,0 -&gt; 7,4
	6,4 -&gt; 2,0
	0,9 -&gt; 2,9
	3,4 -&gt; 1,4
	0,0 -&gt; 8,8
	5,5 -&gt; 8,2"</span><span class="p">;</span>
	</code></pre></figure>

<p><a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2021-day5">github</a>
<a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=5bb6619c5d2bf5c2cf0bff2c7d796673">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 34/100 - advent of code 2021 day 4 part 1&amp;amp;2</title><link href="https://maebli.github.io/archive/2021-12-05-100rust-34/" rel="alternate" type="text/html" title="Rust challenge 34/100 - advent of code 2021 day 4 part 1&amp;amp;2" /><published>2021-12-04T20:00:00+00:00</published><updated>2021-12-04T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-34</id><content type="html" xml:base="https://maebli.github.io/archive/2021-12-05-100rust-34/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#34th-challenge">34th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="34th-challenge">34th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving today’s <a href="https://adventofcode.com/2021/day/4">AoC day 4 2021</a>. I’m only showing the source for part 1, part two is very similar and can be viewed in playground
<a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=100d84d37c54667067db0f2d06acb16b">playground</a>. I want to start with challenge 5, as I am behind, and not waste time
making this more generic.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>This was realtively simple. I took an object oriented approach. Difficult part was finding a :bug:. See the comments bellow that shows the offending line.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">process</span><span class="p">::</span><span class="n">exit</span><span class="p">;</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="n">bingo_numbers</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">BINGO_NUMBERS</span>
	        <span class="nf">.split</span><span class="p">(</span><span class="s">","</span><span class="p">)</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()})</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">bingo_boards</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">BINGO_BOARDS</span>
	        <span class="nf">.split</span><span class="p">(</span><span class="s">"</span><span class="se">\n\n</span><span class="s">"</span><span class="p">)</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">boards</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">BingoBoard</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[];</span>

	    <span class="k">for</span> <span class="n">bingo_board</span> <span class="k">in</span> <span class="n">bingo_boards</span> <span class="p">{</span>

	        <span class="k">let</span> <span class="n">x</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">bingo_board</span>
	            <span class="nf">.split_whitespace</span><span class="p">()</span>
	            <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="nn">String</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">x</span><span class="p">)})</span>
	            <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span> <span class="o">!=</span> <span class="s">""</span><span class="p">})</span>
	            <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()})</span>
	            <span class="nf">.collect</span><span class="p">();</span>

	        <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="nn">BingoBoard</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>
	        <span class="n">boards</span><span class="nf">.push</span><span class="p">(</span><span class="n">b</span><span class="p">);</span>
	    <span class="p">}</span>

	    <span class="k">for</span> <span class="n">x</span> <span class="k">in</span> <span class="n">bingo_numbers</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">board_num</span><span class="p">:</span><span class="nb">u32</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	        <span class="k">for</span> <span class="n">b</span> <span class="k">in</span> <span class="n">boards</span><span class="nf">.iter_mut</span><span class="p">()</span> <span class="p">{</span>
	            <span class="n">board_num</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>

	            <span class="n">b</span><span class="nf">.update</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>

	            <span class="k">if</span> <span class="n">b</span><span class="nf">.we_have_a_winner</span><span class="p">()</span> <span class="p">{</span>
	                <span class="nd">println!</span><span class="p">(</span><span class="s">"Last called Number = {}"</span><span class="p">,</span><span class="n">x</span><span class="p">);</span>
	                <span class="nd">println!</span><span class="p">(</span><span class="s">"we have a winner, board #{}, solution =  {}*{} = {}"</span><span class="p">,</span><span class="n">board_num</span><span class="p">,</span>
	                    <span class="n">b</span><span class="nf">.sum_of_uncalled</span><span class="p">(),</span><span class="n">x</span><span class="p">,</span><span class="n">b</span><span class="nf">.sum_of_uncalled</span><span class="p">()</span><span class="o">*</span><span class="n">x</span><span class="p">);</span>
	                    <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	            <span class="p">}</span>
	        <span class="p">}</span>
	    <span class="p">}</span>
	<span class="p">}</span>



	<span class="k">struct</span> <span class="n">BingoBoard</span><span class="p">{</span>
	    <span class="n">fields</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">BingoField</span><span class="o">&gt;</span>
	<span class="p">}</span>

	<span class="nd">#[derive(Clone)]</span>
	<span class="k">struct</span> <span class="n">BingoField</span><span class="p">{</span>
	    <span class="n">was_called</span><span class="p">:</span><span class="nb">bool</span><span class="p">,</span>
	    <span class="n">number</span><span class="p">:</span><span class="nb">u32</span>
	<span class="p">}</span>



	<span class="k">impl</span> <span class="n">BingoBoard</span> <span class="p">{</span>

	    <span class="k">fn</span> <span class="nf">we_have_a_winner</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>

	        <span class="k">let</span> <span class="k">mut</span> <span class="n">is_winner</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>

	        <span class="k">for</span> <span class="n">j</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="mi">5</span> <span class="p">{</span>
	            <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="mi">5</span> <span class="p">{</span>
	                <span class="n">is_winner</span> <span class="o">&amp;=</span> <span class="k">self</span><span class="py">.fields</span>
	                    <span class="nf">.get</span><span class="p">(</span><span class="n">j</span><span class="o">*</span><span class="mi">5</span> <span class="o">+</span> <span class="n">i</span><span class="p">)</span> <span class="c1">// &lt;--------------------- bug here went undiscoved, forgot about "5"</span>
	                    <span class="nf">.unwrap</span><span class="p">()</span>
	                    <span class="py">.was_called</span><span class="p">;</span>
	            <span class="p">}</span>
	            <span class="k">if</span> <span class="n">is_winner</span> <span class="p">{</span>
	                <span class="k">return</span> <span class="k">true</span>
	            <span class="p">}</span>
	            <span class="n">is_winner</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
	        <span class="p">}</span>

	        <span class="k">for</span> <span class="n">j</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="mi">5</span> <span class="p">{</span>
	            <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="mi">5</span> <span class="p">{</span>
	                <span class="n">is_winner</span> <span class="o">&amp;=</span> <span class="k">self</span><span class="py">.fields</span>
	                    <span class="nf">.get</span><span class="p">(</span><span class="n">j</span> <span class="o">+</span> <span class="n">i</span><span class="o">*</span><span class="mi">5</span><span class="p">)</span>
	                    <span class="nf">.unwrap</span><span class="p">()</span>
	                    <span class="py">.was_called</span><span class="p">;</span>
	            <span class="p">}</span>

	            <span class="k">if</span> <span class="n">is_winner</span> <span class="p">{</span>
	                <span class="k">return</span> <span class="k">true</span>
	            <span class="p">}</span>

	            <span class="n">is_winner</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
	        <span class="p">}</span>

	        <span class="k">false</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">update</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span><span class="n">num</span><span class="p">:</span><span class="nb">u32</span><span class="p">)</span> <span class="k">-&gt;</span><span class="nb">bool</span><span class="p">{</span>
	        <span class="k">for</span> <span class="n">b</span> <span class="k">in</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="py">.fields</span> <span class="p">{</span>
	            <span class="k">if</span> <span class="n">b</span><span class="py">.number</span> <span class="o">==</span> <span class="n">num</span> <span class="p">{</span>
	                <span class="n">b</span><span class="py">.was_called</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
	                <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
	            <span class="p">}</span>
	        <span class="p">}</span>
	        <span class="k">false</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">from</span> <span class="p">(</span><span class="n">v</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">BingoBoard</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">b</span> <span class="o">=</span> <span class="n">BingoBoard</span><span class="p">{</span> <span class="n">fields</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[]</span> <span class="p">};</span>
	        <span class="k">for</span> <span class="n">x</span> <span class="k">in</span> <span class="n">v</span> <span class="p">{</span>
	            <span class="k">let</span> <span class="n">f</span> <span class="o">=</span> <span class="n">BingoField</span><span class="p">{</span> <span class="n">was_called</span><span class="p">:</span> <span class="k">false</span><span class="p">,</span> <span class="n">number</span><span class="p">:</span> <span class="n">x</span> <span class="p">};</span>
	            <span class="n">b</span><span class="nf">.push</span><span class="p">(</span><span class="n">f</span><span class="p">);</span>
	        <span class="p">}</span>
	        <span class="n">b</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">push</span> <span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span><span class="n">f</span><span class="p">:</span><span class="n">BingoField</span><span class="p">){</span>
	        <span class="k">self</span><span class="py">.fields</span><span class="nf">.push</span><span class="p">(</span><span class="n">f</span><span class="p">);</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">sum_of_uncalled</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u32</span><span class="p">{</span>
	        <span class="k">self</span><span class="py">.fields</span><span class="nf">.iter</span><span class="p">()</span>
	            <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="o">!</span><span class="n">x</span><span class="py">.was_called</span> <span class="p">})</span>
	            <span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,|</span><span class="n">acc</span><span class="p">,</span><span class="n">inst</span><span class="p">|{</span><span class="n">acc</span> <span class="o">+</span> <span class="n">inst</span><span class="py">.number</span><span class="p">})</span>
	    <span class="p">}</span>
	<span class="p">}</span>


	<span class="k">const</span> <span class="n">BINGO_NUMBERS</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span><span class="s">"7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1"</span><span class="p">;</span>
	<span class="k">const</span> <span class="n">BINGO_BOARDS</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span><span class="s">"22 13 17 11  0
	 8  2 23  4 24
	21  9 14 16  7
	 6 10  3 18  5
	 1 12 20 15 19

	 3 15  0  2 22
	 9 18 13 17  5
	19  8  7 25 23
	20 11 10 24  4
	14 21 16 12  6

	14 21 17 24  4
	10 16 15  9 19
	18  8 23 26 20
	22 11 13  6  5
	 2  0 12  3  7"</span><span class="p">;</span>
	</code></pre></figure>

<p><a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2021-day4">github part 1</a></p>

<p><a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=100d84d37c54667067db0f2d06acb16b">playground</a>
<a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=561f853d8f8f81bf2409cb385fa90c69">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 33/100 - advent of code 2021 day 3 part 1 &amp;amp; 2</title><link href="https://maebli.github.io/archive/2021-12-03-100rust-33/" rel="alternate" type="text/html" title="Rust challenge 33/100 - advent of code 2021 day 3 part 1 &amp;amp; 2" /><published>2021-12-03T20:00:00+00:00</published><updated>2021-12-03T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-33</id><content type="html" xml:base="https://maebli.github.io/archive/2021-12-03-100rust-33/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#33rd-challenge">33rd Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="33rd-challenge">33rd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving today’s <a href="https://adventofcode.com/2021/day/3">AoC day 3 2021</a>. So far only part one is done. Part two coming soon.. :sweat:.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="n">x</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;&gt;</span> <span class="o">=</span> <span class="n">DIAGNOSTIC_REPORT</span><span class="nf">.lines</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">l</span><span class="p">|</span> <span class="p">{</span>
	            <span class="n">l</span><span class="nf">.as_bytes</span><span class="p">()</span>
	                <span class="nf">.into_iter</span><span class="p">()</span>
	                <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span><span class="o">*</span><span class="n">x</span> <span class="o">==</span> <span class="sc">b'1'</span><span class="p">)</span>
	                <span class="nf">.collect</span><span class="p">()</span>
	        <span class="p">})</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">length</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.len</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u32</span><span class="p">;</span>

	    <span class="k">let</span> <span class="n">bit_count</span> <span class="o">=</span> <span class="n">x</span>
	        <span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.fold</span><span class="p">(</span><span class="nd">vec!</span><span class="p">[</span><span class="mi">0</span><span class="p">;</span> <span class="n">length</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">],</span> <span class="p">|</span><span class="n">acc</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">inst</span><span class="p">|{</span>
	        <span class="n">acc</span>
	            <span class="nf">.iter</span><span class="p">()</span><span class="nf">.zip</span><span class="p">(</span><span class="n">inst</span><span class="nf">.iter</span><span class="p">())</span>
	            <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span><span class="k">match</span> <span class="n">x</span><span class="na">.1</span>
	                <span class="p">{</span>
	                    <span class="k">true</span> <span class="k">=&gt;</span><span class="p">{</span> <span class="o">*</span><span class="n">x</span><span class="na">.0</span> <span class="o">+</span> <span class="mi">1</span><span class="p">},</span>
	                    <span class="k">false</span> <span class="k">=&gt;</span> <span class="o">*</span><span class="n">x</span><span class="na">.0</span>
	            <span class="p">}})</span>
	            <span class="nf">.collect</span><span class="p">()</span>
	    <span class="p">});</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="n">bit_count</span><span class="p">);</span>

	    <span class="k">let</span> <span class="n">gamma</span><span class="o">=</span> <span class="n">bit_count</span><span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span> <span class="p">(</span><span class="o">*</span><span class="n">x</span> <span class="o">&gt;</span> <span class="n">length</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u32</span><span class="p">})</span>
	        <span class="nf">.rev</span><span class="p">()</span>
	        <span class="nf">.enumerate</span><span class="p">()</span>
	        <span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,|</span><span class="n">acc</span><span class="p">,</span> <span class="n">inst</span><span class="p">|{</span>
	            <span class="n">acc</span> <span class="p">|</span> <span class="p">(</span><span class="n">inst</span><span class="na">.1</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">inst</span><span class="na">.0</span> <span class="k">as</span> <span class="nb">u32</span><span class="p">))</span>
	            <span class="p">}</span>
	        <span class="p">);</span>

	    <span class="k">let</span> <span class="n">epsilon</span> <span class="o">=</span> <span class="p">(</span><span class="o">!</span><span class="n">gamma</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mi">0b111111111111</span><span class="p">;</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{}*{} = {}"</span><span class="p">,</span><span class="n">gamma</span><span class="p">,</span><span class="n">epsilon</span><span class="p">,</span><span class="n">gamma</span><span class="o">*</span><span class="n">epsilon</span><span class="p">);</span>

	<span class="p">}</span>

	<span class="k">const</span> <span class="n">DIAGNOSTIC_REPORT</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span><span class="s">"00100
	11110
	10110
	10111
	10101
	01111
	00111
	11100
	10000
	11001
	00010
	01010"</span><span class="p">;</span>
	</code></pre></figure>

<p>To see the full source see <a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2021-day3">github</a> and see the live demo in <a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=1843da9bd20744f2ef94f8bd5cee0f61">playground</a>.</p>

<p>Saying part two was a hassle is an under statement. The solution outputs to binary vector which need to be multiplied. I did that manually as I lost motivation in part two :star: unlocked!
Using transpose helps, starting to feel like this AOC stuff would be easier in Matlab / octave.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">input</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;&gt;</span> <span class="o">=</span> <span class="n">DIAGNOSTIC_REPORT</span><span class="nf">.lines</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">l</span><span class="p">|</span> <span class="p">{</span>
	            <span class="n">l</span><span class="nf">.as_bytes</span><span class="p">()</span>
	                <span class="nf">.into_iter</span><span class="p">()</span>
	                <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">(</span><span class="o">*</span><span class="n">x</span> <span class="o">==</span> <span class="sc">b'1'</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u32</span><span class="p">)</span>
	                <span class="nf">.collect</span><span class="p">()</span>
	        <span class="p">})</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">a</span><span class="p">:</span><span class="nb">usize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="n">input</span><span class="nf">.clone</span><span class="p">();</span>

	    <span class="k">while</span> <span class="p">(</span><span class="o">*</span><span class="n">x</span><span class="p">)</span><span class="nf">.len</span><span class="p">()</span><span class="o">&gt;</span><span class="mi">1</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="n">bit_count</span> <span class="o">=</span> <span class="nf">find_most_common_bits_per_row</span><span class="p">(</span><span class="n">x</span><span class="nf">.clone</span><span class="p">());</span>
	        <span class="n">x</span><span class="nf">.retain</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">==</span> <span class="n">bit_count</span><span class="p">[</span><span class="n">a</span><span class="p">]});</span>
	        <span class="n">a</span><span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
	    <span class="p">}</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="n">x</span><span class="p">);</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">a</span><span class="p">:</span><span class="nb">usize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	    <span class="k">while</span> <span class="p">(</span><span class="o">*</span><span class="n">input</span><span class="p">)</span><span class="nf">.len</span><span class="p">()</span><span class="o">&gt;</span><span class="mi">1</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="n">bit_count</span> <span class="o">=</span> <span class="nf">find_most_common_bits_per_row</span><span class="p">(</span><span class="n">input</span><span class="nf">.clone</span><span class="p">());</span>
	        <span class="n">input</span><span class="nf">.retain</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">!=</span> <span class="n">bit_count</span><span class="p">[</span><span class="n">a</span><span class="p">]});</span>
	        <span class="n">a</span><span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
	    <span class="p">}</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="n">input</span><span class="p">);</span>

	<span class="p">}</span>


	<span class="k">fn</span> <span class="nf">find_most_common_bits_per_row</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">length</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.len</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u32</span><span class="p">;</span>
	    <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="nf">transpose</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>
	    <span class="k">let</span> <span class="n">bit_count</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span>
	            <span class="n">x</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="p">|</span><span class="n">acc</span><span class="p">,</span> <span class="n">inst</span><span class="p">|</span> <span class="p">{</span> <span class="n">acc</span> <span class="o">+</span> <span class="n">inst</span> <span class="p">})</span>
	        <span class="p">})</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span> <span class="p">(</span><span class="n">x</span> <span class="k">as</span> <span class="nb">f32</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="n">length</span> <span class="k">as</span> <span class="nb">f32</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">))</span> <span class="k">as</span> <span class="nb">u32</span> <span class="p">})</span>
	        <span class="nf">.collect</span><span class="p">();</span>
	    <span class="n">bit_count</span>
	<span class="p">}</span>

	<span class="cd">/// Source : https://stackoverflow.com/questions/64498617/how-to-transpose-a-vector-of-vectors-in-rust</span>
	<span class="k">fn</span> <span class="n">transpose</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">(</span><span class="n">v</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;</span> <span class="p">{</span>
	    <span class="nd">assert!</span><span class="p">(</span><span class="o">!</span><span class="n">v</span><span class="nf">.is_empty</span><span class="p">());</span>
	    <span class="k">let</span> <span class="n">len</span> <span class="o">=</span> <span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="nf">.len</span><span class="p">();</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">iters</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">_</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">v</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(|</span><span class="n">n</span><span class="p">|</span> <span class="n">n</span><span class="nf">.into_iter</span><span class="p">())</span><span class="nf">.collect</span><span class="p">();</span>
	    <span class="p">(</span><span class="mi">0</span><span class="o">..</span><span class="n">len</span><span class="p">)</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">_</span><span class="p">|</span> <span class="p">{</span>
	            <span class="n">iters</span>
	                <span class="nf">.iter_mut</span><span class="p">()</span>
	                <span class="nf">.map</span><span class="p">(|</span><span class="n">n</span><span class="p">|</span> <span class="n">n</span><span class="nf">.next</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span>
	                <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;</span><span class="p">()</span>
	        <span class="p">})</span>
	        <span class="nf">.collect</span><span class="p">()</span>
	<span class="p">}</span>


	<span class="k">const</span> <span class="n">DIAGNOSTIC_REPORT</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span><span class="s">"00100
	11110
	10110
	10111
	10101
	01111
	00111
	11100
	10000
	11001
	00010
	01010"</span><span class="p">;</span>
	</code></pre></figure>

<p><a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2021-day3-part2">github part 2</a>
<a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=2525d7a7193eba078b0a6672020ce4e3">playground part 2</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 32/100 - advent of code 2021 day 2 part 1 &amp;amp; 2</title><link href="https://maebli.github.io/archive/2021-12-02-100rust-32/" rel="alternate" type="text/html" title="Rust challenge 32/100 - advent of code 2021 day 2 part 1 &amp;amp; 2" /><published>2021-12-02T20:00:00+00:00</published><updated>2021-12-02T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-32</id><content type="html" xml:base="https://maebli.github.io/archive/2021-12-02-100rust-32/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#32nd-challenge">32nd Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="32nd-challenge">32nd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving today’s <a href="https://adventofcode.com/2021/day/2">AoC day 2 2021</a>. Only got around to doing this 
after work :sweat:.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>It has become a bit verbose, but its quite readable, here goes.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="n">parsed_input</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="p">(</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">,</span> <span class="nb">i32</span><span class="p">)</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">INPUT</span><span class="nf">.lines</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="nf">.split_once</span><span class="p">(</span><span class="s">" "</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()})</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{(</span><span class="n">x</span><span class="na">.0</span><span class="p">,</span><span class="n">x</span><span class="na">.1</span><span class="py">.parse</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())})</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">pos</span> <span class="o">=</span> <span class="n">Position</span><span class="p">{</span> <span class="n">x</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="mi">0</span> <span class="p">};</span>

	    <span class="n">pos</span><span class="py">.y</span> <span class="o">+=</span> <span class="n">parsed_input</span><span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="na">.0</span> <span class="o">==</span> <span class="s">"up"</span><span class="p">})</span>
	        <span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,|</span><span class="n">acc</span><span class="p">,</span> <span class="n">c</span><span class="p">|</span> <span class="p">{</span> <span class="n">acc</span> <span class="o">+</span> <span class="n">c</span><span class="na">.1</span> <span class="p">});</span>

	    <span class="n">pos</span><span class="py">.y</span> <span class="o">-=</span> <span class="n">parsed_input</span><span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="na">.0</span> <span class="o">==</span> <span class="s">"down"</span><span class="p">})</span>
	        <span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,|</span><span class="n">acc</span><span class="p">,</span> <span class="n">c</span><span class="p">|</span> <span class="p">{</span> <span class="n">acc</span> <span class="o">+</span> <span class="n">c</span><span class="na">.1</span> <span class="p">});</span>

	    <span class="n">pos</span><span class="py">.x</span> <span class="o">+=</span> <span class="n">parsed_input</span><span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="na">.0</span> <span class="o">==</span> <span class="s">"forward"</span><span class="p">})</span>
	        <span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,|</span><span class="n">acc</span><span class="p">,</span> <span class="n">c</span><span class="p">|</span> <span class="p">{</span> <span class="n">acc</span> <span class="o">+</span> <span class="n">c</span><span class="na">.1</span> <span class="p">});</span>

	    <span class="n">pos</span><span class="nf">.print</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">aim_delta</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">parsed_input</span><span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span> <span class="k">match</span> <span class="n">x</span><span class="na">.0</span> <span class="p">{</span>
	            <span class="s">"up"</span> <span class="k">=&gt;</span> <span class="o">-</span><span class="n">x</span><span class="na">.1</span><span class="p">,</span>
	            <span class="s">"down"</span> <span class="k">=&gt;</span> <span class="n">x</span><span class="na">.1</span><span class="p">,</span>
	            <span class="n">_</span> <span class="k">=&gt;</span> <span class="mi">0</span>
	        <span class="p">}})</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">out</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">parsed_input</span><span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span> <span class="k">match</span> <span class="n">x</span><span class="na">.0</span> <span class="p">{</span>
	            <span class="s">"forward"</span> <span class="k">=&gt;</span> <span class="n">x</span><span class="na">.1</span><span class="p">,</span>
	            <span class="n">_</span> <span class="k">=&gt;</span> <span class="mi">0</span>
	        <span class="p">}})</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	     <span class="k">let</span> <span class="n">pos</span> <span class="o">=</span> <span class="n">out</span><span class="nf">.iter</span><span class="p">()</span>
	         <span class="nf">.zip</span><span class="p">(</span><span class="n">aim_delta</span><span class="nf">.iter</span><span class="p">())</span>
	         <span class="nf">.fold</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span><span class="n">Position</span><span class="p">{</span><span class="n">x</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="n">y</span><span class="p">:</span><span class="mi">0</span><span class="p">}),|</span><span class="k">mut</span> <span class="n">acc</span><span class="p">,</span> <span class="n">x</span><span class="p">|{</span>
	             <span class="n">acc</span><span class="na">.1</span><span class="py">.x</span> <span class="o">+=</span> <span class="n">x</span><span class="na">.0</span><span class="p">;</span>
	             <span class="n">acc</span><span class="na">.1</span><span class="py">.y</span> <span class="o">+=</span> <span class="n">acc</span><span class="na">.0</span><span class="o">*</span><span class="n">x</span><span class="na">.0</span><span class="p">;</span>
	             <span class="n">acc</span><span class="na">.0</span> <span class="o">-=</span> <span class="n">x</span><span class="na">.1</span><span class="p">;</span>
	             <span class="n">acc</span>
	         <span class="p">})</span><span class="na">.1</span><span class="p">;</span>

	    <span class="n">pos</span><span class="nf">.print</span><span class="p">();</span>

	<span class="p">}</span>

	<span class="k">struct</span> <span class="n">Position</span><span class="p">{</span>
	    <span class="n">x</span><span class="p">:</span><span class="nb">i32</span><span class="p">,</span>
	    <span class="n">y</span><span class="p">:</span><span class="nb">i32</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="n">Position</span><span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">print</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">){</span>
	        <span class="nd">println!</span><span class="p">(</span><span class="s">" x = {} , y = {}, depth = {}, x * depth = {}"</span><span class="p">,</span><span class="k">self</span><span class="py">.x</span><span class="p">,</span><span class="k">self</span><span class="py">.y</span><span class="p">,</span><span class="o">-</span><span class="k">self</span><span class="py">.y</span><span class="p">,</span><span class="o">-</span><span class="k">self</span><span class="py">.x</span><span class="o">*</span><span class="k">self</span><span class="py">.y</span><span class="p">);</span>
	    <span class="p">}</span>
	<span class="p">}</span>


	<span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"forward 5
	down 5
	forward 8
	up 3
	down 8
	forward 2"</span><span class="p">;</span>
	</code></pre></figure>

<p>To see the full source see <a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2021-day2">github</a> and see the live demo in <a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=21f800bb34fcc1d5682fce7c36a8ed72">playground</a>.</p>

<p>My favorite solution <a href="https://www.reddit.com/r/adventofcode/comments/r6zd93/comment/hmyw5es/?utm_source=share&amp;utm_medium=web2x&amp;context=3">can be seen by clicking here.</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 31/100 - advent of code 2021 day 1 part 1 &amp;amp; 2</title><link href="https://maebli.github.io/archive/2021-12-01-100rust-31/" rel="alternate" type="text/html" title="Rust challenge 31/100 - advent of code 2021 day 1 part 1 &amp;amp; 2" /><published>2021-12-01T20:00:00+00:00</published><updated>2021-12-01T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-31</id><content type="html" xml:base="https://maebli.github.io/archive/2021-12-01-100rust-31/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#31st-challenge">31st Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="31st-challenge">31st Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving today’s <a href="https://adventofcode.com/2021/day/1">AoC day 1 2021</a>. It took me longer than it I would have liked.
I wanted to do it quickly with a <code class="language-plaintext highlighter-rouge">filter</code> or <code class="language-plaintext highlighter-rouge">fold</code> function, which didn’t work. I ran out of time and had to leave for work :sweat:.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>I peaked at the python solution on <a href="www.reddit.com/r/adventofcode"></a> which used the <code class="language-plaintext highlighter-rouge">zip</code> function I had not come across before. Basically
it makes a tuple out of two iterators. Using this as well as <code class="language-plaintext highlighter-rouge">multizip</code> I was able to implement the functions.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	 <span class="k">use</span> <span class="nn">itertools</span><span class="p">::</span><span class="n">multizip</span><span class="p">;</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="n">a</span><span class="o">=</span> <span class="n">INPUT</span><span class="nf">.lines</span><span class="p">()</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()})</span>
	        <span class="py">.collect</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;&gt;</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">c</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nf">multizip</span><span class="p">((</span><span class="n">a</span><span class="nf">.iter</span><span class="p">(),</span><span class="n">a</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.skip</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span><span class="n">a</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.skip</span><span class="p">(</span><span class="mi">2</span><span class="p">)))</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|{</span><span class="n">x</span><span class="na">.0</span><span class="o">+</span><span class="n">x</span><span class="na">.1</span><span class="o">+</span><span class="n">x</span><span class="na">.2</span><span class="p">})</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"sol1:{}, sol2:{}"</span><span class="p">,</span><span class="nf">count_bigger</span><span class="p">(</span><span class="o">&amp;</span><span class="n">a</span><span class="p">),</span><span class="nf">count_bigger</span><span class="p">(</span><span class="o">&amp;</span><span class="n">c</span><span class="p">));</span>

	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">count_bigger</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">usize</span> <span class="p">{</span>
	    <span class="n">a</span><span class="nf">.iter</span><span class="p">()</span>
	        <span class="nf">.zip</span><span class="p">(</span><span class="n">a</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.skip</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
	        <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span> <span class="n">x</span><span class="na">.0</span> <span class="o">&lt;</span> <span class="n">x</span><span class="na">.1</span> <span class="p">})</span>
	        <span class="nf">.count</span><span class="p">()</span>
	<span class="p">}</span>


	<span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"199
	200
	208
	210
	200
	207
	240
	269
	260
	263"</span><span class="p">;</span>
	</code></pre></figure>

<p>To see the full source see <a href="https://github.com/maebli/100rustsnippets/tree/master/aoc-2021-day1">github</a> and see the live demo in <a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=a29f5ab10ec865d5209ba0c286d62ca4">playground</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 30/100 - advent of code 2020 day 3 part 1 and 2 (fixed)</title><link href="https://maebli.github.io/archive/2021-11-30-100rust-30/" rel="alternate" type="text/html" title="Rust challenge 30/100 - advent of code 2020 day 3 part 1 and 2 (fixed)" /><published>2021-11-29T20:00:00+00:00</published><updated>2021-11-29T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-30</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-30-100rust-30/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#30th-challenge">30th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="30th-challenge">30th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving last year’s <a href="ttps://adventofcode.com/2020/day/3">AoC day 3 2020</a> using rust macros whenever possible.
<a href="https://maebli.github.io/rust/2021/11/29/100rust-29.html">In yesterday’s solution</a> there was a small bug in my code, I will try to solve that today.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>The issue was with slope number four. I repeated the challenge for just number four</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">    <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span><span class="n">INPUT</span><span class="nf">.lines</span><span class="p">()</span>
                <span class="nf">.enumerate</span><span class="p">()</span>
                <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span> <span class="p">(</span><span class="n">x</span><span class="na">.0</span><span class="o">%</span><span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">x</span><span class="na">.1</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.nth</span><span class="p">((</span><span class="n">x</span><span class="na">.0</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">%</span><span class="mi">31</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="o">==</span> <span class="sc">'#'</span><span class="p">)})</span>
                <span class="nf">.count</span><span class="p">());</span>
	</code></pre></figure>

<p>From this huntch I was able to solve the issue.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"product: {}"</span><span class="p">,</span><span class="nd">slope_product!</span><span class="p">(</span><span class="n">INPUT</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</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">4</span><span class="p">));</span>
	<span class="p">}</span>


	<span class="nd">#[macro_export]</span>
	<span class="nd">macro_rules!</span> <span class="n">slope_product</span> <span class="p">{</span>
	    <span class="p">(</span> <span class="nv">$input:expr</span><span class="p">,</span><span class="nv">$</span><span class="p">(</span> <span class="nv">$x:expr</span> <span class="p">),</span><span class="o">*</span> <span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
	        <span class="p">{</span>
	            <span class="k">let</span> <span class="k">mut</span> <span class="n">prod</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
	            <span class="nv">$</span><span class="p">(</span>
	                <span class="nd">println!</span><span class="p">(</span><span class="s">"slope: {}"</span><span class="p">,</span><span class="nd">slope!</span><span class="p">(</span><span class="nv">$x</span><span class="p">,</span><span class="nv">$input</span><span class="p">));</span>
	                <span class="n">prod</span><span class="o">*=</span><span class="nd">slope!</span><span class="p">(</span><span class="nv">$x</span><span class="p">,</span><span class="nv">$input</span><span class="p">);</span>
	            <span class="p">)</span><span class="o">*</span>
	            <span class="n">prod</span>
	        <span class="p">}</span>
	    <span class="p">};</span>
	<span class="p">}</span>

	<span class="nd">#[macro_export]</span>
	<span class="nd">macro_rules!</span> <span class="n">slope</span> <span class="p">{</span>
	    <span class="p">(</span>  <span class="nv">$slope:expr</span><span class="p">,</span><span class="nv">$input:expr</span> <span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
	        <span class="p">{</span>
	            <span class="nv">$input</span><span class="nf">.lines</span><span class="p">()</span>
	                    <span class="nf">.enumerate</span><span class="p">()</span>
	                    <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span><span class="nd">is_tree!</span><span class="p">(</span><span class="nv">$slope</span><span class="p">,</span><span class="n">x</span><span class="na">.0</span><span class="p">,</span><span class="n">x</span><span class="na">.1</span><span class="p">)})</span>
	                    <span class="nf">.count</span><span class="p">()</span>
	        <span class="p">}</span>
	    <span class="p">};</span>
	<span class="p">}</span>

	<span class="nd">#[macro_export]</span>
	<span class="nd">macro_rules!</span> <span class="n">is_tree</span> <span class="p">{</span>
	    <span class="p">(</span><span class="nv">$slope:expr</span><span class="p">,</span><span class="nv">$i:expr</span><span class="p">,</span><span class="nv">$s:expr</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
	        <span class="p">{</span>
	            <span class="k">match</span> <span class="nv">$slope</span> <span class="p">{</span>
	                <span class="mi">4</span> <span class="k">=&gt;</span> <span class="p">{((</span><span class="nv">$i</span><span class="o">%</span><span class="mi">2</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="nv">$s</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.nth</span><span class="p">((</span><span class="nv">$i</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">%</span><span class="nv">$s</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.count</span><span class="p">())</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="o">==</span> <span class="sc">'#'</span><span class="p">},</span>
	                <span class="n">_</span> <span class="k">=&gt;</span> <span class="nv">$s</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.nth</span><span class="p">((</span><span class="nv">$i</span><span class="o">*</span><span class="p">(</span><span class="mi">1</span><span class="o">+</span><span class="nv">$slope</span><span class="o">*</span><span class="mi">2</span><span class="p">))</span><span class="o">%</span><span class="nv">$s</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.count</span><span class="p">())</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="o">==</span> <span class="sc">'#'</span>
	            <span class="p">}</span>

	        <span class="p">}</span>
	    <span class="p">};</span>

	<span class="p">}</span>

	<span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span><span class="s">"..##.........##.........##.........##.........##.........##.......
		#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..
		.#....#..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#.
		..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#
		.#...##..#..#...##..#..#...##..#..#...##..#..#...##..#..#...##..#.
		..#.##.......#.##.......#.##.......#.##.......#.##.......#.##.....
		.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#
		.#........#.#........#.#........#.#........#.#........#.#........#
		#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...
		#...##....##...##....##...##....##...##....##...##....##...##....#
		.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#
		"</span><span class="p">;</span>
	</code></pre></figure>

<p>To see the full source see <a href="https://github.com/maebli/100rustsnippets/tree/master/aco-2020-day3">github</a> and see the live demo in <a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=5c76a719c6020eabf49a778b1d754122">playground</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 29/100 - advent of code 2020 day 3 part 1 and 2</title><link href="https://maebli.github.io/archive/2021-11-29-100rust-29/" rel="alternate" type="text/html" title="Rust challenge 29/100 - advent of code 2020 day 3 part 1 and 2" /><published>2021-11-29T20:00:00+00:00</published><updated>2021-11-29T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-29</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-29-100rust-29/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#29th-challenge">29th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="29th-challenge">29th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I’m solving last year’s <a href="ttps://adventofcode.com/2020/day/3">AoC day 3 2020</a> using rust macros whenever possible.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>This is the result, it calculates the example correctly, but not the second challenge’s personalized input.. I will have to check tomrrow what is going on.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"product: {}"</span><span class="p">,</span><span class="nd">slope_product!</span><span class="p">(</span><span class="n">INPUT</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</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">4</span><span class="p">));</span>
	<span class="p">}</span>


	<span class="nd">#[macro_export]</span>
	<span class="nd">macro_rules!</span> <span class="n">slope_product</span> <span class="p">{</span>
	    <span class="p">(</span> <span class="nv">$input:expr</span><span class="p">,</span><span class="nv">$</span><span class="p">(</span> <span class="nv">$x:expr</span> <span class="p">),</span><span class="o">*</span> <span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
	        <span class="p">{</span>
	            <span class="k">let</span> <span class="k">mut</span> <span class="n">prod</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
	            <span class="nv">$</span><span class="p">(</span>
	                <span class="nd">println!</span><span class="p">(</span><span class="s">"slope: {}"</span><span class="p">,</span><span class="nd">slope!</span><span class="p">(</span><span class="nv">$x</span><span class="p">,</span><span class="nv">$input</span><span class="p">));</span>
	                <span class="n">prod</span><span class="o">*=</span><span class="nd">slope!</span><span class="p">(</span><span class="nv">$x</span><span class="p">,</span><span class="nv">$input</span><span class="p">);</span>
	            <span class="p">)</span><span class="o">*</span>
	            <span class="n">prod</span>
	        <span class="p">}</span>
	    <span class="p">};</span>
	<span class="p">}</span>

	<span class="nd">#[macro_export]</span>
	<span class="nd">macro_rules!</span> <span class="n">slope</span> <span class="p">{</span>
	    <span class="p">(</span>  <span class="nv">$slope:expr</span><span class="p">,</span><span class="nv">$input:expr</span> <span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
	        <span class="p">{</span>
	            <span class="nv">$input</span><span class="nf">.lines</span><span class="p">()</span>
	                    <span class="nf">.enumerate</span><span class="p">()</span>
	                    <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{</span><span class="nd">is_tree!</span><span class="p">(</span><span class="nv">$slope</span><span class="p">,</span><span class="n">x</span><span class="na">.0</span><span class="p">,</span><span class="n">x</span><span class="na">.1</span><span class="p">)})</span>
	                    <span class="nf">.count</span><span class="p">()</span>
	        <span class="p">}</span>
	    <span class="p">};</span>
	<span class="p">}</span>

	<span class="nd">#[macro_export]</span>
	<span class="nd">macro_rules!</span> <span class="n">is_tree</span> <span class="p">{</span>
	    <span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="nv">$i:expr</span><span class="p">,</span><span class="nv">$s:expr</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
	        <span class="p">{</span>
	            <span class="k">match</span> <span class="nv">$i</span> <span class="o">%</span> <span class="mi">2</span> <span class="p">{</span>
	                <span class="mi">0</span> <span class="k">=&gt;</span> <span class="nd">is_tree!</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="nv">$i</span><span class="p">,</span><span class="nv">$s</span><span class="p">),</span>
	                <span class="n">_</span> <span class="k">=&gt;</span> <span class="kc">false</span>
	            <span class="p">}</span>
	        <span class="p">}</span>
	    <span class="p">};</span>
	    <span class="p">(</span><span class="nv">$slope:expr</span><span class="p">,</span><span class="nv">$i:expr</span><span class="p">,</span><span class="nv">$s:expr</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
	        <span class="p">{</span>
	            <span class="nv">$s</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.nth</span><span class="p">((</span><span class="nv">$i</span><span class="o">*</span><span class="p">(</span><span class="mi">1</span><span class="o">+</span><span class="nv">$slope</span><span class="o">*</span><span class="mi">2</span><span class="p">))</span><span class="o">%</span><span class="nv">$s</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.count</span><span class="p">())</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="o">==</span> <span class="sc">'#'</span>
	        <span class="p">}</span>
	    <span class="p">};</span>

	<span class="p">}</span>

	<span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span><span class="s">"..##.........##.........##.........##.........##.........##.......
	#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..
	.#....#..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#.
	..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#
	.#...##..#..#...##..#..#...##..#..#...##..#..#...##..#..#...##..#.
	..#.##.......#.##.......#.##.......#.##.......#.##.......#.##.....
	.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#
	.#........#.#........#.#........#.#........#.#........#.#........#
	#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...
	#...##....##...##....##...##....##...##....##...##....##...##....#
	.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#
	"</span><span class="p">;</span>
	</code></pre></figure>

<p>To see the full source see <a href="https://github.com/maebli/100rustsnippets/tree/master/aco-2020-day3">github</a> and see the live demo in <a href="https://play.rust-lang.org/?version=stable&amp;edition=2021&amp;gist=1a5a59360ddcee424083abe8bdd4cbe7">playground</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 28/100 - Debugging</title><link href="https://maebli.github.io/archive/2021-11-20-100rust-28/" rel="alternate" type="text/html" title="Rust challenge 28/100 - Debugging" /><published>2021-11-25T20:00:00+00:00</published><updated>2021-11-25T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-28</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-20-100rust-28/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#28th-challenge">28th Challenge</a>
        <ul>
          <li><a href="#challenge-bughammer">Challenge :bug::hammer:</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="28th-challenge">28th Challenge</h2>
<h3 id="challenge-bughammer">Challenge :bug::hammer:</h3>

<p>Today’s challenge is a bit different; Rather than programming I will be getting my tool-set into order. I want to debug. This means today’s
challenge is to setup debugging for Rust. Up until now I did not Debug at all. Debugging is a powerful method to understand code and be efficient.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>As I am using Intellij I will set this up for said tool-chain. Sadly, this is only available in the paid version. I was not inclined
to change to VS Code, being one of the two most popular tool-chains besides Intellij/ C-Lion by Jetbrain. I therefore purchased the license
on a monthly plan and installed the <a href="https://plugins.jetbrains.com/plugin/12775-native-debugging-support">Native Debugging Plugin</a> and I was
good to go. And it works! Very simple and powerful setup:</p>

<p><img src="/assets/img/screenshot-debug.png" alt="" /></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 27/100 - advent of code 2020 day 2 part 2</title><link href="https://maebli.github.io/archive/2021-11-21-100rust-27/" rel="alternate" type="text/html" title="Rust challenge 27/100 - advent of code 2020 day 2 part 2" /><published>2021-11-21T20:00:00+00:00</published><updated>2021-11-21T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-27</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-21-100rust-27/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#27th-challenge">27th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="27th-challenge">27th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>I have never part taken in Advent of Code. This year I might. To get used to the idea I’m solving last year’s second challenge. Solve <a href="ttps://adventofcode.com/2020/day/2">AoC day 2 2020</a>.
This is the second part which adds some more generic-ness to the orignal challenge posted yesterday.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">answer1</span> <span class="o">=</span> <span class="n">INPUT</span><span class="nf">.lines</span><span class="p">()</span>
	        <span class="nf">.filter</span><span class="p">(|</span><span class="o">&amp;</span><span class="n">x</span><span class="p">|</span> <span class="nn">Entry</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="nf">.check_sled_rental</span><span class="p">())</span>
	        <span class="nf">.count</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">answer2</span> <span class="o">=</span> <span class="n">INPUT</span><span class="nf">.lines</span><span class="p">()</span>
	        <span class="nf">.filter</span><span class="p">(|</span><span class="o">&amp;</span><span class="n">x</span><span class="p">|</span> <span class="nn">Entry</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="nf">.check_toboggan_rental</span><span class="p">())</span>
	        <span class="nf">.count</span><span class="p">();</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"answer1:{} answer2:{}"</span><span class="p">,</span><span class="n">answer1</span><span class="p">,</span><span class="n">answer2</span><span class="p">);</span>
	<span class="p">}</span>

	<span class="k">struct</span> <span class="n">Entry</span> <span class="p">{</span>
	    <span class="n">left</span><span class="p">:</span><span class="nb">usize</span><span class="p">,</span>
	    <span class="n">right</span><span class="p">:</span><span class="nb">usize</span><span class="p">,</span>
	    <span class="n">letter</span><span class="p">:</span><span class="nb">char</span><span class="p">,</span>
	    <span class="n">password</span><span class="p">:</span><span class="nb">String</span><span class="p">,</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="n">Entry</span><span class="p">{</span>

	    <span class="k">fn</span> <span class="nf">check_toboggan_rental</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
	        <span class="k">self</span><span class="py">.password</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.nth</span><span class="p">(</span><span class="k">self</span><span class="py">.left</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.eq</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="py">.letter</span><span class="p">)</span> <span class="o">^</span>
	            <span class="k">self</span><span class="py">.password</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.nth</span><span class="p">(</span><span class="k">self</span><span class="py">.right</span> <span class="o">-</span><span class="mi">1</span> <span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.eq</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="py">.letter</span><span class="p">)</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">check_sled_rental</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>

	        <span class="k">let</span> <span class="n">num</span> <span class="o">=</span> <span class="k">self</span><span class="py">.password</span>
	            <span class="nf">.chars</span><span class="p">()</span>
	            <span class="nf">.filter</span><span class="p">(|</span><span class="n">c</span><span class="p">|</span> <span class="n">c</span><span class="nf">.eq</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="py">.letter</span><span class="p">))</span>
	            <span class="nf">.count</span><span class="p">();</span>

	        <span class="n">num</span> <span class="o">&gt;=</span> <span class="k">self</span><span class="py">.left</span> <span class="o">&amp;&amp;</span> <span class="n">num</span> <span class="o">&lt;=</span> <span class="k">self</span><span class="py">.right</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">new</span><span class="p">(</span><span class="n">line</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Entry</span><span class="p">{</span>

	        <span class="k">let</span> <span class="k">mut</span> <span class="n">s</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">line</span>
	            <span class="nf">.split</span><span class="p">(</span><span class="sc">' '</span><span class="p">)</span>
	            <span class="nf">.collect</span><span class="p">();</span>

	        <span class="k">let</span> <span class="n">range</span> <span class="o">=</span> <span class="n">s</span>
	            <span class="nf">.remove</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
	            <span class="nf">.split_once</span><span class="p">(</span><span class="sc">'-'</span><span class="p">)</span>
	            <span class="nf">.unwrap</span><span class="p">();</span>

	        <span class="k">let</span> <span class="n">min</span><span class="p">:</span><span class="nb">usize</span> <span class="o">=</span> <span class="n">range</span>
	            <span class="na">.0</span>
	            <span class="nf">.parse</span><span class="p">()</span>
	            <span class="nf">.unwrap</span><span class="p">();</span>

	        <span class="k">let</span> <span class="n">max</span><span class="p">:</span><span class="nb">usize</span> <span class="o">=</span> <span class="n">range</span>
	            <span class="na">.1</span>
	            <span class="nf">.parse</span><span class="p">()</span>
	            <span class="nf">.unwrap</span><span class="p">();</span>

	        <span class="k">let</span> <span class="n">letter</span> <span class="o">=</span> <span class="n">s</span>
	            <span class="nf">.remove</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
	            <span class="nf">.trim_end_matches</span><span class="p">(</span><span class="s">":"</span><span class="p">)</span>
	            <span class="nf">.chars</span><span class="p">()</span>
	            <span class="nf">.nth</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
	            <span class="nf">.unwrap</span><span class="p">();</span>

	        <span class="k">let</span> <span class="n">password</span> <span class="o">=</span> <span class="n">s</span><span class="nf">.remove</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>

	        <span class="n">Entry</span><span class="p">{</span> <span class="n">left</span><span class="p">:</span> <span class="n">min</span><span class="p">,</span> <span class="n">right</span><span class="p">:</span> <span class="n">max</span><span class="p">,</span> <span class="n">letter</span><span class="p">,</span> <span class="n">password</span><span class="p">:</span> <span class="nn">String</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">password</span><span class="p">)</span> <span class="p">}</span>
	    <span class="p">}</span>
	<span class="p">}</span>



	<span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"1-3 a: abcde
	1-3 b: cdefg
	2-9 c: ccccccccc"</span><span class="p">;</span>
	</code></pre></figure>

<p>To see the full source see <a href="https://github.com/maebli/100rustsnippets/tree/master/aco-2020-2">github</a> and see the live demo in <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=614d82523cece6c2c6e17e3da814410d">playground</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 26/100 - advent of code 2020 day 2</title><link href="https://maebli.github.io/archive/2021-11-20-100rust-26/" rel="alternate" type="text/html" title="Rust challenge 26/100 - advent of code 2020 day 2" /><published>2021-11-20T20:00:00+00:00</published><updated>2021-11-20T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-26</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-20-100rust-26/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#26th-challenge">26th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->
<p><img src="/assets/img/aoc.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="26th-challenge">26th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>I have never part taken in Advent of Code. This year I might. To get used to the idea I’m solving last year’s second challenge. Solve <a href="ttps://adventofcode.com/2020/day/2">AoC day 2 2020</a>.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">answer</span> <span class="o">=</span> <span class="n">INPUT</span><span class="nf">.lines</span><span class="p">()</span>
	        <span class="nf">.filter</span><span class="p">(|</span><span class="o">&amp;</span><span class="n">x</span><span class="p">|</span> <span class="nf">check_line</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
	        <span class="nf">.count</span><span class="p">();</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span><span class="n">answer</span><span class="p">);</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">check_line</span><span class="p">(</span><span class="n">line</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">s</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;&amp;</span><span class="nb">str</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">line</span>
	        <span class="nf">.split</span><span class="p">(</span><span class="sc">' '</span><span class="p">)</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">range</span> <span class="o">=</span> <span class="n">s</span>
	        <span class="nf">.remove</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
	        <span class="nf">.split_once</span><span class="p">(</span><span class="sc">'-'</span><span class="p">)</span>
	        <span class="nf">.unwrap</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">min</span><span class="p">:</span><span class="nb">usize</span> <span class="o">=</span> <span class="n">range</span>
	        <span class="na">.0</span>
	        <span class="nf">.parse</span><span class="p">()</span>
	        <span class="nf">.unwrap</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">max</span><span class="p">:</span><span class="nb">usize</span> <span class="o">=</span> <span class="n">range</span>
	        <span class="na">.1</span>
	        <span class="nf">.parse</span><span class="p">()</span>
	        <span class="nf">.unwrap</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">letter</span> <span class="o">=</span> <span class="n">s</span>
	        <span class="nf">.remove</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
	        <span class="nf">.trim_end_matches</span><span class="p">(</span><span class="s">":"</span><span class="p">)</span>
	        <span class="nf">.chars</span><span class="p">()</span>
	        <span class="nf">.nth</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
	        <span class="nf">.unwrap</span><span class="p">();</span>

	    <span class="k">let</span> <span class="n">password</span> <span class="o">=</span> <span class="n">s</span><span class="nf">.remove</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>

	    <span class="k">let</span> <span class="n">num</span> <span class="o">=</span> <span class="n">password</span>
	        <span class="nf">.chars</span><span class="p">()</span>
	        <span class="nf">.filter</span><span class="p">(|</span><span class="n">c</span><span class="p">|</span> <span class="n">c</span><span class="nf">.eq</span><span class="p">(</span><span class="o">&amp;</span><span class="n">letter</span><span class="p">))</span>
	        <span class="nf">.count</span><span class="p">();</span>


	    <span class="n">num</span> <span class="o">&gt;=</span> <span class="n">min</span> <span class="o">&amp;&amp;</span> <span class="n">num</span> <span class="o">&lt;=</span> <span class="n">max</span>

	<span class="p">}</span>

	<span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span> <span class="o">=</span> <span class="s">"1-3 a: abcde
	1-3 b: cdefg
	2-9 c: ccccccccc"</span><span class="p">;</span>
	</code></pre></figure>

<p>To see the full source see <a href="https://github.com/maebli/100rustsnippets/tree/master/aco-2020-2">github</a> and see the live demo in <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=f0e96f31bdbc3b26b6cf1f5d91b74e20">playground</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 25/100 - advent of code 2020 day 1</title><link href="https://maebli.github.io/archive/2021-11-17-100rust-25/" rel="alternate" type="text/html" title="Rust challenge 25/100 - advent of code 2020 day 1" /><published>2021-11-17T20:00:00+00:00</published><updated>2021-11-17T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-25</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-17-100rust-25/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#25th-challenge">25th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<p><img src="/assets/img/aoc.png" alt="" /></p>
<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="25th-challenge">25th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>I have never part taken in Advent of Code. This year I might. To get used to the idea I’m solving last year’s first challenge. Solve <a href="ttps://adventofcode.com/2020/day/1">AoC Report Repair day 1 2020</a>.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">INPUT</span><span class="nf">.split</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">)</span>
	        <span class="nf">.filter</span><span class="p">(|</span><span class="o">&amp;</span><span class="n">x</span><span class="p">|</span> <span class="o">!</span><span class="n">x</span><span class="nf">.is_empty</span><span class="p">())</span>
	        <span class="nf">.map</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="nf">.parse</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">())</span>
	        <span class="nf">.collect</span><span class="p">();</span>

	    <span class="n">x</span><span class="nf">.sort</span><span class="p">();</span>

	    <span class="k">while</span> <span class="n">x</span><span class="nf">.len</span><span class="p">()</span><span class="o">&gt;</span><span class="mi">1</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">next</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.pop</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">i</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.len</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">current</span><span class="p">:</span> <span class="nb">u32</span> <span class="o">=</span> <span class="mi">2020</span><span class="p">;</span>
	        <span class="k">while</span> <span class="n">next</span> <span class="o">+</span> <span class="n">current</span> <span class="o">&gt;=</span> <span class="mi">2020</span> <span class="p">{</span>

	            <span class="n">current</span> <span class="o">=</span> <span class="o">*</span><span class="n">x</span><span class="nf">.get</span><span class="p">(</span><span class="n">i</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>

	            <span class="k">if</span> <span class="n">next</span> <span class="o">+</span> <span class="n">current</span> <span class="o">==</span> <span class="mi">2020</span> <span class="p">{</span>
	                <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}*{:?}={:?}"</span><span class="p">,</span> <span class="n">next</span><span class="p">,</span> <span class="n">current</span><span class="p">,</span> <span class="n">next</span> <span class="o">*</span> <span class="n">current</span><span class="p">);</span>
	            <span class="p">}</span>
	            <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
	                <span class="k">break</span><span class="p">;</span>
	            <span class="p">}</span>

	            <span class="n">i</span> <span class="o">=</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
	        <span class="p">}</span>
	    <span class="p">}</span>


	<span class="p">}</span>

	<span class="k">const</span> <span class="n">INPUT</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="o">=</span><span class="s">"1721
	979
	366
	299
	675
	1456
	"</span><span class="p">;</span>

	</code></pre></figure>

<p>To see the full source see <a href="https://github.com/maebli/100rustsnippets/tree/master/aco-1-2020">github</a> and see the live demo in <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=673db217a0a926cd0c0e0c2e020319b7">playground</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 24/100 - daily progamming reddit challenge</title><link href="https://maebli.github.io/archive/2021-11-16-100rust-24/" rel="alternate" type="text/html" title="Rust challenge 24/100 - daily progamming reddit challenge" /><published>2021-11-16T20:00:00+00:00</published><updated>2021-11-16T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-24</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-16-100rust-24/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#24th-challenge">24th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="24th-challenge">24th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Reddit Programming Daily Challenge <a href="https://www.reddit.com/r/dailyprogrammer/comments/onfehl/20210719_challenge_399_easy_letter_value_sum/">[2021-07-19] Challenge #399 [Easy] Letter value sum</a>.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">let</span> <span class="n">f</span> <span class="o">=</span> <span class="p">|</span><span class="n">k</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">|</span> <span class="n">k</span><span class="nf">.bytes</span><span class="p">()</span><span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,|</span><span class="n">acc</span><span class="p">,</span><span class="n">x</span><span class="p">|</span><span class="n">acc</span> <span class="o">+</span> <span class="p">((</span><span class="n">x</span> <span class="o">-</span> <span class="sc">b'a'</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u32</span><span class="p">));</span>
	</code></pre></figure>

<p>To see the full source see <a href="https://github.com/maebli/100rustsnippets/tree/master/lettervaluesum">github</a> and see the live demo in <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=8689be6f971e756b6ce6757af748983b">playground</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 23/100 - euler challange 7</title><link href="https://maebli.github.io/archive/2021-11-12-100rust-23/" rel="alternate" type="text/html" title="Rust challenge 23/100 - euler challange 7" /><published>2021-11-13T20:00:00+00:00</published><updated>2021-11-13T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-23</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-12-100rust-23/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#23rd-challenge">23rd Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="23rd-challenge">23rd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Solve <a href="https://projecteuler.net/problem=7">euler challange number 7</a>.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">primes</span><span class="p">::{</span><span class="n">Sieve</span><span class="p">,</span> <span class="n">PrimeSet</span><span class="p">};</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">pset</span> <span class="o">=</span> <span class="nn">Sieve</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"Prime {}"</span><span class="p">,</span> <span class="n">pset</span><span class="nf">.get</span><span class="p">(</span><span class="mi">10000</span><span class="p">));</span>

	<span class="p">}</span>
	</code></pre></figure>

<p>To see the full source see <a href="https://github.com/maebli/100rustsnippets/tree/master/euler-7">github</a> and see the live demo in <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=8689be6f971e756b6ce6757af748983b">playground</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 22/100 - encrypt / decrypt in wasm</title><link href="https://maebli.github.io/archive/2021-11-03-100rust-22/" rel="alternate" type="text/html" title="Rust challenge 22/100 - encrypt / decrypt in wasm" /><published>2021-11-10T20:00:00+00:00</published><updated>2021-11-10T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-22</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-03-100rust-22/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#22nd-challenge">22nd Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<p><img src="/assets/img/encrypt.jpeg" alt="" /></p>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="22nd-challenge">22nd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Encrypt plaintext into aes128 encrypted text and back again, note this is currently useless as I am using a static key and IV.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="nd">#[wasm_bindgen]</span>
	<span class="k">pub</span> <span class="k">fn</span> <span class="nf">encrypt</span><span class="p">(</span><span class="n">plaintext</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span>  <span class="k">-&gt;</span> <span class="nb">String</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">key</span> <span class="o">=</span> <span class="nd">hex!</span><span class="p">(</span><span class="s">"000102030405060708090a0b0c0d0e0f"</span><span class="p">);</span>
	    <span class="k">let</span> <span class="n">iv</span> <span class="o">=</span> <span class="nd">hex!</span><span class="p">(</span><span class="s">"f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"</span><span class="p">);</span>
	    <span class="k">type</span> <span class="n">Aes128Cbc</span> <span class="o">=</span> <span class="n">Cbc</span><span class="o">&lt;</span><span class="n">Aes128</span><span class="p">,</span> <span class="n">Pkcs7</span><span class="o">&gt;</span><span class="p">;</span>
	    <span class="k">let</span> <span class="n">cipher</span> <span class="o">=</span> <span class="nn">Aes128Cbc</span><span class="p">::</span><span class="nf">new_from_slices</span><span class="p">(</span><span class="o">&amp;</span><span class="n">key</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">iv</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
	    <span class="k">let</span> <span class="n">ciphertext</span> <span class="o">=</span> <span class="n">cipher</span><span class="nf">.encrypt_vec</span><span class="p">(</span><span class="n">plaintext</span><span class="nf">.as_bytes</span><span class="p">());</span>
	    <span class="nn">hex</span><span class="p">::</span><span class="nf">encode</span><span class="p">(</span><span class="n">ciphertext</span><span class="p">)</span>
	<span class="p">}</span>


	<span class="nd">#[wasm_bindgen]</span>
	<span class="k">pub</span> <span class="k">fn</span> <span class="nf">decrypt</span><span class="p">(</span><span class="n">encrypted</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span>  <span class="k">-&gt;</span> <span class="nb">String</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">key</span> <span class="o">=</span> <span class="nd">hex!</span><span class="p">(</span><span class="s">"000102030405060708090a0b0c0d0e0f"</span><span class="p">);</span>
	    <span class="k">let</span> <span class="n">iv</span> <span class="o">=</span> <span class="nd">hex!</span><span class="p">(</span><span class="s">"f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"</span><span class="p">);</span>
	    <span class="k">type</span> <span class="n">Aes128Cbc</span> <span class="o">=</span> <span class="n">Cbc</span><span class="o">&lt;</span><span class="n">Aes128</span><span class="p">,</span> <span class="n">Pkcs7</span><span class="o">&gt;</span><span class="p">;</span>
	    <span class="k">let</span> <span class="n">cipher</span> <span class="o">=</span> <span class="nn">Aes128Cbc</span><span class="p">::</span><span class="nf">new_from_slices</span><span class="p">(</span><span class="o">&amp;</span><span class="n">key</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">iv</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
	    <span class="k">let</span> <span class="n">decrypted</span> <span class="o">=</span> <span class="n">cipher</span><span class="nf">.decrypt_vec</span><span class="p">(</span><span class="nn">hex</span><span class="p">::</span><span class="nf">decode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">encrypted</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.as_ref</span><span class="p">());</span>
	    <span class="k">match</span> <span class="n">decrypted</span><span class="p">{</span>
	        <span class="nf">Ok</span><span class="p">(</span><span class="n">_</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nn">String</span><span class="p">::</span><span class="nf">from_utf8</span><span class="p">(</span><span class="n">decrypted</span><span class="nf">.unwrap</span><span class="p">())</span><span class="nf">.unwrap</span><span class="p">(),</span>
	        <span class="nf">Err</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nd">format!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span><span class="n">x</span><span class="p">)</span>
	    <span class="p">}</span>
	<span class="p">}</span>
	</code></pre></figure>

<p>With a simple <code class="language-plaintext highlighter-rouge">html</code> the web assembly is tested.</p>

<figure class="highlight"><pre><code class="language-html" data-lang="html">	<span class="cp">&lt;!DOCTYPE html&gt;</span>
	<span class="nt">&lt;html</span> <span class="na">lang=</span><span class="s">"en"</span><span class="nt">&gt;</span>
	<span class="nt">&lt;head&gt;</span>
	    <span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">"UTF-8"</span><span class="nt">&gt;</span>
	    <span class="nt">&lt;title&gt;</span>Title<span class="nt">&lt;/title&gt;</span>
	<span class="nt">&lt;/head&gt;</span>
	<span class="nt">&lt;body&gt;</span>
	<span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"module"</span><span class="nt">&gt;</span>
	    <span class="k">import</span> <span class="nx">init</span><span class="p">,</span> <span class="p">{</span><span class="nx">encrypt</span><span class="p">,</span><span class="nx">decrypt</span><span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">./pkg/wasm_encrypt.js</span><span class="dl">"</span><span class="p">;</span>
		      <span class="nx">init</span><span class="p">()</span>
		        <span class="p">.</span><span class="nx">then</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">{</span>
	                <span class="kd">var</span> <span class="nx">input</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">hello</span><span class="dl">"</span><span class="p">;</span>
	                <span class="kd">var</span> <span class="nx">output</span> <span class="o">=</span> <span class="nx">encrypt</span><span class="p">(</span><span class="nx">input</span><span class="p">);</span>
	                <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">output</span><span class="p">);</span>
	                <span class="kd">var</span> <span class="nx">output2</span> <span class="o">=</span> <span class="nx">decrypt</span><span class="p">(</span><span class="nx">output</span><span class="p">);</span>
	                <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">output2</span><span class="p">);</span>
		        <span class="p">});</span>
	<span class="nt">&lt;/script&gt;</span>
	<span class="nt">&lt;/body&gt;</span>
	<span class="nt">&lt;/html&gt;</span>
	</code></pre></figure>

<script type="module">
  import init, {encrypt,decrypt} from "/assets/js/wasm_encrypt.js";
  init()
  document.getElementById('encrypt').addEventListener('click', () => {
  var x=encrypt(document.getElementById('inputstring').value);
  document.getElementById("encryptedtext").value=x;
	});
	document.getElementById('decrypt').addEventListener('click', () => {
  var x=decrypt(document.getElementById('encryptedtext').value);
  document.getElementById("decryptedtext").value=x;
	});
</script>

<form>
<label for="inputstring">Input String:</label><br />
<textarea rows="5" cols="80" id="inputstring"></textarea><br />
<input id="encrypt" type="button" value="encrypt" />
<input id="decrypt" type="button" value="decrypt" />
</form>
<p><br />
Encrypted Payload:<br /></p>
<textarea rows="5" cols="80" id="encryptedtext"></textarea>
<p><br />
Decrypted Payload:<br /></p>
<textarea rows="5" cols="80" id="decryptedtext"></textarea>
<p><br />
<br /></p>

<p>To see the full source see <a href="https://github.com/maebli/100rustsnippets/tree/master/wasm-encrypt">github</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 21/100 - euler challange 5</title><link href="https://maebli.github.io/archive/2021-11-09-100rust-21/" rel="alternate" type="text/html" title="Rust challenge 21/100 - euler challange 5" /><published>2021-11-09T20:00:00+00:00</published><updated>2021-11-09T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-21</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-09-100rust-21/"><![CDATA[<p><em>Note: This  example uses brute force, which, while teachin me things about Rust’s Functional Programming Features, is not a very elegant solution to the given problem. It will stop before computing the result if running in Debug Compiled mode.</em></p>

<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
  <li><a href="#21st-challenge">21st Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="21st-challenge">21st Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Solve euler challange number 5.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="c1">//Problem 5</span>
	<span class="c1">// [](https://projecteuler.net/problem=5)</span>
	<span class="c1">// 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.</span>
	<span class="c1">// What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?</span>
	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    
	    <span class="k">let</span> <span class="n">x</span> <span class="o">=</span><span class="p">(</span><span class="mi">1</span><span class="o">..</span><span class="p">)</span>
	        <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">{(</span><span class="mi">1</span><span class="o">..</span><span class="mi">20</span><span class="p">)</span><span class="nf">.fold</span><span class="p">(</span><span class="mi">0</span><span class="p">,|</span><span class="n">total</span><span class="p">,</span><span class="n">next</span><span class="p">|{</span><span class="n">total</span><span class="o">+</span><span class="n">x</span><span class="o">%</span><span class="n">next</span><span class="p">})</span> <span class="o">==</span><span class="mi">0</span><span class="p">}</span> <span class="p">)</span>
	        <span class="nf">.take</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
	        <span class="nf">.last</span><span class="p">();</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span><span class="n">x</span><span class="nf">.unwrap</span><span class="p">());</span>

	<span class="p">}</span>
	</code></pre></figure>

<p>To see the full source see <a href="https://github.com/maebli/100rustsnippets/tree/master/euler-5">github</a> and see the live demo in <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=b2d2a90fee395282ad70412ea7cd2a54">playground</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 20/100 - crc16 in webassembly</title><link href="https://maebli.github.io/archive/2021-11-03-100rust-20/" rel="alternate" type="text/html" title="Rust challenge 20/100 - crc16 in webassembly" /><published>2021-11-05T20:00:00+00:00</published><updated>2021-11-05T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-20</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-03-100rust-20/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#20th-challenge">20th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<p><img src="/assets/img/crc.jpeg" alt="" /></p>

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="20th-challenge">20th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Calculate crc16-EN_13757 in Rust and create a webassembly package that can be run from javascript. The motivation here
is that crc is much simpler and faster in RUST.</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">mod</span> <span class="n">utils</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">wasm_bindgen</span><span class="p">::</span><span class="nn">prelude</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">crc16</span><span class="p">::{</span><span class="n">EN_13757</span><span class="p">,</span> <span class="n">State</span><span class="p">};</span>
	<span class="k">use</span> <span class="nn">hex</span><span class="p">::</span><span class="n">FromHexError</span><span class="p">;</span>

	<span class="c1">// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global</span>
	<span class="c1">// allocator.</span>
	<span class="nd">#[cfg(feature</span> <span class="nd">=</span> <span class="s">"wee_alloc"</span><span class="nd">)]</span>
	<span class="nd">#[global_allocator]</span>
	<span class="k">static</span> <span class="n">ALLOC</span><span class="p">:</span> <span class="nn">wee_alloc</span><span class="p">::</span><span class="n">WeeAlloc</span> <span class="o">=</span> <span class="nn">wee_alloc</span><span class="p">::</span><span class="nn">WeeAlloc</span><span class="p">::</span><span class="n">INIT</span><span class="p">;</span>

	<span class="nd">#[wasm_bindgen]</span>
	<span class="k">extern</span> <span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">alert</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">);</span>
	<span class="p">}</span>

	<span class="nd">#[wasm_bindgen]</span>
	<span class="k">pub</span> <span class="k">fn</span> <span class="nf">crc16_en_13757</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">str</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">String</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">a</span><span class="o">=</span> <span class="nn">hex</span><span class="p">::</span><span class="nf">decode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">s</span><span class="p">);</span>
	    <span class="k">match</span> <span class="n">a</span> <span class="p">{</span>
	        <span class="nf">Ok</span><span class="p">(</span><span class="n">_</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span><span class="nd">format!</span><span class="p">(</span><span class="s">"{:#04x}"</span><span class="p">,</span><span class="nn">State</span><span class="p">::</span><span class="o">&lt;</span><span class="n">EN_13757</span><span class="o">&gt;</span><span class="p">::</span><span class="nf">calculate</span><span class="p">(</span><span class="o">&amp;</span><span class="n">a</span><span class="nf">.unwrap</span><span class="p">()))},</span>
	        <span class="nf">Err</span><span class="p">(</span><span class="n">_</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nn">String</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="s">"Error calculating CRC16, invalid input."</span><span class="p">)</span>
	    <span class="p">}</span>
	<span class="p">}</span>
	</code></pre></figure>

<p>With a simple <code class="language-plaintext highlighter-rouge">html</code> the web assembly is tested. A Hex string of 50 million charcters is calculated within <code class="language-plaintext highlighter-rouge">800ms</code> :astonished:</p>

<figure class="highlight"><pre><code class="language-html" data-lang="html">	<span class="cp">&lt;!DOCTYPE html&gt;</span>
	<span class="nt">&lt;html&gt;</span>
	  <span class="nt">&lt;head&gt;</span>
	    <span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span><span class="nt">&gt;</span>
	    <span class="nt">&lt;title&gt;</span>hello-wasm example<span class="nt">&lt;/title&gt;</span>
	  <span class="nt">&lt;/head&gt;</span>
	  <span class="nt">&lt;body&gt;</span>
	    <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"module"</span><span class="nt">&gt;</span>
	      <span class="k">import</span> <span class="nx">init</span><span class="p">,</span> <span class="p">{</span><span class="nx">crc16_en_13757</span><span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">./assets/pkg/crc16_en_13757.js</span><span class="dl">"</span><span class="p">;</span>
	      <span class="nx">init</span><span class="p">()</span>
	        <span class="p">.</span><span class="nx">then</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">{</span>
	          <span class="kd">const</span> <span class="nx">genRanHex</span> <span class="o">=</span> <span class="nx">size</span> <span class="o">=&gt;</span> <span class="p">[...</span><span class="nb">Array</span><span class="p">(</span><span class="nx">size</span><span class="p">)].</span><span class="nx">map</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">16</span><span class="p">).</span><span class="nx">toString</span><span class="p">(</span><span class="mi">16</span><span class="p">)).</span><span class="nx">join</span><span class="p">(</span><span class="dl">''</span><span class="p">);</span>
	          <span class="kd">var</span> <span class="nx">input</span> <span class="o">=</span> <span class="nx">genRanHex</span><span class="p">(</span><span class="mi">50000000</span><span class="p">);</span>
	          <span class="kd">let</span> <span class="nx">before</span> <span class="o">=</span> <span class="nb">Date</span><span class="p">.</span><span class="nx">now</span><span class="p">();</span>
	          <span class="kd">var</span> <span class="nx">crc16</span><span class="o">=</span><span class="nx">crc16_en_13757</span><span class="p">(</span><span class="nx">input</span><span class="p">);</span>
	          <span class="kd">let</span> <span class="nx">after</span> <span class="o">=</span> <span class="nb">Date</span><span class="p">.</span><span class="nx">now</span><span class="p">();</span>
	          <span class="nx">alert</span><span class="p">(</span><span class="nx">after</span><span class="o">-</span><span class="nx">before</span><span class="p">);</span>
	        <span class="p">});</span>
	    <span class="nt">&lt;/script&gt;</span>
	  <span class="nt">&lt;/body&gt;</span>
	<span class="nt">&lt;/html&gt;</span>
	</code></pre></figure>

<script type="module">
  import init, {crc16_en_13757} from "/assets/js/crc16_EN_13757.js";
  init()
  document.getElementById('calculate').addEventListener('click', () => {
  var x=crc16_en_13757(document.getElementById('inputstring').value);
  document.getElementById("output").innerText=x;
});
</script>

<form>
<label for="inputstring">Input String:</label><br />
<textarea rows="5" cols="80" id="inputstring"></textarea><br />
<input id="calculate" type="button" value="calculate" />
</form>
<p><br />
Result:<br /></p>
<div id="output"></div>
<p><br /></p>

<p>To see the full source see <a href="https://github.com/maebli/100rustsnippets/tree/master/crc16-EN-13757">github</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 19/100 - Porting LoRaWAN project part 4</title><link href="https://maebli.github.io/archive/2021-11-03-100rust-19/" rel="alternate" type="text/html" title="Rust challenge 19/100 - Porting LoRaWAN project part 4" /><published>2021-11-05T20:00:00+00:00</published><updated>2021-11-05T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-19</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-03-100rust-19/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#19th-challenge">19th Challenge</a>
        <ul>
          <li><a href="#challenge">challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="19th-challenge">19th Challenge</h2>
<h3 id="challenge">challenge</h3>

<p>Today’s challenge is continuation of a <a href="https://maebli.github.io/rust/2021/11/05/100rust-18.html">previous challenge</a>.
The task is to extend the existing project with tests</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>Adding documentation when you are creating a binary was done using <code class="language-plaintext highlighter-rouge">cargo doc --bins --open --document-private-items</code>. 
See <a href="https://stackoverflow.com/questions/68728262/cargo-doc-does-not-generate-documentation-for-private-items-in-a-project-that-is">stack-overflow thread</a> for more detailed information.</p>

<p>The new solution looks like this and the documentation is very pretty that is generated</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="cd">//! Functionality Calculating Airtime of LoRaWAN Packets</span>
	<span class="cd">//!</span>
	<span class="cd">//! This ports [](https://github.com/brocaar/lorawan/blob/master/airtime/airtime.go)</span>
	<span class="cd">//!</span>
	<span class="cd">//! This implements the formula as defined by:</span>
	<span class="cd">//! [](/https://www.semtech.com/uploads/documents/LoraDesignGuide_STD.pdf)</span>
	<span class="cd">//!</span>
	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">cmp</span><span class="p">::</span><span class="n">max</span><span class="p">;</span>
	<span class="k">pub</span> <span class="k">type</span> <span class="n">CodingRate</span><span class="o">=</span><span class="nb">u32</span><span class="p">;</span>


	<span class="cd">/// List of all available coding rates</span>
	<span class="k">pub</span> <span class="k">enum</span> <span class="n">CodingRates</span><span class="p">{</span>
	    <span class="n">CodingRate45</span><span class="p">,</span>
	    <span class="n">CodingRate46</span><span class="p">,</span>
	    <span class="n">CodingRate47</span><span class="p">,</span>
	    <span class="n">CodingRate48</span>
	<span class="p">}</span>

	<span class="cd">/// LoRaWAN Modulation Information</span>
	<span class="k">pub</span> <span class="k">struct</span> <span class="n">Modulation</span> <span class="p">{</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">spreading_factor</span><span class="p">:</span><span class="nb">u64</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">bandwidth</span><span class="p">:</span><span class="nb">u64</span>
	<span class="p">}</span>

	<span class="cd">///  Information required to calculate Airtime</span>
	<span class="k">pub</span> <span class="k">struct</span> <span class="n">FrameMetaInformation</span> <span class="p">{</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">payload_length</span><span class="p">:</span><span class="nb">u64</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">preamble_length</span><span class="p">:</span><span class="nb">u64</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">is_header_enabled</span><span class="p">:</span><span class="nb">bool</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">is_low_data_rate_optimization_enabled</span><span class="p">:</span><span class="nb">bool</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">modulation</span><span class="p">:</span><span class="n">Modulation</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">coding_rate</span><span class="p">:</span><span class="n">CodingRates</span><span class="p">,</span>

	<span class="p">}</span>

	<span class="k">impl</span> <span class="n">CodingRates</span><span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">value</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">CodingRate</span> <span class="p">{</span>
	        <span class="k">match</span> <span class="k">self</span><span class="p">{</span>
	            <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate45</span> <span class="k">=&gt;</span> <span class="mi">1</span><span class="p">,</span>
	            <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate46</span> <span class="k">=&gt;</span> <span class="mi">2</span><span class="p">,</span>
	            <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate47</span> <span class="k">=&gt;</span> <span class="mi">3</span><span class="p">,</span>
	            <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate48</span> <span class="k">=&gt;</span> <span class="mi">4</span><span class="p">,</span>
	        <span class="p">}</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="cd">/// # Airtime Calculation</span>
	<span class="cd">///   This calculates how long it will take for a packet to be sent</span>
	<span class="cd">///   depending on the Frame Meta Data</span>
	<span class="cd">///</span>
	<span class="cd">/// # Example</span>
	<span class="cd">///   ~~~</span>
	<span class="cd">///   let f = FrameMetaInformation{</span>
	<span class="cd">///         payload_length: 13,</span>
	<span class="cd">///         preamble_length: 0,</span>
	<span class="cd">///         is_header_enabled: true,</span>
	<span class="cd">///         is_low_data_rate_optimization_enabled: false,</span>
	<span class="cd">///         modulation: Modulation {</span>
	<span class="cd">///             spreading_factor: 12,</span>
	<span class="cd">///             bandwidth: 0</span>
	<span class="cd">///         },</span>
	<span class="cd">///         coding_rate: CodingRates::CodingRate45</span>
	<span class="cd">///     };</span>
	<span class="cd">///     assert_eq!(23,f.get_payload_symbol_count())</span>
	<span class="cd">///     ~~~</span>
	<span class="k">impl</span> <span class="n">FrameMetaInformation</span><span class="p">{</span>

	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="k">fn</span> <span class="nf">get_airtime</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span><span class="p">{</span>
	        <span class="p">(</span><span class="k">self</span><span class="nf">.get_preamble_duration</span><span class="p">()</span> <span class="o">+</span>
	            <span class="k">self</span><span class="py">.modulation</span><span class="nf">.get_symbol_duration</span><span class="p">()</span> <span class="o">*</span> <span class="k">self</span><span class="nf">.get_payload_symbol_count</span><span class="p">()</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u64</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">get_preamble_duration</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">f64</span><span class="p">{</span>
	        <span class="k">self</span><span class="py">.modulation</span><span class="nf">.get_preamble_duration</span><span class="p">(</span><span class="k">self</span><span class="py">.preamble_length</span><span class="p">)</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">get_payload_symbol_count</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="n">de</span> <span class="o">=</span> <span class="k">self</span><span class="py">.is_low_data_rate_optimization_enabled</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">h</span> <span class="o">=</span> <span class="p">(</span><span class="o">!</span><span class="k">self</span><span class="py">.is_low_data_rate_optimization_enabled</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">;</span>

	        <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="mi">8</span> <span class="o">*</span> <span class="k">self</span><span class="py">.payload_length</span> <span class="o">+</span> <span class="mi">28</span> <span class="o">+</span> <span class="mi">16</span> <span class="o">-</span> <span class="mi">20</span> <span class="o">*</span> <span class="n">h</span><span class="p">)</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="p">(</span><span class="mi">4</span> <span class="o">*</span> <span class="p">(</span><span class="k">self</span><span class="py">.modulation.spreading_factor</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">de</span><span class="p">))</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">c</span> <span class="o">=</span> <span class="p">(</span><span class="k">self</span><span class="py">.coding_rate</span><span class="nf">.value</span><span class="p">()</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">)</span> <span class="o">+</span> <span class="mf">4.0</span><span class="p">;</span>

	        <span class="mi">8</span> <span class="o">+</span> <span class="nf">max</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="nf">.ceil</span><span class="p">()</span> <span class="o">*</span> <span class="n">c</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
	    <span class="p">}</span>

	<span class="p">}</span>
	</code></pre></figure>

<p>To get a good feel for it see / clone <a href="https://github.com/maebli/100rustsnippets/tree/master/lorawan-project-structure-2">github</a>. You can see the <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=fd2be0ca105830b47046f7f67fa958a0">tests in action on rust playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 18/100 - Porting LoRaWAN project part 3</title><link href="https://maebli.github.io/archive/2021-11-03-100rust-18/" rel="alternate" type="text/html" title="Rust challenge 18/100 - Porting LoRaWAN project part 3" /><published>2021-11-05T20:00:00+00:00</published><updated>2021-11-05T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-18</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-03-100rust-18/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this-grey_question">What is this :grey_question:</a></li>
      <li><a href="#18th-challenge">18th Challenge</a>
        <ul>
          <li><a href="#challenge">challenge</a></li>
          <li><a href="#solution-white_check_mark">Solution :white_check_mark:</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this-grey_question">What is this :grey_question:</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="18th-challenge">18th Challenge</h2>
<h3 id="challenge">challenge</h3>

<p>Today’s challenge is continuation of a <a href="https://maebli.github.io/rust/2021/11/03/100rust-17.html">previous challenge</a>.
The task is to extend the existing project with tests</p>

<h3 id="solution-white_check_mark">Solution :white_check_mark:</h3>

<p>The new solution looks like this:</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">cmp</span><span class="p">::</span><span class="n">max</span><span class="p">;</span>
	<span class="k">pub</span> <span class="k">type</span> <span class="n">CodingRate</span><span class="o">=</span><span class="nb">u32</span><span class="p">;</span>

	<span class="k">pub</span> <span class="k">enum</span> <span class="n">CodingRates</span><span class="p">{</span>
	    <span class="n">CodingRate45</span><span class="p">,</span>
	    <span class="n">CodingRate46</span><span class="p">,</span>
	    <span class="n">CodingRate47</span><span class="p">,</span>
	    <span class="n">CodingRate48</span>
	<span class="p">}</span>

	<span class="k">pub</span> <span class="k">struct</span> <span class="n">Modulation</span> <span class="p">{</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">spreading_factor</span><span class="p">:</span><span class="nb">u64</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">bandwidth</span><span class="p">:</span><span class="nb">u64</span>
	<span class="p">}</span>

	<span class="k">pub</span> <span class="k">struct</span> <span class="n">FrameMetaInformation</span> <span class="p">{</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">payload_length</span><span class="p">:</span><span class="nb">u64</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">preamble_length</span><span class="p">:</span><span class="nb">u64</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">is_header_enabled</span><span class="p">:</span><span class="nb">bool</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">is_low_data_rate_optimization_enabled</span><span class="p">:</span><span class="nb">bool</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">modulation</span><span class="p">:</span><span class="n">Modulation</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">coding_rate</span><span class="p">:</span><span class="n">CodingRates</span><span class="p">,</span>

	<span class="p">}</span>

	<span class="k">impl</span> <span class="n">CodingRates</span><span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">value</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">CodingRate</span> <span class="p">{</span>
	        <span class="k">match</span> <span class="k">self</span><span class="p">{</span>
	            <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate45</span> <span class="k">=&gt;</span> <span class="mi">1</span><span class="p">,</span>
	            <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate46</span> <span class="k">=&gt;</span> <span class="mi">2</span><span class="p">,</span>
	            <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate47</span> <span class="k">=&gt;</span> <span class="mi">3</span><span class="p">,</span>
	            <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate48</span> <span class="k">=&gt;</span> <span class="mi">4</span><span class="p">,</span>
	        <span class="p">}</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="n">FrameMetaInformation</span><span class="p">{</span>

	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="k">fn</span> <span class="nf">get_airtime</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span><span class="p">{</span>
	        <span class="p">(</span><span class="k">self</span><span class="nf">.get_preamble_duration</span><span class="p">()</span> <span class="o">+</span>
	            <span class="k">self</span><span class="py">.modulation</span><span class="nf">.get_symbol_duration</span><span class="p">()</span> <span class="o">*</span> <span class="k">self</span><span class="nf">.get_payload_symbol_count</span><span class="p">()</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u64</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">get_preamble_duration</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">f64</span><span class="p">{</span>
	        <span class="k">self</span><span class="py">.modulation</span><span class="nf">.get_preamble_duration</span><span class="p">(</span><span class="k">self</span><span class="py">.preamble_length</span><span class="p">)</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">get_payload_symbol_count</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="n">de</span> <span class="o">=</span> <span class="k">self</span><span class="py">.is_low_data_rate_optimization_enabled</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">h</span> <span class="o">=</span> <span class="p">(</span><span class="o">!</span><span class="k">self</span><span class="py">.is_low_data_rate_optimization_enabled</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">;</span>

	        <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="mi">8</span> <span class="o">*</span> <span class="k">self</span><span class="py">.payload_length</span> <span class="o">+</span> <span class="mi">28</span> <span class="o">+</span> <span class="mi">16</span> <span class="o">-</span> <span class="mi">20</span> <span class="o">*</span> <span class="n">h</span><span class="p">)</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="p">(</span><span class="mi">4</span> <span class="o">*</span> <span class="p">(</span><span class="k">self</span><span class="py">.modulation.spreading_factor</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">de</span><span class="p">))</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">c</span> <span class="o">=</span> <span class="p">(</span><span class="k">self</span><span class="py">.coding_rate</span><span class="nf">.value</span><span class="p">()</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">)</span> <span class="o">+</span> <span class="mf">4.0</span><span class="p">;</span>

	        <span class="mi">8</span> <span class="o">+</span> <span class="nf">max</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="nf">.ceil</span><span class="p">()</span> <span class="o">*</span> <span class="n">c</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
	    <span class="p">}</span>

	<span class="p">}</span>

	<span class="k">impl</span> <span class="n">Modulation</span><span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">get_symbol_duration</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">f64</span><span class="p">{</span>
	        <span class="p">((</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="k">self</span><span class="py">.spreading_factor</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000_000</span> <span class="o">/</span> <span class="k">self</span><span class="py">.bandwidth</span><span class="p">)</span> <span class="k">as</span> <span class="nb">f64</span>
	    <span class="p">}</span>
	    <span class="k">fn</span> <span class="nf">get_preamble_duration</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span><span class="n">preamble_length</span><span class="p">:</span><span class="nb">u64</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">f64</span><span class="p">{</span>
	        <span class="p">(</span><span class="mf">100.0</span> <span class="o">*</span> <span class="n">preamble_length</span> <span class="k">as</span> <span class="nb">f64</span> <span class="o">+</span> <span class="mf">425.0</span><span class="p">)</span> <span class="o">/</span> <span class="mf">100.0</span> <span class="o">*</span> <span class="k">self</span><span class="nf">.get_symbol_duration</span><span class="p">()</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="nd">#[test]</span>
	<span class="k">fn</span> <span class="nf">test_get_payload_symbol_count</span><span class="p">(){</span>
	    <span class="k">let</span> <span class="n">f</span> <span class="o">=</span> <span class="n">FrameMetaInformation</span><span class="p">{</span>
	        <span class="n">payload_length</span><span class="p">:</span> <span class="mi">13</span><span class="p">,</span>
	        <span class="n">preamble_length</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
	        <span class="n">is_header_enabled</span><span class="p">:</span> <span class="k">true</span><span class="p">,</span>
	        <span class="n">is_low_data_rate_optimization_enabled</span><span class="p">:</span> <span class="k">false</span><span class="p">,</span>
	        <span class="n">modulation</span><span class="p">:</span> <span class="n">Modulation</span> <span class="p">{</span>
	            <span class="n">spreading_factor</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span>
	            <span class="n">bandwidth</span><span class="p">:</span> <span class="mi">0</span>
	        <span class="p">},</span>
	        <span class="n">coding_rate</span><span class="p">:</span> <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate45</span>
	    <span class="p">};</span>

	    <span class="nd">assert_eq!</span><span class="p">(</span><span class="mi">23</span><span class="p">,</span><span class="n">f</span><span class="nf">.get_payload_symbol_count</span><span class="p">())</span>
	<span class="p">}</span>

	<span class="nd">#[cfg(test)]</span>
	<span class="k">mod</span> <span class="n">tests</span> <span class="p">{</span>

	    <span class="k">use</span> <span class="k">super</span><span class="p">::</span><span class="o">*</span><span class="p">;</span>

	    <span class="nd">#[test]</span>
	    <span class="k">fn</span> <span class="nf">test_get_preamble_duration</span><span class="p">()</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="n">m</span> <span class="o">=</span> <span class="n">Modulation</span> <span class="p">{</span>
	            <span class="n">spreading_factor</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span>
	            <span class="n">bandwidth</span><span class="p">:</span> <span class="mi">125</span>
	        <span class="p">};</span>
	        <span class="nd">assert_eq!</span><span class="p">(</span><span class="mf">401408_000.0</span><span class="p">,</span> <span class="n">m</span><span class="nf">.get_preamble_duration</span><span class="p">(</span><span class="mi">8</span><span class="p">));</span>
	    <span class="p">}</span>

	    <span class="nd">#[test]</span>
	    <span class="k">fn</span> <span class="nf">test_get_symbol_duration</span><span class="p">()</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">m</span> <span class="o">=</span> <span class="n">Modulation</span> <span class="p">{</span>
	            <span class="n">spreading_factor</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span>
	            <span class="n">bandwidth</span><span class="p">:</span> <span class="mi">125</span>
	        <span class="p">};</span>
	        <span class="nd">assert_eq!</span><span class="p">(</span><span class="mf">32768_000.0</span><span class="p">,</span> <span class="n">m</span><span class="nf">.get_symbol_duration</span><span class="p">());</span>
	        <span class="n">m</span><span class="py">.spreading_factor</span> <span class="o">=</span> <span class="mi">9</span><span class="p">;</span>
	        <span class="nd">assert_eq!</span><span class="p">(</span><span class="mf">4096_000.0</span><span class="p">,</span> <span class="n">m</span><span class="nf">.get_symbol_duration</span><span class="p">());</span>
	        <span class="n">m</span><span class="py">.bandwidth</span> <span class="o">=</span> <span class="mi">500</span><span class="p">;</span>
	        <span class="nd">assert_eq!</span><span class="p">(</span><span class="mf">1024_000.0</span><span class="p">,</span> <span class="n">m</span><span class="nf">.get_symbol_duration</span><span class="p">());</span>
	    <span class="p">}</span>

	    <span class="nd">#[test]</span>
	    <span class="k">fn</span> <span class="nf">test_airtime_calculation</span><span class="p">()</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="n">f</span> <span class="o">=</span> <span class="n">FrameMetaInformation</span> <span class="p">{</span>
	            <span class="n">payload_length</span><span class="p">:</span> <span class="mi">13</span><span class="p">,</span>
	            <span class="n">preamble_length</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span>
	            <span class="n">is_header_enabled</span><span class="p">:</span> <span class="k">true</span><span class="p">,</span>
	            <span class="n">is_low_data_rate_optimization_enabled</span><span class="p">:</span> <span class="k">false</span><span class="p">,</span>
	            <span class="n">modulation</span><span class="p">:</span> <span class="n">Modulation</span> <span class="p">{</span>
	                <span class="n">spreading_factor</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span>
	                <span class="n">bandwidth</span><span class="p">:</span> <span class="mi">125</span>
	            <span class="p">},</span>
	            <span class="n">coding_rate</span><span class="p">:</span> <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate45</span><span class="p">,</span>
	        <span class="p">};</span>

	        <span class="nd">assert_eq!</span><span class="p">(</span><span class="mi">1_155_072_000</span><span class="p">,</span> <span class="n">f</span><span class="nf">.get_airtime</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">);</span>
	    <span class="p">}</span>
	<span class="p">}</span>
	</code></pre></figure>

<p>To get a good feel for it see / clone <a href="https://github.com/maebli/100rustsnippets/tree/master/lorawan-project-structure-2">github</a>. You can see the <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=fd2be0ca105830b47046f7f67fa958a0">tests in action on rust playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 17/100 - Porting LoRaWAN project part 2</title><link href="https://maebli.github.io/archive/2021-11-03-100rust-17/" rel="alternate" type="text/html" title="Rust challenge 17/100 - Porting LoRaWAN project part 2" /><published>2021-11-03T20:00:00+00:00</published><updated>2021-11-03T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-17</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-03-100rust-17/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this">What is this?</a></li>
  <li><a href="#17th-challenge">17th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution">Solution</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="17th-challenge">17th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today’s challenge is continuation of a <a href="https://maebli.github.io/rust/2021/10/31/100rust-12.html">previous challenge</a>.</p>

<h3 id="solution">Solution</h3>

<p>The new solution looks like this:</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">cmp</span><span class="p">::</span><span class="n">max</span><span class="p">;</span>
	<span class="k">pub</span> <span class="k">type</span> <span class="n">CodingRate</span><span class="o">=</span><span class="nb">u32</span><span class="p">;</span>

	<span class="k">pub</span> <span class="k">enum</span> <span class="n">CodingRates</span><span class="p">{</span>
	    <span class="n">CodingRate45</span><span class="p">,</span>
	    <span class="n">CodingRate46</span><span class="p">,</span>
	    <span class="n">CodingRate47</span><span class="p">,</span>
	    <span class="n">CodingRate48</span>
	<span class="p">}</span>

	<span class="k">pub</span> <span class="k">struct</span> <span class="n">Modulation</span> <span class="p">{</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">spreading_factor</span><span class="p">:</span><span class="nb">u64</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">bandwidth</span><span class="p">:</span><span class="nb">u64</span>
	<span class="p">}</span>

	<span class="k">pub</span> <span class="k">struct</span> <span class="n">FrameMetaInformation</span> <span class="p">{</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">payload_length</span><span class="p">:</span><span class="nb">u64</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">preamble_length</span><span class="p">:</span><span class="nb">u64</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">is_header_enabled</span><span class="p">:</span><span class="nb">bool</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">is_low_data_rate_optimization_enabled</span><span class="p">:</span><span class="nb">bool</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">modulation</span><span class="p">:</span><span class="n">Modulation</span><span class="p">,</span>
	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="n">coding_rate</span><span class="p">:</span><span class="n">CodingRates</span><span class="p">,</span>

	<span class="p">}</span>

	<span class="k">impl</span> <span class="n">CodingRates</span><span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">value</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">CodingRate</span> <span class="p">{</span>
	        <span class="k">match</span> <span class="k">self</span><span class="p">{</span>
	            <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate45</span> <span class="k">=&gt;</span> <span class="mi">1</span><span class="p">,</span>
	            <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate46</span> <span class="k">=&gt;</span> <span class="mi">2</span><span class="p">,</span>
	            <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate47</span> <span class="k">=&gt;</span> <span class="mi">3</span><span class="p">,</span>
	            <span class="nn">CodingRates</span><span class="p">::</span><span class="n">CodingRate48</span> <span class="k">=&gt;</span> <span class="mi">4</span><span class="p">,</span>
	        <span class="p">}</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="n">FrameMetaInformation</span><span class="p">{</span>

	    <span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="k">fn</span> <span class="nf">get_airtime</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span><span class="p">{</span>
	        <span class="p">(</span><span class="k">self</span><span class="nf">.get_preamble_duration</span><span class="p">()</span> <span class="o">+</span>
	            <span class="k">self</span><span class="py">.modulation</span><span class="nf">.get_symbol_duration</span><span class="p">()</span> <span class="o">*</span> <span class="k">self</span><span class="nf">.get_payload_symbol_count</span><span class="p">()</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u64</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">get_preamble_duration</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">f64</span><span class="p">{</span>
	        <span class="k">self</span><span class="py">.modulation</span><span class="nf">.get_preamble_duration</span><span class="p">(</span><span class="k">self</span><span class="py">.preamble_length</span><span class="p">)</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">get_payload_symbol_count</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u64</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="n">de</span> <span class="o">=</span> <span class="k">self</span><span class="py">.is_low_data_rate_optimization_enabled</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">h</span> <span class="o">=</span> <span class="p">(</span><span class="o">!</span><span class="k">self</span><span class="py">.is_low_data_rate_optimization_enabled</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">;</span>

	        <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="mi">8</span> <span class="o">*</span> <span class="k">self</span><span class="py">.payload_length</span> <span class="o">+</span> <span class="mi">28</span> <span class="o">+</span> <span class="mi">16</span> <span class="o">-</span> <span class="mi">20</span> <span class="o">*</span> <span class="n">h</span><span class="p">)</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="p">(</span><span class="mi">4</span> <span class="o">*</span> <span class="p">(</span><span class="k">self</span><span class="py">.modulation.spreading_factor</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">de</span><span class="p">))</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">;</span>
	        <span class="k">let</span> <span class="n">c</span> <span class="o">=</span> <span class="p">(</span><span class="k">self</span><span class="py">.coding_rate</span><span class="nf">.value</span><span class="p">()</span> <span class="k">as</span> <span class="nb">f64</span><span class="p">)</span> <span class="o">+</span> <span class="mf">4.0</span><span class="p">;</span>

	        <span class="mi">8</span> <span class="o">+</span> <span class="nf">max</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="nf">.ceil</span><span class="p">()</span> <span class="o">*</span> <span class="n">c</span><span class="p">)</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
	    <span class="p">}</span>

	<span class="p">}</span>

	<span class="k">impl</span> <span class="n">Modulation</span><span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">get_symbol_duration</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">f64</span><span class="p">{</span>
	        <span class="p">((</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="k">self</span><span class="py">.spreading_factor</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000_000</span> <span class="o">/</span> <span class="k">self</span><span class="py">.bandwidth</span><span class="p">)</span> <span class="k">as</span> <span class="nb">f64</span>
	    <span class="p">}</span>
	    <span class="k">fn</span> <span class="nf">get_preamble_duration</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span><span class="n">preamble_length</span><span class="p">:</span><span class="nb">u64</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">f64</span><span class="p">{</span>
	        <span class="p">((</span><span class="mf">100.0</span> <span class="o">*</span> <span class="n">preamble_length</span> <span class="k">as</span> <span class="nb">f64</span> <span class="o">+</span> <span class="mf">425.0</span><span class="p">)</span> <span class="o">/</span> <span class="mf">100.0</span> <span class="o">*</span> <span class="k">self</span><span class="nf">.get_symbol_duration</span><span class="p">())</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	</code></pre></figure>

<p>To get a good feel for it see / clone <a href="https://github.com/maebli/100rustsnippets/tree/master/lorawan-project-structure-2">github</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 16/100 - Project structure part two</title><link href="https://maebli.github.io/archive/2021-11-03-100rust-16/" rel="alternate" type="text/html" title="Rust challenge 16/100 - Project structure part two" /><published>2021-11-03T20:00:00+00:00</published><updated>2021-11-03T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-16</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-03-100rust-16/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this">What is this?</a></li>
  <li><a href="#16th-challenge">16th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution">Solution</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="16th-challenge">16th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today’s challenge is a second attempt at <a href="https://maebli.github.io/rust/2021/11/02/100rust-15.html">yesterday’s challange</a>. The solution I provided has been deprecated, so I want to do it without the use of <code class="language-plaintext highlighter-rouge">mod.rs</code></p>

<h3 id="solution">Solution</h3>

<p>The new solution looks like this:</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">	<span class="nb">.</span>
	├── airtime
	│   └── calculator.rs
	├── airtime.rs
	├── applayer
	│   ├── clock
	│   │   ├── cid_string.rs
	│   │   └── clock_sync.rs
	│   ├── clock.rs
	│   ├── fragmentation
	│   │   ├── cid_string.rs
	│   │   ├── encode.rs
	│   │   └── fragmentation.rs
	│   ├── fragmentation.rs
	│   ├── multicastsetup
	│   │   ├── cid_string.rs
	│   │   ├── keys.rs
	│   │   └── multicastsetup.rs
	│   └── multicastsetup.rs
	├── applayer.rs
	├── backend
	│   ├── backend.rs
	│   ├── client.rs
	│   ├── joinserver
	│   │   ├── context.rs
	│   │   ├── errors.rs
	│   │   ├── join_request.rs
	│   │   ├── join_server.rs
	│   │   ├── rejoin_request.rs
	│   │   └── session_keys.rs
	│   └── joinserver.rs
	├── backend.rs
	├── band
	│   ├── band.rs
	│   ├── band_as923.rs
	│   ├── band_au915_928.rs
	│   ├── band_cn470_510.rs
	│   ├── band_cn779_787.rs
	│   ├── band_eu433.rs
	│   ├── band_eu863_870.rs
	│   ├── band_in865_867.rs
	│   ├── band_irsm2400.rs
	│   ├── band_krs920_923.rs
	│   ├── band_ru864_870.rs
	│   ├── band_us902_928.rs
	│   └── errors.rs
	├── band.rs
	├── calculator
	├── clock
	├── gps
	│   └── gps.rs
	├── gps.rs
	├── main.rs
	├── sensitivity
	│   └── sensitivity.rs
	└── sensitivity.rs

	</code></pre></figure>

<p>To get a good feel for it see / clone <a href="https://github.com/maebli/100rustsnippets/tree/master/lorawan-project-structure-2">github</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 15/100 - Project structure</title><link href="https://maebli.github.io/archive/2021-11-02-100rust-15/" rel="alternate" type="text/html" title="Rust challenge 15/100 - Project structure" /><published>2021-11-02T20:00:00+00:00</published><updated>2021-11-02T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-15</id><content type="html" xml:base="https://maebli.github.io/archive/2021-11-02-100rust-15/"><![CDATA[<div class="alert alert-info" role="alert"><i class="fa fa-info-circle"></i> <b>Note:</b> The solution on this page is outdated, and mod.rs is no longer needed. See <a href="https://doc.rust-lang.org/edition-guide/rust-2018/path-changes.html">https://doc.rust-lang.org/edition-guide/rust-2018/path-changes.html</a></div>

<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this">What is this?</a></li>
  <li><a href="#15th-challenge">15th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution">Solution</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="15th-challenge">15th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today’s challenge is to familiarize myself with structuring and organizing rust projects. In order to do that, the challenge is to copy the structure of an existing project</p>

<h3 id="solution">Solution</h3>

<p>Organizing files and folders in Rust is a tad confusing. I found the following post very helpful <a href="https://stackoverflow.com/questions/26224947/how-do-i-do-a-basic-import-include-of-a-function-from-one-module-to-another-in-r?noredirect=1&amp;lq=1">on stackoverflow</a>.</p>

<p>The following is only the beginning of the structure:</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">	<span class="nb">.</span>
	├── airtime
	│   └── calculator.rs
	├── applayer
	│   ├── clock
	│   │   ├── cid_string.rs
	│   │   ├── clock_sync.rs
	│   │   └── mod.rs
	│   ├── fragmentation
	│   │   ├── cid_string.rs
	│   │   ├── encode.rs
	│   │   ├── fragmentation.rs
	│   │   └── mod.rs
	│   ├── mod.rs
	│   └── multicastsetup
	│       ├── cid_string.rs
	│       ├── keys.rs
	│       ├── mod.rs
	│       └── multicastsetup.rs
	├── backend
	├── band
	├── calculator
	│   └── mod.rs
	├── clock
	│   └── mod.rs
	├── gps
	├── main.rs
	└── sensitivity

	</code></pre></figure>

<p>example content of <code class="language-plaintext highlighter-rouge">multicastsetup/mod.rs</code></p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">pub</span> <span class="k">mod</span> <span class="n">cid_string</span><span class="p">;</span>
	<span class="k">pub</span> <span class="k">mod</span> <span class="n">keys</span><span class="p">;</span>
	<span class="k">pub</span> <span class="k">mod</span> <span class="n">multicastsetup</span><span class="p">;</span>

	</code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/lorawan-project-structure">github</a>.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 14/100 - Project Euler Challange</title><link href="https://maebli.github.io/archive/2021-10-31-100rust-14/" rel="alternate" type="text/html" title="Rust challenge 14/100 - Project Euler Challange" /><published>2021-11-01T20:00:00+00:00</published><updated>2021-11-01T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-14</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-31-100rust-14/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this">What is this?</a></li>
      <li><a href="#14th-challenge">14th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="14th-challenge">14th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p><a href="https://projecteuler.net/problem=4">Euler Challange 4</a></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
</code></pre></div></div>

<h3 id="solution">Solution</h3>

<p>First I tried it with number manipulation and recursion, but somehow it was easier with strings.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">euler4</span><span class="p">(){</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">largest_prod</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">prod</span> <span class="p">;</span>

	    <span class="k">const</span> <span class="n">RANGE</span><span class="p">:</span> <span class="n">Range</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span> <span class="o">=</span> <span class="mi">100</span><span class="o">..</span><span class="mi">1000</span><span class="p">;</span>

	    <span class="k">for</span> <span class="n">x</span> <span class="k">in</span> <span class="n">RANGE</span> <span class="p">{</span>
	        <span class="k">for</span> <span class="n">y</span> <span class="k">in</span> <span class="n">RANGE</span> <span class="p">{</span>
	            <span class="n">prod</span> <span class="o">=</span><span class="n">x</span><span class="o">*</span><span class="n">y</span><span class="p">;</span>

	            <span class="k">if</span> <span class="n">prod</span> <span class="o">&gt;</span> <span class="n">largest_prod</span> <span class="o">&amp;&amp;</span> <span class="nf">is_palindrome</span><span class="p">(</span><span class="n">prod</span><span class="p">){</span>
	                <span class="n">largest_prod</span> <span class="o">=</span> <span class="n">prod</span><span class="p">;</span>

	            <span class="p">}</span>
	        <span class="p">}</span>
	    <span class="p">}</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"largest palindrome which is product of two three digit numbers = {}"</span><span class="p">,</span><span class="n">largest_prod</span><span class="p">)</span>
	<span class="p">}</span>

	<span class="nd">#[test]</span>
	<span class="k">fn</span> <span class="nf">test_is_palindrome</span><span class="p">(){</span>
	    <span class="nd">assert!</span><span class="p">(</span><span class="o">!</span><span class="nf">is_palindrome</span><span class="p">(</span><span class="mi">99002275</span><span class="p">));</span>
	    <span class="nd">assert!</span><span class="p">(</span><span class="nf">is_palindrome</span><span class="p">(</span><span class="mi">332233</span><span class="p">));</span>
	    <span class="nd">assert!</span><span class="p">(</span><span class="nf">is_palindrome</span><span class="p">(</span><span class="mi">332233332233</span><span class="p">));</span>
	    <span class="nd">assert!</span><span class="p">(</span><span class="nf">is_palindrome</span><span class="p">(</span><span class="mi">99999999</span><span class="p">));</span>
	    <span class="nd">assert!</span><span class="p">(</span><span class="o">!</span><span class="nf">is_palindrome</span><span class="p">(</span><span class="mi">94</span><span class="p">));</span>
	    <span class="nd">assert!</span><span class="p">(</span><span class="o">!</span><span class="nf">is_palindrome</span><span class="p">(</span><span class="mi">994</span><span class="p">));</span>
	    <span class="nd">assert!</span><span class="p">(</span><span class="o">!</span><span class="nf">is_palindrome</span><span class="p">(</span><span class="mi">12345678</span><span class="p">));</span>
	    <span class="nd">assert!</span><span class="p">(</span><span class="o">!</span><span class="nf">is_palindrome</span><span class="p">(</span><span class="mi">971198</span><span class="p">));</span>
	    <span class="nd">assert!</span><span class="p">(</span><span class="o">!</span><span class="nf">is_palindrome</span><span class="p">(</span><span class="mi">963342</span><span class="p">));</span>

	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">is_palindrome</span><span class="p">(</span><span class="n">x</span><span class="p">:</span><span class="nb">u64</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span><span class="p">{</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">s</span> <span class="o">=</span> <span class="n">x</span><span class="nf">.to_string</span><span class="p">();</span>

	    <span class="k">while</span> <span class="n">s</span><span class="nf">.len</span><span class="p">()</span> <span class="o">&gt;=</span> <span class="mi">2</span> <span class="p">{</span>
	        <span class="k">if</span> <span class="n">s</span><span class="nf">.ends_with</span><span class="p">(</span><span class="n">s</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.nth</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">())</span> <span class="p">{</span>
	            <span class="k">if</span> <span class="n">s</span><span class="nf">.len</span><span class="p">()</span> <span class="o">==</span> <span class="mi">2</span> <span class="p">{</span>
	                <span class="k">return</span> <span class="n">s</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.nth</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">==</span> <span class="n">s</span><span class="nf">.chars</span><span class="p">()</span><span class="nf">.nth</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
	            <span class="p">}</span>
	            <span class="n">s</span><span class="nf">.remove</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	            <span class="n">s</span><span class="nf">.remove</span><span class="p">(</span><span class="n">s</span><span class="nf">.len</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
	            <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span><span class="n">s</span><span class="p">)</span>
	        <span class="p">}</span><span class="k">else</span><span class="p">{</span>
	            <span class="k">return</span> <span class="k">false</span>
	        <span class="p">}</span>

	    <span class="p">}</span>

	    <span class="k">false</span>
	<span class="p">}</span>
	</code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/euler">github</a> and <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=45e6977809102eab3c602211ea50e522">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 13/100 - Project Euler Challange</title><link href="https://maebli.github.io/archive/2021-10-31-100rust-13/" rel="alternate" type="text/html" title="Rust challenge 13/100 - Project Euler Challange" /><published>2021-10-31T20:00:00+00:00</published><updated>2021-10-31T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-13</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-31-100rust-13/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this">What is this?</a></li>
  <li><a href="#13th-challenge">13th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution">Solution</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="13th-challenge">13th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p><a href="https://projecteuler.net/problem=1">Euler Challange 1</a></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
</code></pre></div></div>

<p><a href="https://projecteuler.net/problem=2">Euler Challange 2</a></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.
</code></pre></div></div>

<p><a href="https://projecteuler.net/problem=3">Euler Challange 3</a></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
</code></pre></div></div>

<h3 id="solution">Solution</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="nf">euler1</span><span class="p">();</span>
	    <span class="nf">euler2</span><span class="p">();</span>
	    <span class="nf">euler3</span><span class="p">();</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">euler1</span><span class="p">(){</span>
	    <span class="k">let</span> <span class="n">x</span><span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="o">..</span><span class="mi">1000</span><span class="p">)</span>
	        <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="p">(</span><span class="n">x</span><span class="o">%</span><span class="mi">3</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">)|</span> <span class="p">(</span><span class="n">x</span><span class="o">%</span><span class="mi">5</span> <span class="o">==</span> <span class="mi">0</span><span class="p">))</span>
	        <span class="py">.sum</span><span class="p">::</span><span class="o">&lt;</span><span class="nb">u32</span><span class="o">&gt;</span><span class="p">();</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"sum of all multiples {:?}"</span><span class="p">,</span><span class="n">x</span><span class="p">);</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">euler2</span><span class="p">(){</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">sum</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">sum_temp</span> <span class="p">;</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">sum_prev</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">sum_even</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

	    <span class="k">while</span> <span class="n">sum</span> <span class="o">&lt;</span> <span class="mi">4000000</span> <span class="p">{</span>

	        <span class="k">if</span> <span class="n">sum</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
	            <span class="n">sum_even</span> <span class="o">+=</span> <span class="n">sum</span><span class="p">;</span>
	        <span class="p">}</span>

	        <span class="n">sum_temp</span> <span class="o">=</span> <span class="n">sum</span><span class="p">;</span>
	        <span class="n">sum</span> <span class="o">=</span> <span class="n">sum_prev</span> <span class="o">+</span> <span class="n">sum</span><span class="p">;</span>
	        <span class="n">sum_prev</span> <span class="o">=</span> <span class="n">sum_temp</span><span class="p">;</span>

	    <span class="p">}</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"sum of all even fibonacci numbers up to {} is {:?}"</span><span class="p">,</span><span class="mi">40000000</span><span class="p">,</span><span class="n">sum_even</span><span class="p">);</span>

	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">euler3</span><span class="p">(){</span>

	    <span class="k">const</span> <span class="n">NUM</span><span class="p">:</span><span class="nb">u64</span> <span class="o">=</span> <span class="mi">600851475143</span><span class="p">;</span>
	    <span class="k">let</span> <span class="n">factors</span> <span class="o">=</span> <span class="nf">trial_division</span><span class="p">(</span><span class="n">NUM</span><span class="p">);</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"biggest primal factor:{:?}"</span><span class="p">,</span><span class="n">factors</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">());</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">trial_division</span><span class="p">(</span><span class="n">n</span><span class="p">:</span><span class="nb">u64</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u64</span><span class="o">&gt;</span><span class="p">{</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">v</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">n</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">factor</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
	    <span class="k">while</span> <span class="n">n</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="p">{</span>
	        <span class="k">if</span> <span class="n">n</span> <span class="o">%</span> <span class="n">factor</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
	            <span class="n">n</span> <span class="o">=</span> <span class="n">n</span> <span class="o">/</span> <span class="n">factor</span> <span class="k">as</span> <span class="nb">u64</span><span class="p">;</span>
	            <span class="n">v</span><span class="nf">.push</span><span class="p">(</span><span class="n">factor</span><span class="p">);</span>
	        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
	            <span class="n">factor</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
	        <span class="p">}</span>
	    <span class="p">}</span>
	    <span class="n">v</span>
	<span class="p">}</span>
	</code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/euler">github</a> and <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=f2f4ce4dc6c18694d02505967e3cb3c2">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 12/100 - LoRaWAN MIC Calculation</title><link href="https://maebli.github.io/archive/2021-10-31-100rust-12/" rel="alternate" type="text/html" title="Rust challenge 12/100 - LoRaWAN MIC Calculation" /><published>2021-10-31T20:00:00+00:00</published><updated>2021-10-31T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-12</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-31-100rust-12/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this">What is this?</a></li>
  <li><a href="#12th-challenge">12th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution">Solution</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="12th-challenge">12th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<ul>
  <li><a href="https://github.com/brocaar/lorawan/blob/61c36dbfb10a347c4f739ac5fe9a973a84047130/phypayload.go#L588">Calculate MIC</a> according to TTN implementation in GO.</li>
</ul>

<h3 id="solution">Solution</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">serde</span><span class="p">::{</span><span class="n">Deserialize</span><span class="p">,</span> <span class="n">Serialize</span><span class="p">};</span>
	<span class="k">use</span> <span class="nn">aes</span><span class="p">::</span><span class="n">Aes128</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">cmac</span><span class="p">::{</span><span class="n">Cmac</span><span class="p">,</span> <span class="n">Mac</span><span class="p">,</span> <span class="n">NewMac</span><span class="p">};</span>
	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">result</span><span class="p">::</span><span class="nb">Result</span><span class="p">;</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="n">payload</span> <span class="o">=</span> <span class="n">PHYPayload</span><span class="p">{</span>
	        <span class="n">mhdr</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
	        <span class="n">mac_payload</span><span class="p">:</span> <span class="n">JoinRequest</span><span class="p">{</span>
	            <span class="n">join_eui</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
	            <span class="n">dev_eui</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
	            <span class="n">dev_nonce</span><span class="p">:</span> <span class="mi">0</span>
	        <span class="p">},</span>
	        <span class="n">mic</span><span class="p">:</span> <span class="mi">0</span>
	    <span class="p">};</span>

	    <span class="k">let</span> <span class="n">key</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</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">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</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">11</span><span class="p">,</span><span class="mi">12</span><span class="p">,</span><span class="mi">13</span><span class="p">,</span><span class="mi">14</span><span class="p">,</span><span class="mi">15</span><span class="p">];</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="n">payload</span><span class="nf">.calculate_mic</span><span class="p">(</span><span class="o">&amp;</span><span class="n">key</span><span class="p">[</span><span class="o">..</span><span class="p">]));</span>
	<span class="p">}</span>


	<span class="nd">#[derive(Serialize,</span> <span class="nd">Deserialize)]</span>
	<span class="k">struct</span> <span class="n">JoinRequest</span><span class="p">{</span>
	    <span class="n">join_eui</span><span class="p">:</span><span class="nb">u64</span><span class="p">,</span>
	    <span class="n">dev_eui</span><span class="p">:</span><span class="nb">u64</span><span class="p">,</span>
	    <span class="n">dev_nonce</span><span class="p">:</span><span class="nb">u16</span>
	<span class="p">}</span>

	<span class="nd">#[derive(Serialize,</span> <span class="nd">Deserialize)]</span>
	<span class="k">struct</span> <span class="n">PHYPayload</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">{</span>
	    <span class="n">mhdr</span><span class="p">:</span><span class="nb">u8</span><span class="p">,</span>
	    <span class="n">mac_payload</span><span class="p">:</span><span class="n">T</span><span class="p">,</span>
	    <span class="n">mic</span><span class="p">:</span><span class="nb">u32</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="n">PHYPayload</span><span class="o">&lt;</span><span class="n">JoinRequest</span><span class="o">&gt;</span> <span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">calculate_mic</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span><span class="o">&amp;</span><span class="p">[</span><span class="nb">u8</span><span class="p">])</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u8</span><span class="o">&gt;</span><span class="p">,</span> <span class="o">&amp;</span><span class="nb">str</span><span class="o">&gt;</span><span class="p">{</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">serializedPayload</span> <span class="o">=</span> <span class="nn">bincode</span><span class="p">::</span><span class="nf">serialize</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="py">.mhdr</span><span class="p">)</span>
	            <span class="nf">.expect</span><span class="p">(</span><span class="s">"Failed to serialize MHDR."</span><span class="p">);</span>
	        <span class="n">serializedPayload</span><span class="nf">.append</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="nn">bincode</span><span class="p">::</span><span class="nf">serialize</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="py">.mac_payload</span><span class="p">)</span>
	            <span class="nf">.expect</span><span class="p">(</span><span class="s">"Failed to serialize MAC Payload."</span><span class="p">));</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">mac</span> <span class="o">=</span> <span class="nn">Cmac</span><span class="p">::</span><span class="o">&lt;</span><span class="n">Aes128</span><span class="o">&gt;</span><span class="p">::</span><span class="nf">new_from_slice</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
	            <span class="nf">.expect</span><span class="p">(</span><span class="s">"Bad AES128 Key."</span><span class="p">);</span>
	        <span class="n">mac</span><span class="nf">.update</span><span class="p">(</span><span class="o">&amp;</span><span class="n">serializedPayload</span><span class="p">[</span><span class="o">..</span><span class="p">]);</span>
	        <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="n">mac</span><span class="nf">.finalize</span><span class="p">();</span>
	        <span class="k">let</span> <span class="n">tag_bytes</span> <span class="o">=</span> <span class="n">result</span><span class="nf">.into_bytes</span><span class="p">();</span>
	        <span class="nf">Ok</span><span class="p">(</span><span class="nn">Vec</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="o">&amp;</span><span class="n">tag_bytes</span><span class="p">[</span><span class="mi">0</span><span class="o">..</span><span class="mi">4</span><span class="p">]))</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	</code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/calculateUplinkDataMIC">github</a> and <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=d83dca9689ce65752d0f93a3544e458a">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 11/100 - Christmas carol</title><link href="https://maebli.github.io/archive/2021-10-27-100rust-11/" rel="alternate" type="text/html" title="Rust challenge 11/100 - Christmas carol" /><published>2021-10-28T20:00:00+00:00</published><updated>2021-10-28T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-11</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-27-100rust-11/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this">What is this?</a></li>
      <li><a href="#11th-challenge">11th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<p>I posting this a little late, and I’m posting a challange I’ve had up my sleeve. Keeping up the pace of daily challanges is not easy.</p>

<h2 id="11th-challenge">11th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<ul>
  <li>Print the lyrics to the Christmas carol “The Twelve Days of Christmas,” taking advantage of the repetition in the song. - <a href="https://doc.rust-lang.org/book/ch03-05-control-flow.html#summary">Offical Rust Documentation</a></li>
</ul>

<h3 id="solution">Solution</h3>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">const</span> <span class="n">PLACINGS</span><span class="p">:</span><span class="o">&amp;</span><span class="p">[</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">]</span><span class="o">=&amp;</span><span class="p">[</span><span class="s">"first"</span><span class="p">,</span><span class="s">"second"</span><span class="p">,</span><span class="s">"third"</span><span class="p">,</span><span class="s">"fourth"</span><span class="p">,</span><span class="s">"fifth"</span><span class="p">,</span><span class="s">"sixth"</span><span class="p">,</span><span class="s">"seventh"</span><span class="p">,</span><span class="s">"eigth"</span><span class="p">,</span><span class="s">"nineth"</span><span class="p">,</span><span class="s">"tenth"</span><span class="p">,</span><span class="s">"eleventh"</span><span class="p">,</span><span class="s">"twelth"</span><span class="p">];</span>
	    <span class="k">const</span> <span class="n">NUMBERS</span><span class="p">:</span><span class="o">&amp;</span><span class="p">[</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">]</span><span class="o">=&amp;</span><span class="p">[</span><span class="s">"One"</span><span class="p">,</span><span class="s">"Two"</span><span class="p">,</span><span class="s">"Three"</span><span class="p">,</span><span class="s">"Four"</span><span class="p">,</span><span class="s">"Five"</span><span class="p">,</span><span class="s">"Six"</span><span class="p">,</span><span class="s">"Seven"</span><span class="p">,</span><span class="s">"Eight"</span><span class="p">,</span><span class="s">"Nine"</span><span class="p">,</span><span class="s">"Ten"</span><span class="p">,</span><span class="s">"Eleven"</span><span class="p">,</span><span class="s">"Twelve"</span><span class="p">];</span>
	    <span class="k">const</span> <span class="n">THINGS</span><span class="p">:</span><span class="o">&amp;</span><span class="p">[</span><span class="o">&amp;</span><span class="nb">str</span><span class="p">]</span><span class="o">=&amp;</span><span class="p">[</span><span class="s">"Partridge in a pear tree "</span><span class="p">,</span><span class="s">"Turtle doves "</span><span class="p">,</span><span class="s">"French hens"</span><span class="p">,</span>
	                            <span class="s">"Collie birds"</span><span class="p">,</span><span class="s">"Golden rings"</span><span class="p">,</span><span class="s">"Geese a-laying"</span><span class="p">,</span><span class="s">"Swans a-swimming "</span><span class="p">,</span><span class="s">"Maids a-milking"</span><span class="p">,</span>
	                            <span class="s">"Pipers piping "</span><span class="p">,</span><span class="s">"Drummers drumming "</span><span class="p">,</span><span class="s">"Lords a-leaping "</span><span class="p">,</span><span class="s">"Ladies dancing "</span><span class="p">];</span>

	   <span class="k">for</span> <span class="n">num</span> <span class="k">in</span> <span class="mi">1</span><span class="o">..</span><span class="mi">12</span><span class="p">{</span>
	        <span class="nd">println!</span><span class="p">(</span><span class="s">"On the {} day of Christmas my true love gave to me"</span><span class="p">,</span><span class="n">PLACINGS</span><span class="p">[</span><span class="n">num</span><span class="p">]);</span>
	        <span class="k">for</span> <span class="n">x</span> <span class="k">in</span> <span class="p">(</span><span class="mi">1</span><span class="o">..</span><span class="p">(</span><span class="n">num</span><span class="p">))</span><span class="nf">.rev</span><span class="p">()</span> <span class="p">{</span>
	            <span class="nd">println!</span><span class="p">(</span><span class="s">"{} {}"</span><span class="p">,</span><span class="n">NUMBERS</span><span class="p">[</span><span class="n">x</span><span class="p">],</span><span class="n">THINGS</span><span class="p">[</span><span class="n">x</span><span class="p">]);</span>
	        <span class="p">}</span>

	        <span class="k">match</span> <span class="n">num</span> <span class="p">{</span>
	            <span class="mi">1</span> <span class="k">=&gt;</span> <span class="nd">print!</span><span class="p">(</span><span class="s">"A "</span><span class="p">),</span>
	            <span class="n">_</span> <span class="k">=&gt;</span> <span class="nd">print!</span><span class="p">(</span><span class="s">"And a "</span><span class="p">)</span>
	        <span class="p">}</span>
	        <span class="nd">println!</span><span class="p">(</span><span class="s">"{}</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">THINGS</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
	   <span class="p">}</span>
	<span class="p">}</span>

	</code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/xmas">github</a> and <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=997901895e560d3cf95d0dc5020b4d46">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 10/100 - Queue Port</title><link href="https://maebli.github.io/archive/2021-10-27-100rust-10/" rel="alternate" type="text/html" title="Rust challenge 10/100 - Queue Port" /><published>2021-10-27T20:00:00+00:00</published><updated>2021-10-27T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-10</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-27-100rust-10/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this">What is this?</a></li>
  <li><a href="#10th-challenge">10th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution">Solution</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<p>Up until now I have given my self small challenge to solve. It seems to me that I am doing to tasks, learning Rust but also solving problems. My initial aim however was to learn Rust. To try and improve the focus of my endeavor lets try re-writing existing code instead of solving a problem and writing new code.</p>

<h2 id="10th-challenge">10th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<ul>
  <li>port the <a href="https://github.com/fragglet/c-algorithms/blob/master/src/queue.c">queue implementation in c</a> to Rust.</li>
</ul>

<h3 id="solution">Solution</h3>

<p>So I started with this and it became apparent that it was maybe not really a suitable translation challenge. After
so trying back and forward I had a look at the 	<a href="https://doc.rust-lang.org/src/alloc/collections/linked_list.rs.html#47-52"><code class="language-plaintext highlighter-rouge">std::collections</code> implementation</a> and came across the following note:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>// NOTE: It is almost always better to use `Vec` or `VecDeque` because
/// array-based containers are generally faster,
/// more memory efficient, and make better use of CPU cache.
</code></pre></div></div>

<p>Note the Rust implementation uses the type <code class="language-plaintext highlighter-rouge">NonNull</code> and the <code class="language-plaintext highlighter-rouge">NonNull</code> documentation says to use <code class="language-plaintext highlighter-rouge">*mut T</code>
as this is guaranteed to never be Null. If we look further, the implementation is done using <code class="language-plaintext highlighter-rouge">unsafe</code> which
is not something I would like to do right now. Part of the reason I’m learning Rust is so my code may be safe. 
Therefore I will just create a wrapper with the same API as the code I’m trying to translate.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">collections</span><span class="p">::</span><span class="n">VecDeque</span><span class="p">;</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">q</span><span class="p">:</span><span class="n">Queue</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;=</span><span class="nn">Queue</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
	    <span class="k">let</span> <span class="n">e1</span><span class="p">:</span><span class="n">QueueEntry</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">QueueEntry</span><span class="p">{</span> <span class="n">data</span><span class="p">:</span> <span class="mi">3</span> <span class="p">};</span>

	    <span class="nd">assert!</span><span class="p">(</span><span class="n">q</span><span class="nf">.is_empty</span><span class="p">());</span>

	    <span class="n">q</span><span class="nf">.push_head</span><span class="p">(</span><span class="n">e1</span><span class="p">);</span>
	    <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">q</span><span class="nf">.peek_head</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="py">.data</span><span class="p">,</span><span class="mi">3</span><span class="p">);</span>
	    <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">q</span><span class="nf">.pop_head</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="py">.data</span><span class="p">,</span><span class="mi">3</span><span class="p">);</span>

	    <span class="k">let</span> <span class="n">e1</span> <span class="o">=</span> <span class="n">QueueEntry</span><span class="p">{</span> <span class="n">data</span><span class="p">:</span> <span class="mi">4</span> <span class="p">};</span>
	    <span class="n">q</span><span class="nf">.push_tail</span><span class="p">(</span><span class="n">e1</span><span class="p">);</span>

	    <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">q</span><span class="nf">.peek_tail</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="py">.data</span><span class="p">,</span><span class="mi">4</span><span class="p">);</span>
	    <span class="nd">assert_eq!</span><span class="p">(</span><span class="n">q</span><span class="nf">.pop_tail</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()</span><span class="py">.data</span><span class="p">,</span><span class="mi">4</span><span class="p">);</span>

	    <span class="n">q</span><span class="nf">.free</span><span class="p">();</span>

	    <span class="nd">assert!</span><span class="p">(</span><span class="n">q</span><span class="nf">.is_empty</span><span class="p">());</span>

	<span class="p">}</span>

	<span class="k">struct</span> <span class="n">QueueEntry</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">{</span>
	    <span class="n">data</span><span class="p">:</span><span class="n">T</span><span class="p">,</span>
	<span class="p">}</span>

	<span class="k">struct</span> <span class="n">Queue</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">{</span>
	    <span class="n">data</span><span class="p">:</span><span class="n">VecDeque</span><span class="o">&lt;</span><span class="n">QueueEntry</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">Queue</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="p">{</span>

	    <span class="k">fn</span> <span class="nf">free</span> <span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">){</span>
	        <span class="k">self</span><span class="py">.data</span><span class="nf">.clear</span><span class="p">();</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">push_head</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span><span class="n">entry</span><span class="p">:</span><span class="n">QueueEntry</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">){</span>
	        <span class="k">self</span><span class="py">.data</span><span class="nf">.push_back</span><span class="p">(</span><span class="n">entry</span><span class="p">);</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">pop_head</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Option</span><span class="o">&lt;</span><span class="n">QueueEntry</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;</span> <span class="p">{</span>
	        <span class="k">self</span><span class="py">.data</span><span class="nf">.pop_back</span><span class="p">()</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">peek_head</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Option</span><span class="o">&lt;&amp;</span><span class="n">QueueEntry</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;</span> <span class="p">{</span>
	        <span class="k">self</span><span class="py">.data</span><span class="nf">.back</span><span class="p">()</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">push_tail</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span><span class="n">entry</span><span class="p">:</span><span class="n">QueueEntry</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">){</span>
	        <span class="k">self</span><span class="py">.data</span><span class="nf">.push_front</span><span class="p">(</span><span class="n">entry</span><span class="p">);</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">pop_tail</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Option</span><span class="o">&lt;</span><span class="n">QueueEntry</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;</span><span class="p">{</span>
	        <span class="k">self</span><span class="py">.data</span><span class="nf">.pop_front</span><span class="p">()</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">peek_tail</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Option</span><span class="o">&lt;&amp;</span><span class="n">QueueEntry</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;</span><span class="p">{</span>
	        <span class="k">self</span><span class="py">.data</span><span class="nf">.back</span><span class="p">()</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">is_empty</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">bool</span> <span class="p">{</span>
	        <span class="k">self</span><span class="py">.data</span><span class="nf">.is_empty</span><span class="p">()</span>
	    <span class="p">}</span>

	    <span class="k">fn</span> <span class="nf">new</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="n">Queue</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">{</span>
	        <span class="n">Queue</span><span class="p">{</span>
	            <span class="n">data</span><span class="p">:</span> <span class="nn">Default</span><span class="p">::</span><span class="nf">default</span><span class="p">()</span>
	        <span class="p">}</span>
	    <span class="p">}</span>
	<span class="p">}</span>


	</code></pre></figure>

<p>I feel like this was a relatively valuable lesson. I will try to keep up with this translating code challenge method and see how it goes.</p>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/queue">github</a> and <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=31d04ee6782ad6aa7ab258eb770406af">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 9/100 - Celcius to Farenheit</title><link href="https://maebli.github.io/archive/2021-10-26-100rust-9/" rel="alternate" type="text/html" title="Rust challenge 9/100 - Celcius to Farenheit" /><published>2021-10-26T20:00:00+00:00</published><updated>2021-10-26T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-9</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-26-100rust-9/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this">What is this?</a></li>
  <li><a href="#9th-challenge">9th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution">Solution</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="9th-challenge">9th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today’s challenge is converting celcius to fahrenheit, reading the input from the command-line. Its a challenge taken from Rust’s official documentation.</p>

<h3 id="solution">Solution</h3>

<p>This is my solution:</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">	use std::io<span class="p">;</span>

	fn main<span class="o">()</span> <span class="o">{</span>

	    <span class="nb">let </span>mut temp <span class="o">=</span> String::new<span class="o">()</span><span class="p">;</span>

	    println!<span class="o">(</span><span class="s2">"enter °C value to be converted to Fahrenheit:"</span><span class="o">)</span><span class="p">;</span>

	    io::stdin<span class="o">()</span>.read_line<span class="o">(</span>&amp; mut temp<span class="o">)</span>.expect<span class="o">(</span><span class="s2">"oops"</span><span class="o">)</span><span class="p">;</span>

	    <span class="nb">let </span>temp:f32 <span class="o">=</span> temp.trim<span class="o">()</span>.parse<span class="o">()</span>.expect<span class="o">(</span><span class="s2">"failed to parse"</span><span class="o">)</span><span class="p">;</span>

	    println!<span class="o">(</span><span class="s2">"{}°C =  {} Fahrenheit"</span>,temp,celcius_to_fahrenheit<span class="o">(</span>temp<span class="o">))</span><span class="p">;</span>

	<span class="o">}</span>

	fn celcius_to_fahrenheit<span class="o">(</span>celclius: f32<span class="o">)</span> -&gt; f32 <span class="o">{</span>
	    celclius<span class="k">*</span>1.8+32.0
	<span class="o">}</span>
	</code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/celcius2fahrenheit">github</a> and <a href="https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2021&amp;gist=cd5d5c3fe7214b2a716d002551bad226">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 8/100 - Math Tree Generator</title><link href="https://maebli.github.io/archive/2021-10-25-100rust-8/" rel="alternate" type="text/html" title="Rust challenge 8/100 - Math Tree Generator" /><published>2021-10-25T20:00:00+00:00</published><updated>2021-10-25T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-8</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-25-100rust-8/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this">What is this?</a></li>
  <li><a href="#8th-challenge">8th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution">Solution</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="8th-challenge">8th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>For helping teachers generate math problems for students, this script must generate math problems with</p>

<ul>
  <li>Operators <code class="language-plaintext highlighter-rouge">+,-,*</code></li>
  <li>Totals and sub totals must be in range <code class="language-plaintext highlighter-rouge">[0,100]</code></li>
  <li>Tree may have a depth of 1,2 or 3</li>
  <li>Solution and problem must be generated</li>
  <li>To generate the structures <a href="http://viz-js.com/">Viz-JS</a> shall be used</li>
</ul>

<p>example:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>digraph G {
"1" -&gt; "+"
"2" -&gt; "+"
"+" -&gt; "3"
}
</code></pre></div></div>

<h3 id="solution">Solution</h3>

<p>Here is my solution, didn’t quite finish, might continue tomorrow if I feel like it. Division is not yet done and a depth of more than 1 of the tree is not supported.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">rand</span><span class="p">::</span><span class="n">Rng</span><span class="p">;</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">rng</span> <span class="o">=</span> <span class="nn">rand</span><span class="p">::</span><span class="nf">thread_rng</span><span class="p">();</span>
	    <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="n">rng</span><span class="nf">.gen_range</span><span class="p">(</span><span class="mi">0</span><span class="o">..</span><span class="mi">100</span><span class="p">);</span>
	    <span class="k">let</span> <span class="n">t1</span> <span class="o">=</span> <span class="nf">generate_tree</span><span class="p">(</span><span class="n">a</span><span class="p">);</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"digraph G );
	    print_tree(a,t1);
	    println!("</span><span class="p">);</span>
	<span class="p">}</span>


	<span class="k">fn</span> <span class="nf">print_tree</span><span class="p">(</span><span class="n">root</span><span class="p">:</span><span class="nb">i32</span><span class="p">,</span><span class="n">tree</span><span class="p">:(</span><span class="nb">i32</span><span class="p">,</span><span class="nb">char</span><span class="p">,</span><span class="nb">i32</span><span class="p">)){</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"</span><span class="se">\"</span><span class="s">{}</span><span class="se">\"</span><span class="s">-&gt;</span><span class="se">\"</span><span class="s">{}</span><span class="se">\"</span><span class="s">"</span><span class="p">,</span><span class="n">tree</span><span class="na">.0</span><span class="p">,</span><span class="n">tree</span><span class="na">.1</span><span class="p">);</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"</span><span class="se">\"</span><span class="s">{}</span><span class="se">\"</span><span class="s">-&gt;</span><span class="se">\"</span><span class="s">{}</span><span class="se">\"</span><span class="s">"</span><span class="p">,</span><span class="n">tree</span><span class="na">.2</span><span class="p">,</span><span class="n">tree</span><span class="na">.1</span><span class="p">);</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"</span><span class="se">\"</span><span class="s">{}</span><span class="se">\"</span><span class="s">-&gt;</span><span class="se">\"</span><span class="s">{}</span><span class="se">\"</span><span class="s">"</span><span class="p">,</span><span class="n">tree</span><span class="na">.1</span><span class="p">,</span><span class="n">root</span><span class="p">);</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">generate_tree</span><span class="p">(</span><span class="n">seed</span><span class="p">:</span><span class="nb">i32</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="p">(</span><span class="nb">i32</span><span class="p">,</span><span class="nb">char</span><span class="p">,</span><span class="nb">i32</span><span class="p">)</span> <span class="p">{</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">rng</span> <span class="o">=</span> <span class="nn">rand</span><span class="p">::</span><span class="nf">thread_rng</span><span class="p">();</span>
	    <span class="k">let</span> <span class="n">operators</span> <span class="o">=</span> <span class="p">[</span><span class="sc">'+'</span><span class="p">,</span><span class="sc">'-'</span><span class="p">,</span><span class="sc">'*'</span><span class="p">];</span>

	    <span class="k">let</span> <span class="n">operator</span> <span class="o">=</span> <span class="n">operators</span><span class="p">[</span><span class="n">rng</span><span class="nf">.gen_range</span><span class="p">(</span><span class="mi">0</span><span class="o">..</span><span class="n">operators</span><span class="nf">.len</span><span class="p">())];</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">operator1</span><span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">operator2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

	    <span class="k">match</span> <span class="n">operator</span> <span class="p">{</span>
	        <span class="sc">'+'</span> <span class="k">=&gt;</span> <span class="p">{</span>
	            <span class="n">operator1</span> <span class="o">=</span> <span class="n">rng</span><span class="nf">.gen_range</span><span class="p">(</span><span class="mi">0</span><span class="o">..</span><span class="n">seed</span><span class="p">);</span>
	            <span class="n">operator2</span> <span class="o">=</span> <span class="n">seed</span> <span class="o">-</span> <span class="n">operator1</span><span class="p">;</span>
	        <span class="p">},</span>
	        <span class="sc">'-'</span> <span class="k">=&gt;</span> <span class="p">{</span>
	            <span class="n">operator1</span> <span class="o">=</span> <span class="n">rng</span><span class="nf">.gen_range</span><span class="p">(</span><span class="n">seed</span><span class="o">..</span><span class="mi">100</span><span class="p">);</span>
	            <span class="n">operator2</span> <span class="o">=</span> <span class="n">seed</span> <span class="o">-</span> <span class="n">operator2</span><span class="p">;</span>
	        <span class="p">},</span>
	        <span class="sc">'*'</span> <span class="k">=&gt;</span> <span class="p">{</span>
	            <span class="n">operator1</span><span class="o">=</span><span class="nf">find_a_random_factor</span><span class="p">(</span><span class="n">seed</span><span class="p">);</span>
	            <span class="n">operator2</span><span class="o">=</span><span class="n">seed</span><span class="o">/</span><span class="n">operator1</span><span class="p">;</span>
	        <span class="p">}</span>
	        <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{}</span>
	    <span class="p">}</span>

	    <span class="p">(</span><span class="n">operator1</span><span class="p">,</span><span class="n">operator</span><span class="p">,</span><span class="n">operator2</span><span class="p">)</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">find_a_random_factor</span><span class="p">(</span><span class="n">num</span><span class="p">:</span><span class="nb">i32</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">i32</span><span class="p">{</span>

	    <span class="k">let</span> <span class="k">mut</span> <span class="n">rng</span> <span class="o">=</span> <span class="nn">rand</span><span class="p">::</span><span class="nf">thread_rng</span><span class="p">();</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span>
	    <span class="k">while</span> <span class="n">num</span> <span class="o">%</span> <span class="n">x</span> <span class="o">!=</span><span class="mi">0</span> <span class="p">{</span>
	        <span class="n">x</span> <span class="o">=</span> <span class="n">rng</span><span class="nf">.gen_range</span><span class="p">(</span><span class="mi">1</span><span class="o">..</span><span class="p">((</span><span class="n">num</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">));</span>
	    <span class="p">}</span>
	    <span class="k">return</span> <span class="n">x</span><span class="p">;</span>
	<span class="p">}</span></code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/math-tree">github</a> and <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=2fbdaef1827d2eb2c93346fb3f91effa">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 7/100 - Fibonacci</title><link href="https://maebli.github.io/archive/2021-10-24-100rust-7/" rel="alternate" type="text/html" title="Rust challenge 7/100 - Fibonacci" /><published>2021-10-24T20:00:00+00:00</published><updated>2021-10-24T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-7</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-24-100rust-7/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this">What is this?</a></li>
  <li><a href="#7th-challenge">7th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution">Solution</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="7th-challenge">7th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I will solve of of the the challange provided by the rust documentation - a classic - to calculate the nth fibonacci element.</p>

<h3 id="solution">Solution</h3>

<p>Here is my solution.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">cmp</span><span class="p">::</span><span class="n">Ordering</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">time</span><span class="p">::</span><span class="n">Instant</span><span class="p">;</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">num</span> <span class="o">=</span> <span class="mi">150</span><span class="p">;</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">before</span> <span class="o">=</span> <span class="nn">Instant</span><span class="p">::</span><span class="nf">now</span><span class="p">();</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"Nth fib = {}"</span><span class="p">,</span><span class="nf">nth_fib_recursive</span><span class="p">(</span><span class="n">num</span><span class="p">));</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">after</span> <span class="o">=</span> <span class="nn">Instant</span><span class="p">::</span><span class="nf">now</span><span class="p">();</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">after</span><span class="nf">.checked_duration_since</span><span class="p">(</span><span class="n">before</span><span class="p">));</span>

	    <span class="n">before</span> <span class="o">=</span> <span class="nn">Instant</span><span class="p">::</span><span class="nf">now</span><span class="p">();</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"Nth fib recursive = {}"</span><span class="p">,</span><span class="nf">nth_fib</span><span class="p">(</span><span class="n">num</span><span class="p">));</span>
	    <span class="n">after</span> <span class="o">=</span> <span class="nn">Instant</span><span class="p">::</span><span class="nf">now</span><span class="p">();</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">after</span><span class="nf">.checked_duration_since</span><span class="p">(</span><span class="n">before</span><span class="p">));</span>

	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">nth_fib_recursive</span><span class="p">(</span><span class="n">n</span><span class="p">:</span><span class="nb">u128</span><span class="p">)</span> <span class="k">-&gt;</span>  <span class="nb">u128</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">x</span><span class="p">:</span><span class="nb">u128</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
	    <span class="k">match</span> <span class="n">n</span><span class="nf">.cmp</span><span class="p">(</span><span class="o">&amp;</span> <span class="n">x</span><span class="p">){</span>
	        <span class="nn">Ordering</span><span class="p">::</span><span class="n">Less</span> <span class="k">=&gt;</span> <span class="mi">1</span><span class="p">,</span>
	        <span class="nn">Ordering</span><span class="p">::</span><span class="n">Equal</span> <span class="k">=&gt;</span> <span class="mi">2</span><span class="p">,</span>
	        <span class="nn">Ordering</span><span class="p">::</span><span class="n">Greater</span> <span class="k">=&gt;</span> <span class="nf">nth_fib</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="nf">nth_fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">),</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">nth_fib</span><span class="p">(</span><span class="n">n</span><span class="p">:</span><span class="nb">u128</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u128</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="mi">1</span>
	    <span class="p">}</span><span class="k">else</span> <span class="k">if</span> <span class="n">n</span><span class="o">==</span><span class="mi">2</span> <span class="p">{</span>
	        <span class="mi">2</span>
	    <span class="p">}</span><span class="k">else</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">xn_1</span><span class="p">:</span><span class="nb">u128</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">xn_2</span><span class="p">:</span><span class="nb">u128</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">temp</span><span class="p">:</span><span class="nb">u128</span><span class="p">;</span>
	        <span class="k">for</span> <span class="n">_num</span> <span class="k">in</span> <span class="mi">2</span><span class="o">..</span><span class="n">n</span> <span class="p">{</span>
	            <span class="n">temp</span> <span class="o">=</span> <span class="n">xn_1</span><span class="p">;</span>
	            <span class="n">xn_1</span> <span class="o">=</span> <span class="n">xn_1</span> <span class="o">+</span> <span class="n">xn_2</span><span class="p">;</span>
	            <span class="n">xn_2</span> <span class="o">=</span> <span class="n">temp</span><span class="p">;</span>
	        <span class="p">}</span>
	        <span class="n">xn_1</span>
	    <span class="p">}</span>
	<span class="p">}</span></code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/fibonacci">github</a> and <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=e851d7e7e21c1957293ff8b8339f1b77">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 6/100- Insertion Sort</title><link href="https://maebli.github.io/archive/2021-10-22-100rust-6/" rel="alternate" type="text/html" title="Rust challenge 6/100- Insertion Sort" /><published>2021-10-23T20:00:00+00:00</published><updated>2021-10-23T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-6</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-22-100rust-6/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this">What is this?</a></li>
      <li><a href="#6th-challenge">6th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="6th-challenge">6th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I will try to sort a set of integers from smallest to biggest using recursion.</p>

<h3 id="solution">Solution</h3>

<p>Here is my solution.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">sort</span><span class="p">(</span><span class="n">unsorted</span><span class="p">:</span><span class="o">&amp;</span><span class="p">[</span><span class="nb">i32</span><span class="p">])</span> <span class="k">-&gt;</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span><span class="p">{</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">sorted</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">i32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>

	    <span class="k">if</span> <span class="n">unsorted</span><span class="nf">.len</span><span class="p">()</span> <span class="o">==</span> <span class="mi">1</span> <span class="p">{</span>
	       <span class="n">sorted</span><span class="nf">.push</span><span class="p">(</span><span class="n">unsorted</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
	    <span class="p">}</span><span class="k">else</span> <span class="p">{</span>
	        <span class="n">sorted</span> <span class="o">=</span> <span class="nf">sort</span><span class="p">(</span><span class="o">&amp;</span><span class="n">unsorted</span><span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="p">]);</span>

	        <span class="k">for</span> <span class="n">x</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">sorted</span><span class="nf">.len</span><span class="p">()</span> <span class="p">{</span>
	            <span class="k">if</span> <span class="n">unsorted</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">sorted</span><span class="nf">.as_slice</span><span class="p">()[</span><span class="n">x</span><span class="p">]</span> <span class="p">{</span>
	                <span class="n">sorted</span><span class="nf">.insert</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">unsorted</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
	                <span class="k">break</span><span class="p">;</span>
	            <span class="p">}</span><span class="k">else</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="n">sorted</span><span class="nf">.len</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">{</span>
	                <span class="n">sorted</span><span class="nf">.push</span><span class="p">(</span><span class="n">unsorted</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
	            <span class="p">}</span>
	        <span class="p">}</span>
	    <span class="p">}</span>

	    <span class="n">sorted</span>
	<span class="p">}</span>

	<span class="nd">#[test]</span>
	<span class="k">fn</span> <span class="nf">test_sort</span><span class="p">(){</span>
	    <span class="k">let</span> <span class="n">unsorted</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span><span class="mi">9</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="o">-</span><span class="mi">4</span><span class="p">,</span> <span class="o">-</span><span class="mi">99999</span><span class="p">];</span>
	    <span class="k">let</span> <span class="n">sorted</span> <span class="o">=</span> <span class="nd">vec!</span><span class="p">[</span><span class="o">-</span><span class="mi">99999</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span><span class="p">,</span><span class="mi">9</span><span class="p">,</span><span class="mi">28</span><span class="p">];</span>
	    <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">sort</span><span class="p">(</span><span class="o">&amp;</span><span class="n">unsorted</span><span class="p">),</span><span class="n">sorted</span><span class="p">);</span>
	<span class="p">}</span>
	</code></pre></figure>

<p>See <a href="https://github.com/maebli/100rustsnippets/tree/master/sorter">github</a> and <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=eef058b0c37a02823a396c173354d526">playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 5/100 - Sentence Counter</title><link href="https://maebli.github.io/archive/2021-10-22-100rust-5/" rel="alternate" type="text/html" title="Rust challenge 5/100 - Sentence Counter" /><published>2021-10-22T20:00:00+00:00</published><updated>2021-10-22T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-5</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-22-100rust-5/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this">What is this?</a></li>
  <li><a href="#5th-challenge">5th Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution">Solution</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="5th-challenge">5th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Today I want something simple. Count the number of valid English sentences in a string.</p>

<p>A sentence, for the sake of this challenge, is defined as follows:</p>

<ul>
  <li>a String starting with an Uppercase letter <strong>and</strong></li>
  <li>ending in a question, exclamation or period</li>
</ul>

<h3 id="solution">Solution</h3>

<p>OK this was very easy</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">alice_in_wonderland</span> <span class="o">=</span>
	        <span class="nn">reqwest</span><span class="p">::</span><span class="nn">blocking</span><span class="p">::</span><span class="nf">get</span><span class="p">(</span><span class="s">"https://www.gutenberg.org/files/11/11-0.txt"</span><span class="p">);</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">" sentence count for alice in wonderland:{}"</span><span class="p">,</span>
	             <span class="nf">count_sentences</span><span class="p">(</span><span class="o">&amp;</span><span class="n">alice_in_wonderland</span><span class="nf">.unwrap</span><span class="p">()</span><span class="nf">.text</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">()));</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">count_sentences</span><span class="p">(</span><span class="n">text</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">String</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u32</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="k">mut</span> <span class="n">sentence_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	    <span class="k">for</span> <span class="n">c</span> <span class="k">in</span> <span class="n">text</span><span class="nf">.chars</span><span class="p">(){</span>
	        <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
	            <span class="sc">'!'</span> <span class="p">|</span> <span class="sc">'?'</span><span class="p">|</span><span class="sc">'.'</span><span class="k">=&gt;</span> <span class="n">sentence_count</span><span class="o">+=</span><span class="mi">1</span><span class="p">,</span>
	            <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">()</span>
	        <span class="p">}</span>
	    <span class="p">}</span>
	    <span class="n">sentence_count</span>
	<span class="p">}</span>

	<span class="nd">#[test]</span>
	<span class="k">fn</span> <span class="nf">test_count_sentences</span><span class="p">(){</span>
	    <span class="c1">// source : https://www.gutenberg.org/files/11/11-0.txt</span>
	    <span class="k">let</span> <span class="n">txt</span> <span class="o">=</span> <span class="nn">String</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="s">"Alice was beginning to get very tired of sitting by
	    her sister on the bank, and of having nothing to do: once or twice she
	    had peeped into the book her sister was reading, but it had no pictures or
	    conversations in it, “and what is the use of a book,” thought Alice
	    “without pictures or conversations?”

	    So she was considering in her own mind (as well as she could, for the
	    hot day made her feel very sleepy and stupid), whether the pleasure of
	    making a daisy-chain would be worth the trouble of getting up and
	    picking the daisies, when suddenly a White Rabbit with pink eyes ran
	    close by her.

	    There was nothing so _very_ remarkable in that; nor did Alice think it
	    so _very_ much out of the way to hear the Rabbit say to itself, “Oh
	    dear! Oh dear! I shall be late!” (when she thought it over afterwards,
	    it occurred to her that she ought to have wondered at this, but at the
	    time it all seemed quite natural); but when the Rabbit actually _took a
	    watch out of its waistcoat-pocket_, and looked at it, and then hurried
	    on, Alice started to her feet, for it flashed across her mind that she
	    had never before seen a rabbit with either a waistcoat-pocket, or a
	    watch to take out of it, and burning with curiosity, she ran across the
	    field after it, and fortunately was just in time to see it pop down a
	    large rabbit-hole under the hedge."</span><span class="p">);</span>

	    <span class="nd">assert_eq!</span><span class="p">(</span><span class="nf">count_sentences</span><span class="p">(</span><span class="o">&amp;</span><span class="n">txt</span><span class="p">),</span><span class="mi">6</span><span class="p">)</span>
	<span class="p">}</span>
	</code></pre></figure>

<p>Find the source on <a href="https://github.com/maebli/100rustsnippets/tree/master/sentence-counter">github</a> and see it on <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=ae3457d32ba375e90d5c2b09983d81d9">rust playground</a>. Note it seems to be not working on playground, not sure why as it works locally.</p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 4/100 - LoRaWAN PHYPayload Join-Request Parsing</title><link href="https://maebli.github.io/archive/2021-10-19-100rust-4/" rel="alternate" type="text/html" title="Rust challenge 4/100 - LoRaWAN PHYPayload Join-Request Parsing" /><published>2021-10-21T20:00:00+00:00</published><updated>2021-10-21T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-4</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-19-100rust-4/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this">What is this?</a></li>
      <li><a href="#4th-challenge">4th Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a>
            <ul>
              <li><a href="#mic-calculation">MIC Calculation</a></li>
            </ul>
          </li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="4th-challenge">4th Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Write a parser for LoRaWAN PHYPayload of <a href="https://lora-alliance.org/wp-content/uploads/2020/11/lorawantm_specification_-v1.1.pdf">lorawan spec. v1.1</a> Join-Request uplinks.
New to this spec is that the keys are not sent with the join request as was the case for v1.0.x</p>

<table>
  <thead>
    <tr>
      <th>Size (bytes)</th>
      <th>1</th>
      <th>7..M</th>
      <th>4</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>PHYPayload</td>
      <td>MHDR</td>
      <td>MACPayload</td>
      <td>MIC</td>
    </tr>
  </tbody>
</table>

<table>
  <thead>
    <tr>
      <th>Bit #</th>
      <th>7..5</th>
      <th>4..2</th>
      <th>1..0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>MHDRbits</td>
      <td>MType</td>
      <td>RFU</td>
      <td>Major</td>
    </tr>
  </tbody>
</table>

<table>
  <thead>
    <tr>
      <th>MType</th>
      <th>meaning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>000</td>
      <td>Join-request</td>
    </tr>
    <tr>
      <td>001</td>
      <td>Join-accept</td>
    </tr>
    <tr>
      <td>010</td>
      <td>Unconfirmed Data Up</td>
    </tr>
    <tr>
      <td>011</td>
      <td>Unconfirmed Data Down</td>
    </tr>
    <tr>
      <td>100</td>
      <td>Confirmed Data Up</td>
    </tr>
    <tr>
      <td>101</td>
      <td>Confirmed Data Down</td>
    </tr>
    <tr>
      <td>110</td>
      <td>Rejoin-request</td>
    </tr>
    <tr>
      <td>111</td>
      <td>Proprietary</td>
    </tr>
  </tbody>
</table>

<table>
  <thead>
    <tr>
      <th>Size (bytes)</th>
      <th>8</th>
      <th>8</th>
      <th>2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Join-request</td>
      <td>JoinEUI</td>
      <td>DevEUI</td>
      <td>DevNonce</td>
    </tr>
  </tbody>
</table>

<h4 id="mic-calculation">MIC Calculation</h4>

<p>Calculated according to <code class="language-plaintext highlighter-rouge">RFC4493</code></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cmacJoin = aes128_cmac(NwkKey, MHDR | JoinEUI | DevEUI | DevNonce)
MICJoin = cmac[0..3] 
</code></pre></div></div>

<h3 id="solution">Solution</h3>

<p>Checking the MIC was too much work, but the structure was parsed..</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="n">fmt</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">byteorder</span><span class="p">::{</span><span class="n">BigEndian</span><span class="p">,</span> <span class="n">ByteOrder</span><span class="p">};</span>

	<span class="k">struct</span> <span class="n">JoinRequest</span><span class="p">{</span>
	    <span class="n">join_eui</span><span class="p">:</span><span class="nb">u64</span><span class="p">,</span>
	    <span class="n">dev_eui</span><span class="p">:</span><span class="nb">u64</span><span class="p">,</span>
	    <span class="n">dev_nonce</span><span class="p">:</span><span class="nb">u16</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="nn">fmt</span><span class="p">::</span><span class="n">Display</span> <span class="k">for</span> <span class="n">JoinRequest</span><span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">fmt</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">f</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="nn">fmt</span><span class="p">::</span><span class="n">Formatter</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nn">fmt</span><span class="p">::</span><span class="nb">Result</span> <span class="p">{</span>
	        <span class="nd">write!</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s">"deveui:{:#8x},joineui:{:#8x},devnonce:{:#2x}"</span><span class="p">,</span> <span class="k">self</span><span class="py">.dev_eui</span><span class="p">,</span> <span class="k">self</span><span class="py">.join_eui</span><span class="p">,</span> <span class="k">self</span><span class="py">.dev_nonce</span><span class="p">)</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">enum</span> <span class="n">MType</span><span class="p">{</span>
	    <span class="n">JoinRequest</span><span class="p">{</span><span class="n">mhdr</span><span class="p">:</span><span class="nb">u8</span><span class="p">,</span><span class="n">message</span><span class="p">:</span><span class="n">JoinRequest</span><span class="p">,</span><span class="n">mic</span><span class="p">:</span><span class="nb">u32</span><span class="p">},</span>
	    <span class="nf">_JoinAccept</span><span class="p">(),</span>
	    <span class="nf">_UnconfirmedDataUp</span><span class="p">(),</span>
	    <span class="nf">_UnconfirmedDataDown</span><span class="p">(),</span>
	    <span class="nf">_ConfirmedDataUp</span><span class="p">(),</span>
	    <span class="nf">_ConfirmedDataDown</span><span class="p">(),</span>
	    <span class="nf">_RejoinRequest</span><span class="p">(),</span>
	    <span class="nf">_Proprietary</span><span class="p">()</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="n">MType</span><span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">get_major</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Option</span><span class="o">&lt;</span><span class="nb">u8</span><span class="o">&gt;</span> <span class="p">{</span>
	        <span class="k">match</span> <span class="k">self</span><span class="p">{</span>
	            <span class="nn">MType</span><span class="p">::</span><span class="n">JoinRequest</span><span class="p">{</span><span class="n">mhdr</span><span class="p">,</span><span class="o">..</span><span class="p">}</span> <span class="k">=&gt;</span> <span class="nf">Some</span><span class="p">(</span><span class="mi">3</span> <span class="o">&amp;</span> <span class="n">mhdr</span><span class="p">),</span>
	            <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{</span><span class="nd">println!</span><span class="p">(</span><span class="s">"not implemented!"</span><span class="p">);</span> <span class="nb">None</span><span class="p">}</span>
	        <span class="p">}</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="nn">fmt</span><span class="p">::</span><span class="n">Display</span> <span class="k">for</span> <span class="n">MType</span><span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">fmt</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">f</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="nn">fmt</span><span class="p">::</span><span class="n">Formatter</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nn">fmt</span><span class="p">::</span><span class="nb">Result</span> <span class="p">{</span>
	        <span class="k">match</span> <span class="k">self</span><span class="p">{</span>
	            <span class="nn">MType</span><span class="p">::</span><span class="n">JoinRequest</span><span class="p">{</span><span class="n">message</span><span class="p">,</span> <span class="n">mic</span><span class="p">,</span><span class="o">..</span> <span class="p">}</span> <span class="k">=&gt;</span><span class="p">{</span>
	                <span class="nd">write!</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s">"major = {:#02x}, mic = {:#04x}, joinrequest = {}"</span><span class="p">,</span>
	                       <span class="k">self</span><span class="nf">.get_major</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">(),</span> <span class="o">*</span><span class="n">mic</span><span class="p">,</span> <span class="o">*</span><span class="n">message</span>
	                <span class="p">)</span>
	            <span class="p">}</span>
	            <span class="n">_</span> <span class="k">=&gt;</span> <span class="nd">write!</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s">"Error"</span><span class="p">)</span>
	        <span class="p">}</span>
	    <span class="p">}</span>
	<span class="p">}</span>


	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	    <span class="cm">/*
	        Message with MHDR = 01,
	        join eui = 01,02,03,04,05,,06,07,08
	        dev eui = 01,02,03,04,05,06,07,08
	        dev nuance = 00,01
	        mic = 01,02,03,04
	     */</span>

	    <span class="k">let</span> <span class="n">message</span><span class="p">:</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u8</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nd">vec!</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">2</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">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</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">2</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">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span><span class="p">,</span><span class="mi">0</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">2</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="k">let</span> <span class="n">m</span><span class="o">=</span><span class="nf">parse</span><span class="p">(</span><span class="o">&amp;</span><span class="n">message</span><span class="p">);</span>


	    <span class="k">match</span> <span class="n">m</span> <span class="p">{</span>
	        <span class="nb">None</span> <span class="k">=&gt;</span> <span class="nd">println!</span><span class="p">(</span><span class="s">"Failed to parse!"</span><span class="p">),</span>
	        <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{</span>
	            <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span><span class="n">m</span><span class="nf">.unwrap</span><span class="p">())</span>
	        <span class="p">}</span>
	    <span class="p">}</span>


	<span class="p">}</span>


	<span class="k">fn</span> <span class="nf">parse</span><span class="p">(</span><span class="n">message</span><span class="p">:</span><span class="o">&amp;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">u8</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Option</span><span class="o">&lt;</span><span class="n">MType</span><span class="o">&gt;</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">mhdr</span> <span class="o">=</span> <span class="n">message</span><span class="nf">.get</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>

	    <span class="k">match</span> <span class="n">mhdr</span><span class="nf">.unwrap</span><span class="p">()</span><span class="o">&gt;&gt;</span><span class="mi">5</span> <span class="p">{</span>
	        <span class="mi">0</span> <span class="k">=&gt;</span> <span class="nf">Some</span><span class="p">(</span><span class="nn">MType</span><span class="p">::</span><span class="n">JoinRequest</span> <span class="p">{</span>
	            <span class="n">mhdr</span><span class="p">:</span> <span class="o">*</span><span class="n">mhdr</span><span class="nf">.unwrap</span><span class="p">(),</span>
	            <span class="n">message</span><span class="p">:</span> <span class="n">JoinRequest</span> <span class="p">{</span>
	                <span class="n">join_eui</span><span class="p">:</span> <span class="nn">BigEndian</span><span class="p">::</span><span class="nf">read_u64</span><span class="p">(</span><span class="o">&amp;</span><span class="n">message</span><span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="mi">9</span><span class="p">]),</span>
	                <span class="n">dev_eui</span><span class="p">:</span> <span class="nn">BigEndian</span><span class="p">::</span><span class="nf">read_u64</span><span class="p">(</span><span class="o">&amp;</span><span class="n">message</span><span class="p">[</span><span class="mi">9</span><span class="o">..</span><span class="mi">17</span><span class="p">]),</span>
	                <span class="n">dev_nonce</span><span class="p">:</span> <span class="nn">BigEndian</span><span class="p">::</span><span class="nf">read_u16</span><span class="p">(</span><span class="o">&amp;</span><span class="n">message</span><span class="p">[</span><span class="mi">17</span><span class="o">..</span><span class="mi">19</span><span class="p">])</span>
	            <span class="p">},</span>
	            <span class="n">mic</span><span class="p">:</span> <span class="nn">BigEndian</span><span class="p">::</span><span class="nf">read_u32</span><span class="p">(</span><span class="o">&amp;</span><span class="n">message</span><span class="p">[</span><span class="mi">19</span><span class="o">..</span><span class="mi">23</span><span class="p">])</span>
	        <span class="p">}),</span>
	        <span class="n">_</span> <span class="k">=&gt;</span> <span class="nb">None</span>
	    <span class="p">}</span>
	<span class="p">}</span>
	</code></pre></figure>

<p><a href="https://github.com/maebli/100rustsnippets/tree/master/lorawan-uplink-parser">See source on github</a> see running version on <a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=9ca7bc1049c262c70082e4388e7640ec">rust playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 3/100 - Complex Number</title><link href="https://maebli.github.io/archive/2021-10-19-100rust-3/" rel="alternate" type="text/html" title="Rust challenge 3/100 - Complex Number" /><published>2021-10-20T20:00:00+00:00</published><updated>2021-10-20T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-3</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-19-100rust-3/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#what-is-this">What is this?</a></li>
      <li><a href="#3rd-challenge">3rd Challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.</p>

<h2 id="3rd-challenge">3rd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>Create a complex number which can be added, subtracted and multiplied.</p>

<h3 id="solution">Solution</h3>

<p>I chose to do this with operator overloading on a struct type. I forgot about borrowing for a moment and implemented the operators by <code class="language-plaintext highlighter-rouge">value</code> and not by <code class="language-plaintext highlighter-rouge">reference</code> meaning I had to add clone and copy for it to work.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="n">ops</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="n">fmt</span><span class="p">;</span>

	<span class="nd">#[derive(Clone,</span> <span class="nd">Copy)]</span>
	<span class="k">struct</span> <span class="n">ComplexNumber</span> <span class="p">{</span>
	    <span class="n">re</span><span class="p">:</span> <span class="nb">i32</span><span class="p">,</span>
	    <span class="n">im</span><span class="p">:</span> <span class="nb">i32</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="n">ComplexNumber</span> <span class="p">{</span> <span class="n">re</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">im</span><span class="p">:</span> <span class="mi">2</span> <span class="p">};</span>
	    <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="n">ComplexNumber</span> <span class="p">{</span> <span class="n">re</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="n">im</span><span class="p">:</span> <span class="mi">4</span> <span class="p">};</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"({})+({}) = {}"</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</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="nd">println!</span><span class="p">(</span><span class="s">"({})-({}) = {}"</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</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="nd">println!</span><span class="p">(</span><span class="s">"({})*({}) = {}"</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</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="p">}</span>

	<span class="k">impl</span> <span class="nn">ops</span><span class="p">::</span><span class="nb">Add</span><span class="o">&lt;</span><span class="n">ComplexNumber</span><span class="o">&gt;</span> <span class="k">for</span> <span class="n">ComplexNumber</span> <span class="p">{</span>
	    <span class="k">type</span> <span class="n">Output</span> <span class="o">=</span> <span class="n">ComplexNumber</span><span class="p">;</span>

	    <span class="k">fn</span> <span class="nf">add</span><span class="p">(</span><span class="k">self</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n">ComplexNumber</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">ComplexNumber</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span><span class="p">:</span><span class="n">ComplexNumber</span> <span class="o">=</span> <span class="n">ComplexNumber</span> <span class="p">{</span> <span class="n">re</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">im</span><span class="p">:</span> <span class="mi">0</span> <span class="p">};</span>
	        <span class="n">x</span><span class="py">.im</span> <span class="o">=</span> <span class="k">self</span><span class="py">.im</span> <span class="o">+</span> <span class="n">b</span><span class="py">.im</span><span class="p">;</span>
	        <span class="n">x</span><span class="py">.re</span> <span class="o">=</span> <span class="k">self</span><span class="py">.re</span> <span class="o">+</span> <span class="n">b</span><span class="py">.im</span><span class="p">;</span>
	        <span class="n">x</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="nn">ops</span><span class="p">::</span><span class="nb">Sub</span><span class="o">&lt;</span><span class="n">ComplexNumber</span><span class="o">&gt;</span> <span class="k">for</span> <span class="n">ComplexNumber</span> <span class="p">{</span>
	    <span class="k">type</span> <span class="n">Output</span> <span class="o">=</span> <span class="n">ComplexNumber</span><span class="p">;</span>

	    <span class="k">fn</span> <span class="nf">sub</span><span class="p">(</span><span class="k">self</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n">ComplexNumber</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">ComplexNumber</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span><span class="p">:</span><span class="n">ComplexNumber</span> <span class="o">=</span> <span class="n">ComplexNumber</span> <span class="p">{</span> <span class="n">re</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">im</span><span class="p">:</span> <span class="mi">0</span> <span class="p">};</span>
	        <span class="n">x</span><span class="py">.im</span> <span class="o">=</span> <span class="k">self</span><span class="py">.im</span> <span class="o">-</span> <span class="n">b</span><span class="py">.im</span><span class="p">;</span>
	        <span class="n">x</span><span class="py">.re</span> <span class="o">=</span> <span class="k">self</span><span class="py">.re</span> <span class="o">-</span> <span class="n">b</span><span class="py">.im</span><span class="p">;</span>
	        <span class="n">x</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="nn">ops</span><span class="p">::</span><span class="nb">Mul</span><span class="o">&lt;</span><span class="n">ComplexNumber</span><span class="o">&gt;</span> <span class="k">for</span> <span class="n">ComplexNumber</span> <span class="p">{</span>
	    <span class="k">type</span> <span class="n">Output</span> <span class="o">=</span> <span class="n">ComplexNumber</span><span class="p">;</span>

	    <span class="k">fn</span> <span class="nf">mul</span><span class="p">(</span><span class="k">self</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n">ComplexNumber</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">ComplexNumber</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span><span class="p">:</span><span class="n">ComplexNumber</span> <span class="o">=</span> <span class="n">ComplexNumber</span> <span class="p">{</span> <span class="n">re</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">im</span><span class="p">:</span> <span class="mi">0</span> <span class="p">};</span>
	        <span class="n">x</span><span class="py">.im</span> <span class="o">=</span> <span class="k">self</span><span class="py">.im</span> <span class="o">*</span> <span class="n">b</span><span class="py">.re</span> <span class="o">+</span> <span class="k">self</span><span class="py">.re</span> <span class="o">*</span> <span class="n">b</span><span class="py">.im</span><span class="p">;</span>
	        <span class="n">x</span><span class="py">.re</span> <span class="o">=</span> <span class="k">self</span><span class="py">.re</span> <span class="o">*</span> <span class="n">b</span><span class="py">.re</span> <span class="o">-</span> <span class="k">self</span><span class="py">.im</span> <span class="o">*</span> <span class="n">b</span><span class="py">.im</span><span class="p">;</span>
	        <span class="n">x</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="nn">fmt</span><span class="p">::</span><span class="n">Display</span> <span class="k">for</span> <span class="n">ComplexNumber</span> <span class="p">{</span>
	    <span class="c1">// This trait requires `fmt` with this exact signature.</span>
	    <span class="k">fn</span> <span class="nf">fmt</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">f</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="nn">fmt</span><span class="p">::</span><span class="n">Formatter</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nn">fmt</span><span class="p">::</span><span class="nb">Result</span> <span class="p">{</span>
	        <span class="nd">write!</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s">"{}+{}i"</span><span class="p">,</span> <span class="k">self</span><span class="py">.re</span><span class="p">,</span><span class="k">self</span><span class="py">.im</span><span class="p">)</span>
	    <span class="p">}</span>
	<span class="p">}</span>
	</code></pre></figure>

<p>The better implementation by value is as follows, note if you want to really implement the operators you must implement all four cases of pointer and value type (<a href="https://stackoverflow.com/questions/28005134/how-do-i-implement-the-add-trait-for-a-reference-to-a-struct/57021762#57021762">see stackverflow on the use of  impl_ops crate</a></p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="n">ops</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="n">fmt</span><span class="p">;</span>


	<span class="k">struct</span> <span class="n">ComplexNumber</span> <span class="p">{</span>
	    <span class="n">re</span><span class="p">:</span> <span class="nb">i32</span><span class="p">,</span>
	    <span class="n">im</span><span class="p">:</span> <span class="nb">i32</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">a</span> <span class="o">=</span> <span class="n">ComplexNumber</span> <span class="p">{</span> <span class="n">re</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">im</span><span class="p">:</span> <span class="mi">2</span> <span class="p">};</span>
	    <span class="k">let</span> <span class="n">b</span> <span class="o">=</span> <span class="n">ComplexNumber</span> <span class="p">{</span> <span class="n">re</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="n">im</span><span class="p">:</span> <span class="mi">4</span> <span class="p">};</span>

	    <span class="nd">println!</span><span class="p">(</span><span class="s">"({})+({}) = {}"</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="o">&amp;</span><span class="n">a</span><span class="o">+&amp;</span><span class="n">b</span><span class="p">);</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"({})-({}) = {}"</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="o">&amp;</span><span class="n">a</span><span class="o">-&amp;</span><span class="n">b</span><span class="p">);</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"({})*({}) = {}"</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="o">&amp;</span><span class="n">a</span><span class="o">*&amp;</span><span class="n">b</span><span class="p">);</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="nn">ops</span><span class="p">::</span><span class="nb">Add</span><span class="o">&lt;&amp;</span> <span class="n">ComplexNumber</span><span class="o">&gt;</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">ComplexNumber</span> <span class="p">{</span>
	    <span class="k">type</span> <span class="n">Output</span> <span class="o">=</span> <span class="n">ComplexNumber</span><span class="p">;</span>

	    <span class="k">fn</span> <span class="nf">add</span><span class="p">(</span><span class="k">self</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">ComplexNumber</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">ComplexNumber</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span><span class="p">:</span><span class="n">ComplexNumber</span> <span class="o">=</span> <span class="n">ComplexNumber</span> <span class="p">{</span> <span class="n">re</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">im</span><span class="p">:</span> <span class="mi">0</span> <span class="p">};</span>
	        <span class="n">x</span><span class="py">.im</span> <span class="o">=</span> <span class="o">&amp;</span><span class="k">self</span><span class="py">.im</span> <span class="o">+</span> <span class="o">&amp;</span><span class="n">b</span><span class="py">.im</span><span class="p">;</span>
	        <span class="n">x</span><span class="py">.re</span> <span class="o">=</span> <span class="o">&amp;</span><span class="k">self</span><span class="py">.re</span> <span class="o">+</span> <span class="o">&amp;</span><span class="n">b</span><span class="py">.im</span><span class="p">;</span>
	        <span class="n">x</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="nn">ops</span><span class="p">::</span><span class="nb">Sub</span><span class="o">&lt;&amp;</span> <span class="n">ComplexNumber</span><span class="o">&gt;</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">ComplexNumber</span> <span class="p">{</span>
	    <span class="k">type</span> <span class="n">Output</span> <span class="o">=</span> <span class="n">ComplexNumber</span><span class="p">;</span>

	    <span class="k">fn</span> <span class="nf">sub</span><span class="p">(</span><span class="k">self</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">ComplexNumber</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">ComplexNumber</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span><span class="p">:</span><span class="n">ComplexNumber</span> <span class="o">=</span> <span class="n">ComplexNumber</span> <span class="p">{</span> <span class="n">re</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">im</span><span class="p">:</span> <span class="mi">0</span> <span class="p">};</span>
	        <span class="n">x</span><span class="py">.im</span> <span class="o">=</span> <span class="o">&amp;</span><span class="k">self</span><span class="py">.im</span> <span class="o">-</span> <span class="o">&amp;</span><span class="n">b</span><span class="py">.im</span><span class="p">;</span>
	        <span class="n">x</span><span class="py">.re</span> <span class="o">=</span> <span class="o">&amp;</span><span class="k">self</span><span class="py">.re</span> <span class="o">-</span> <span class="o">&amp;</span><span class="n">b</span><span class="py">.im</span><span class="p">;</span>
	        <span class="n">x</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="nn">ops</span><span class="p">::</span><span class="nb">Mul</span><span class="o">&lt;&amp;</span> <span class="n">ComplexNumber</span><span class="o">&gt;</span> <span class="k">for</span> <span class="o">&amp;</span><span class="n">ComplexNumber</span> <span class="p">{</span>
	    <span class="k">type</span> <span class="n">Output</span> <span class="o">=</span> <span class="n">ComplexNumber</span><span class="p">;</span>

	    <span class="k">fn</span> <span class="nf">mul</span><span class="p">(</span><span class="k">self</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">ComplexNumber</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">ComplexNumber</span> <span class="p">{</span>
	        <span class="k">let</span> <span class="k">mut</span> <span class="n">x</span><span class="p">:</span><span class="n">ComplexNumber</span> <span class="o">=</span> <span class="n">ComplexNumber</span> <span class="p">{</span> <span class="n">re</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">im</span><span class="p">:</span> <span class="mi">0</span> <span class="p">};</span>
	        <span class="n">x</span><span class="py">.im</span> <span class="o">=</span> <span class="o">&amp;</span><span class="k">self</span><span class="py">.im</span> <span class="o">*</span> <span class="o">&amp;</span><span class="n">b</span><span class="py">.re</span> <span class="o">+</span> <span class="o">&amp;</span><span class="k">self</span><span class="py">.re</span> <span class="o">*</span> <span class="o">&amp;</span><span class="n">b</span><span class="py">.im</span><span class="p">;</span>
	        <span class="n">x</span><span class="py">.re</span> <span class="o">=</span> <span class="o">&amp;</span><span class="k">self</span><span class="py">.re</span> <span class="o">*</span> <span class="o">&amp;</span><span class="n">b</span><span class="py">.re</span> <span class="o">-</span> <span class="o">&amp;</span><span class="k">self</span><span class="py">.im</span> <span class="o">*</span> <span class="o">&amp;</span><span class="n">b</span><span class="py">.im</span><span class="p">;</span>
	        <span class="n">x</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">impl</span> <span class="nn">fmt</span><span class="p">::</span><span class="n">Display</span> <span class="k">for</span> <span class="n">ComplexNumber</span> <span class="p">{</span>
	    <span class="k">fn</span> <span class="nf">fmt</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="p">,</span> <span class="n">f</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="nn">fmt</span><span class="p">::</span><span class="n">Formatter</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nn">fmt</span><span class="p">::</span><span class="nb">Result</span> <span class="p">{</span>
	        <span class="nd">write!</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s">"{}+{}i"</span><span class="p">,</span> <span class="k">self</span><span class="py">.re</span><span class="p">,</span><span class="k">self</span><span class="py">.im</span><span class="p">)</span>
	    <span class="p">}</span>
	<span class="p">}</span>
	</code></pre></figure>

<p><a href="https://play.rust-lang.org/?version=stable&amp;edition=2018&amp;gist=d4f53e7b6870439b6230a9d073f6e64e">Permalink running on Playground</a> and <a href="https://github.com/maebli/100rustsnippets/tree/master/complex-numbers">source on github</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rust challenge 2/100 - Parsing hex</title><link href="https://maebli.github.io/archive/2021-10-19-100rust-2/" rel="alternate" type="text/html" title="Rust challenge 2/100 - Parsing hex" /><published>2021-10-19T20:00:00+00:00</published><updated>2021-10-19T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust-2</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-19-100rust-2/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#what-is-this">What is this?</a></li>
  <li><a href="#2nd-challenge">2nd Challenge</a>
    <ul>
      <li><a href="#challenge">Challenge</a></li>
      <li><a href="#solution">Solution</a></li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<h2 id="what-is-this">What is this?</h2>

<p>The rules of the game are explained <a href="https://maebli.github.io/rust/2021/10/18/100rust.html">in my original post</a>.
Also, I just found a cool new Repository for learning <a href="https://github.com/rust-lang/rustlings/">Rustlings</a></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"The task is simple. Most exercises contain an error that keeps them from compiling, and it's up to you to fix it!"
</code></pre></div></div>

<p>New, task, do one rustling per day.</p>

<h2 id="2nd-challenge">2nd Challenge</h2>
<h3 id="challenge">Challenge</h3>

<p>I will try to make a challenge based on the chapter I’m reading in <a href="https://doc.rust-lang.org/book/">the rust book</a>. I read the chapter on <code class="language-plaintext highlighter-rouge">Strings</code> so the challenge
is to parse an arbitrary hex String <code class="language-plaintext highlighter-rouge">0124342</code> using only the String type and String slices.</p>

<h3 id="solution">Solution</h3>

<p>Rust stores strings in UTF-8 encoding. UTF-8 is backward-compatible with ASCII which I’m accustomed to, and uses one byte <code class="language-plaintext highlighter-rouge">u8</code> per ASCII character. This should make things simple.
To convert an ASCII to a number we subtract <code class="language-plaintext highlighter-rouge">0x30</code> to convert a lower case letter to a number we subtract <code class="language-plaintext highlighter-rouge">0x57</code> and <code class="language-plaintext highlighter-rouge">0x37</code> for lower case.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	    <span class="k">let</span> <span class="n">hex</span><span class="p">:</span> <span class="nb">String</span> <span class="o">=</span> <span class="nn">String</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="s">"0123456789ABCDEFabcdef"</span><span class="p">);</span>

	    <span class="k">for</span> <span class="n">b</span> <span class="k">in</span> <span class="n">hex</span><span class="nf">.bytes</span><span class="p">(){</span>
	        <span class="nd">println!</span><span class="p">(</span><span class="s">"ascii hex byte {} =&gt; integer {}"</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="nf">ascii_hex_to_u8</span><span class="p">(</span><span class="n">b</span><span class="p">));</span>
	    <span class="p">}</span>
	<span class="p">}</span>

	<span class="k">fn</span> <span class="nf">ascii_hex_to_u8</span><span class="p">(</span><span class="n">c</span><span class="p">:</span> <span class="nb">u8</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">u8</span> <span class="p">{</span>
	    <span class="k">match</span> <span class="n">c</span> <span class="p">{</span>
	        <span class="n">c</span> <span class="k">if</span> <span class="n">c</span> <span class="o">&gt;=</span> <span class="sc">b'0'</span> <span class="o">&amp;&amp;</span> <span class="n">c</span> <span class="o">&lt;=</span> <span class="sc">b'9'</span> <span class="k">=&gt;</span> <span class="n">c</span> <span class="o">-</span> <span class="sc">b'0'</span><span class="p">,</span>
	        <span class="n">c</span> <span class="k">if</span> <span class="n">c</span> <span class="o">&gt;=</span> <span class="sc">b'a'</span> <span class="o">&amp;&amp;</span> <span class="n">c</span> <span class="o">&lt;=</span> <span class="sc">b'f'</span> <span class="k">=&gt;</span> <span class="n">c</span> <span class="o">-</span> <span class="sc">b'a'</span> <span class="o">+</span> <span class="mi">10</span><span class="p">,</span>
	        <span class="n">c</span> <span class="k">if</span> <span class="n">c</span> <span class="o">&gt;=</span> <span class="sc">b'A'</span> <span class="o">&amp;&amp;</span> <span class="n">c</span> <span class="o">&lt;=</span> <span class="sc">b'F'</span> <span class="k">=&gt;</span> <span class="n">c</span> <span class="o">-</span> <span class="sc">b'A'</span> <span class="o">+</span> <span class="mi">10</span><span class="p">,</span>
	        <span class="n">_</span> <span class="k">=&gt;</span> <span class="nd">panic!</span><span class="p">()</span>
	    <span class="p">}</span>
	<span class="p">}</span>
	</code></pre></figure>

<p><a href="https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=24fc659b4a242692cf060a5208224829">Permalink running on Playground</a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Learning Rust</title><link href="https://maebli.github.io/archive/2021-10-18-100rust/" rel="alternate" type="text/html" title="Learning Rust" /><published>2021-10-18T20:00:00+00:00</published><updated>2021-10-18T20:00:00+00:00</updated><id>https://maebli.github.io/archive/100rust</id><content type="html" xml:base="https://maebli.github.io/archive/2021-10-18-100rust/"><![CDATA[<h1 id="table-of-content">Table of content</h1>
<!-- MarkdownTOC autolink="true" -->

<ul>
  <li><a href="#table-of-content">Table of content</a>
    <ul>
      <li><a href="#why-rust">Why Rust?</a></li>
      <li><a href="#100-part-challenge">100 part challenge</a></li>
      <li><a href="#first-challenge">First challenge</a>
        <ul>
          <li><a href="#challenge">Challenge</a></li>
          <li><a href="#solution">Solution</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<!-- /MarkdownTOC -->

<p><img src="/assets/img/challenge.jpeg" alt="" /></p>

<h2 id="why-rust">Why Rust?</h2>

<p>Like many before me, I have gained interest in the rust programming language. My main interest comes from the fact that it can be used for embedded programming. There is a lot of activity on the topic, see <a href="https://www.rust-lang.org/what/embedded">Embedded Rust</a> for more information. Before I feel comfortable diving into this world, I want to learn the basics.</p>

<h2 id="100-part-challenge">100 part challenge</h2>

<p>Initially I had written here to do this in 100 days. I have had times on and off of increased and decreased motivation and dedication to this project.
However, in 2024, three years after I started this project, I have decided to finish it. I have 4 challenges left to do.</p>

<ul>
  <li>1 unique code snippet per day for 100 days</li>
  <li>Come up with a challenge</li>
  <li>Solve the challenge</li>
  <li>Upload and present</li>
  <li>???</li>
  <li>Profit</li>
</ul>

<h2 id="first-challenge">First challenge</h2>

<h3 id="challenge">Challenge</h3>

<p>Screen scrape a random recipe name from <code class="language-plaintext highlighter-rouge">chefkoch.de</code> and display its name on the terminal</p>

<p>From the site <a href="https://www.chefkoch.de/rezepte/was-koche-ich-heute/"></a> random recipes are displayed, so what I must do is</p>

<p>Lets test with bash, what needs to be done to screen scrape the right stuff</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">	<span class="c">#!/bin/bash</span>
	curl <span class="nt">-s</span> https://www.chefkoch.de/rezepte/was-koche-ich-heute/|grep <span class="nt">-Eo</span> <span class="s2">"(http|https)://www.chefkoch.de/rezepte/[a-zA-Z0-9./?=_%:-]*"</span> | <span class="nb">sort</span> <span class="nt">-u</span>|cut <span class="nt">-d</span>/ <span class="nt">-f6</span>|cut <span class="nt">-d</span><span class="nb">.</span> <span class="nt">-f1</span>|tr - <span class="s2">" "</span>|tail <span class="nt">-1</span>
	</code></pre></figure>

<p>Will give us a menu suggestion</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Gefuellte Muschelnudeln
</code></pre></div></div>

<p>Do this in rust.</p>

<h3 id="solution">Solution</h3>

<p>First we need to download the web page <code class="language-plaintext highlighter-rouge">reqwest</code> crate seems suitable for this job. Next the document is parsed with <code class="language-plaintext highlighter-rouge">select</code> and filtered.</p>

<figure class="highlight"><pre><code class="language-rust" data-lang="rust">	<span class="k">use</span> <span class="nn">select</span><span class="p">::</span><span class="nn">document</span><span class="p">::</span><span class="n">Document</span><span class="p">;</span>
	<span class="k">use</span> <span class="nn">select</span><span class="p">::</span><span class="nn">predicate</span><span class="p">::</span><span class="n">Name</span><span class="p">;</span>

	<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="p">(),</span> <span class="nb">Box</span><span class="o">&lt;</span><span class="k">dyn</span> <span class="nn">std</span><span class="p">::</span><span class="nn">error</span><span class="p">::</span><span class="n">Error</span><span class="o">&gt;&gt;</span> <span class="p">{</span>
	    <span class="cm">/* Fetch the website with GET Request */</span>
	    <span class="k">let</span> <span class="n">body</span> <span class="o">=</span>
	        <span class="nn">reqwest</span><span class="p">::</span><span class="nn">blocking</span><span class="p">::</span><span class="nf">get</span><span class="p">(</span><span class="s">"https://www.chefkoch.de/rezepte/was-koche-ich-heute/"</span><span class="p">)</span><span class="o">?</span><span class="nf">.text</span><span class="p">()</span><span class="o">?</span><span class="p">;</span>
	    <span class="cm">/* Parse the HTML txt, extract the urls and filter the relevant ones */</span>
	    <span class="k">let</span> <span class="n">yum</span> <span class="o">=</span> <span class="nn">Document</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="n">body</span><span class="nf">.as_str</span><span class="p">())</span>
	        <span class="nf">.select</span><span class="p">(</span><span class="nf">Name</span><span class="p">(</span><span class="s">"a"</span><span class="p">))</span>
	        <span class="nf">.filter_map</span><span class="p">(|</span><span class="n">n</span><span class="p">|</span> <span class="n">n</span><span class="nf">.attr</span><span class="p">(</span><span class="s">"href"</span><span class="p">))</span>
	        <span class="nf">.filter</span><span class="p">(|</span><span class="n">x</span><span class="p">|</span> <span class="n">x</span><span class="nf">.contains</span><span class="p">(</span><span class="s">"www.chefkoch.de/rezepte/"</span><span class="p">))</span>
	        <span class="nf">.next</span><span class="p">()</span>
	        <span class="nf">.unwrap</span><span class="p">()</span>
	        <span class="nf">.split</span><span class="p">(</span><span class="s">"/"</span><span class="p">)</span>
	        <span class="nf">.last</span><span class="p">()</span>
	        <span class="nf">.unwrap</span><span class="p">()</span>
	        <span class="nf">.replace</span><span class="p">(</span><span class="s">".html"</span><span class="p">,</span> <span class="s">""</span><span class="p">)</span>
	        <span class="nf">.replace</span><span class="p">(</span><span class="s">"-"</span><span class="p">,</span> <span class="s">" "</span><span class="p">);</span>
	    <span class="nd">println!</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">yum</span><span class="p">);</span>
	    <span class="nf">Ok</span><span class="p">(())</span>
	<span class="p">}</span>
	</code></pre></figure>

<p>Next question, where can I have live demos of my code? For now I’ll upload it to my github page, see <a href="https://github.com/maebli/100rustsnippets/blob/master/web-scrapper/src/main.rs"></a></p>]]></content><author><name>Michael Aebli</name></author><category term="rust" /><summary type="html"><![CDATA[Part of the 100 Rust Challenge — one small Rust problem at a time, with the solution worked through in full.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://maebli.github.io/assets/img/og-default.png" /><media:content medium="image" url="https://maebli.github.io/assets/img/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>