1
0
Fork 0
mirror of https://github.com/mfocko/blog.git synced 2025-04-24 13:35:27 +02:00
blog/blog/aoc-2022/4th-week/index.html
2023-09-07 18:02:56 +00:00

136 lines
No EOL
182 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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

<!doctype html>
<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-blog">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.1">
<title data-rh="true">4th week of Advent of Code &#x27;22 in Rust | mf</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://blog.mfocko.xyz/blog/aoc-2022/4th-week"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="4th week of Advent of Code &#x27;22 in Rust | mf"><meta data-rh="true" name="description" content="Surviving fourth week in Rust."><meta data-rh="true" property="og:description" content="Surviving fourth week in Rust."><meta data-rh="true" property="og:type" content="article"><meta data-rh="true" property="article:published_time" content="2023-07-07T15:14:00.000Z"><meta data-rh="true" property="article:author" content="https://gitlab.com/mfocko"><meta data-rh="true" property="article:tag" content="advent-of-code,advent-of-code-2022,rust"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://blog.mfocko.xyz/blog/aoc-2022/4th-week"><link data-rh="true" rel="alternate" href="https://blog.mfocko.xyz/blog/aoc-2022/4th-week" hreflang="en"><link data-rh="true" rel="alternate" href="https://blog.mfocko.xyz/blog/aoc-2022/4th-week" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://0VXRFPR4QF-dsn.algolia.net" crossorigin="anonymous"><link rel="search" type="application/opensearchdescription+xml" title="mf" href="/opensearch.xml">
<link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="mf RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="mf Atom Feed">
<link rel="alternate" type="application/json" href="/blog/feed.json" title="mf JSON Feed">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css" integrity="sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM" crossorigin="anonymous"><link rel="stylesheet" href="/assets/css/styles.8480cb83.css">
<link rel="preload" href="/assets/js/runtime~main.05f83fa7.js" as="script">
<link rel="preload" href="/assets/js/main.9283b308.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><b class="navbar__title text--truncate">mf</b></a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Additional FI MU materials</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/ib002/">IB002: Algorithms</a></li><li><a class="dropdown__link" href="/pb071/">PB071: C</a></li><li><a class="dropdown__link" href="/pb161/">PB161: C++</a></li></ul></div><a class="navbar__item navbar__link" href="/contributions">Contributions</a><a class="navbar__item navbar__link" href="/talks">Talks</a></div><div class="navbar__items navbar__items--right"><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/blog">Blog</a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="Blog recent posts navigation"><div class="sidebarItemTitle_pO2u margin-bottom--md">Recent posts</div><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/2023/08/02/copr">How can Copr help with broken dependencies</a></li><li class="sidebarItem__DBe"><a aria-current="page" class="sidebarItemLink_mo7H sidebarItemLinkActive_I1ZP" href="/blog/aoc-2022/4th-week">4th week of Advent of Code &#x27;22 in Rust</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/aoc-2022/3rd-week">3rd week of Advent of Code &#x27;22 in Rust</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/leetcode/sort-diagonally">Sort the matrix diagonally</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/aoc-2022/2nd-week">2nd week of Advent of Code &#x27;22 in Rust</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="http://schema.org/Blog"><article itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting"><header><h1 class="title_f1Hy" itemprop="headline">4th week of Advent of Code &#x27;22 in Rust</h1><div class="container_mt6G margin-vert--md"><time datetime="2023-07-07T15:14:00.000Z" itemprop="datePublished">July 7, 2023</time> · <!-- -->16 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://gitlab.com/mfocko" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/mfocko.png" alt="Matej Focko"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://gitlab.com/mfocko" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Matej Focko</span></a></div><small class="avatar__subtitle" itemprop="description">a.k.a. @mf</small></div></div></div></div></header><div id="__blog-post-container" class="markdown" itemprop="articleBody"><p>Let&#x27;s go through the fourth week of <a href="https://adventofcode.com" target="_blank" rel="noopener noreferrer"><em>Advent of Code</em></a> in Rust.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="day-22-monkey-map"><a href="https://adventofcode.com/2022/day/22" target="_blank" rel="noopener noreferrer">Day 22: Monkey Map</a><a href="#day-22-monkey-map" class="hash-link" aria-label="Direct link to day-22-monkey-map" title="Direct link to day-22-monkey-map"></a></h2><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>tl;dr</div><div class="admonitionContent_S0QG"><p>Simulating a movement on a 2D map with given instructions. Map becomes a cube in
the 2nd part…</p></div></div><div class="theme-admonition theme-admonition-caution alert alert--warning admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Rant</div><div class="admonitionContent_S0QG"><p>This was the most obnoxious problem of this year… and a lot of Rust issues have
been hit.</p></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="solution">Solution<a href="#solution" class="hash-link" aria-label="Direct link to Solution" title="Direct link to Solution"></a></h3><p>It seems like a very simple problem to solve, but with very obnoxious changes in
the 2nd part and also it&#x27;s relatively hard to decompose »properly«.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="column-iterator">Column iterator<a href="#column-iterator" class="hash-link" aria-label="Direct link to Column iterator" title="Direct link to Column iterator"></a></h4><p>In the first part of the problem it was needed to know the boundaries of each
row and column, since I stored them in <code>Vec&lt;Vec&lt;char&gt;&gt;</code> and padded with spaces
to ensure I have a rectangular 2D “array”. However when you wanted to go through
each row and column to determine the boundaries, it was very easy to do for the
rows (cause each row is a <code>Vec</code> element), but not for the columns, since they
span multiple rows.</p><p>For this use case I have implemented my own <em>column iterator</em>:</p><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">pub</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">struct</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">ColumnIterator</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vec</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> column</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> i</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">impl</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">ColumnIterator</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">pub</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">new</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vec</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> column</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">ColumnIterator</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">Self</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> column</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> i</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">impl</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Iterator</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">ColumnIterator</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">type</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">Item</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">next</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">mut</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Option</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">Self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token class-name" style="color:rgb(38, 127, 153)">Item</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">i </span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">len</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">None</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">i </span><span class="token operator" style="color:rgb(0, 0, 0)">+=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Some</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">i </span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">column</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Given this piece of an iterator, it is very easy to factor out the common
functionality between the rows and columns into:</p><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">mut</span><span class="token plain"> find_boundaries </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params">constructor</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token closure-params"> </span><span class="token closure-params keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token closure-params keyword" style="color:rgb(0, 0, 255)">usize</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token closure-params"> </span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token closure-params"> </span><span class="token closure-params class-name" style="color:rgb(38, 127, 153)">Orientation</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"></span><br></span><span class="token-line" style="color:#000000"><span class="token closure-params"> iterator</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token closure-params"> </span><span class="token closure-params operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token closure-params keyword" style="color:rgb(0, 0, 255)">mut</span><span class="token closure-params"> </span><span class="token closure-params keyword" style="color:rgb(0, 0, 255)">dyn</span><span class="token closure-params"> </span><span class="token closure-params class-name" style="color:rgb(38, 127, 153)">Iterator</span><span class="token closure-params operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token closure-params class-name" style="color:rgb(38, 127, 153)">Item</span><span class="token closure-params"> </span><span class="token closure-params operator" style="color:rgb(0, 0, 0)">=</span><span class="token closure-params"> </span><span class="token closure-params operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token closure-params keyword" style="color:rgb(0, 0, 255)">char</span><span class="token closure-params operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"></span><br></span><span class="token-line" style="color:#000000"><span class="token closure-params"> upper_bound</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"></span><br></span><span class="token-line" style="color:#000000"><span class="token closure-params"> i</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">mut</span><span class="token plain"> first_non_empty </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> iterator</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">enumerate</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">skip_while</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token closure-params">_</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"> </span><span class="token closure-params operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token closure-params">c</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> c </span><span class="token operator" style="color:rgb(0, 0, 0)">==</span><span class="token plain"> </span><span class="token char" style="color:rgb(129, 31, 63)">&#x27; &#x27;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> start </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> first_non_empty</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">next</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">unwrap</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">mut</span><span class="token plain"> last_non_empty </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> first_non_empty</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">skip_while</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token closure-params">_</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"> </span><span class="token closure-params operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token closure-params">c</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> c </span><span class="token operator" style="color:rgb(0, 0, 0)">!=</span><span class="token plain"> </span><span class="token char" style="color:rgb(129, 31, 63)">&#x27; &#x27;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> end </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> last_non_empty</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">next</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">unwrap_or</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">upper_bound</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token char" style="color:rgb(129, 31, 63)">&#x27;_&#x27;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> boundaries</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">insert</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token function" style="color:rgb(0, 0, 255)">constructor</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> start</span><span class="token punctuation" style="color:rgb(4, 81, 165)">..</span><span class="token plain">end</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>And then use it as such:</p><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token comment" style="color:rgb(0, 128, 0)">// construct all horizontal boundaries</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">..</span><span class="token plain">map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">len</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">for_each</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params">row</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">find_boundaries</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Orientation</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token plain">horizontal</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">mut</span><span class="token plain"> map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">row</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">iter</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">row</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">len</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> row</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)">// construct all vertical boundaries</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">..</span><span class="token plain">map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">len</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">for_each</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params">col</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">find_boundaries</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Orientation</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token plain">vertical</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">mut</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">ColumnIterator</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">new</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token plain">map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> col</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">len</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> col</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="walking-around-the-map">Walking around the map<a href="#walking-around-the-map" class="hash-link" aria-label="Direct link to Walking around the map" title="Direct link to Walking around the map"></a></h4><p>Once the 2nd part got introduced, you start to think about a way how not to
copy-paste a lot of stuff (I haven&#x27;t avoided it anyways…). In this problem, I&#x27;ve
chosen to introduce a trait (i.e. <em>interface</em>) for 2D and 3D walker.</p><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">trait</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">Wrap</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Clone</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">type</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">State</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// simulation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">is_blocked</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">bool</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">step</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">mut</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> steps</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">turn_left</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">mut</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">turn_right</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">mut</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// movement</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">next</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token keyword" style="color:rgb(0, 0, 255)">Self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token class-name" style="color:rgb(38, 127, 153)">State</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Direction</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// final answer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">answer</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Output</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Each walker maintains its own state and also provides the functions that are
used during the simulation. The “promised” methods are separated into:</p><ul><li><em>simulation</em>-related: that are used during the simulation from the <code>.fold()</code></li><li><em>movement</em>-related: just a one method that holds most of the logic differences
between 2D and 3D</li><li><em>final answer</em>: which extracts the <em>proof of solution</em> from the
implementation-specific walker</li></ul><p>Both 2D and 3D versions borrow the original input and therefore you must
annotate the lifetime of it:</p><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">struct</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">Wrap2D</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> input</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Input</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> position</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Position</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> direction</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Direction</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">impl</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Wrap2D</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">new</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">input</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Input</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Wrap2D</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token lifetime-annotation symbol">&#x27;a</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)">// …</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="problems">Problems<a href="#problems" class="hash-link" aria-label="Direct link to Problems" title="Direct link to Problems"></a></h4><p>I have used a lot of closures for this problem and once I introduced a parameter
that was of unknown type (apart from the fact it implements a specific trait), I
got suggested a “fix” for the compilation error that resulted in something that
was not possible to parse, cause it, more than likely, violated the grammar.</p><p>In a similar fashion, I have been suggested changes that led to a code that
didn&#x27;t make sense by just looking at it (there was no need to try the changes),
for example one suggested change in the closure parameter caused disapperance of
the parameter name. 😄</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="clippy">Clippy<a href="#clippy" class="hash-link" aria-label="Direct link to Clippy" title="Direct link to Clippy"></a></h4><p>I have to admit that Clippy was rather helpful here, I&#x27;ll include two examples
of rather smart suggestions.</p><p>When writing the parsing for this problem, the first thing I have spotted on the
<code>char</code> was the <code>.is_digit()</code> function that takes a radix as a parameter. Clippy
noticed that I use <code>radix = 10</code> and suggested switching to <code>.is_ascii_digit()</code>
that does exactly the same thing:</p><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token deleted-sign deleted prefix deleted" style="color:rgb(163, 21, 21)">-</span><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"> .take_while(|c| c.is_digit(10))</span><br></span><span class="token-line" style="color:#000000"><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(9, 134, 88)">+</span><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"> .take_while(|c| c.is_ascii_digit())</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Another useful suggestion appeared when working with the iterators and I wanted
to get the <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">n</span></span></span></span></span>-th element from it. You know the <code>.skip()</code>, you know the
<code>.next()</code>, just “slap” them together and we&#x27;re done for 😁 Well, I got
suggested to use <code>.nth()</code> that does exactly the combination of the two mentioned
methods on iterators:</p><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token deleted-sign deleted prefix deleted" style="color:rgb(163, 21, 21)">-</span><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"> match it.clone().skip(skip).next().unwrap() {</span><br></span><span class="token-line" style="color:#000000"><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(9, 134, 88)">+</span><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"> match it.clone().nth(skip).unwrap() {</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="day-23-unstable-diffusion"><a href="https://adventofcode.com/2022/day/23" target="_blank" rel="noopener noreferrer">Day 23: Unstable Diffusion</a><a href="#day-23-unstable-diffusion" class="hash-link" aria-label="Direct link to day-23-unstable-diffusion" title="Direct link to day-23-unstable-diffusion"></a></h2><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>tl;dr</div><div class="admonitionContent_S0QG"><p>Simulating movement of elves around with a set of specific rules.</p></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="solution-1">Solution<a href="#solution-1" class="hash-link" aria-label="Direct link to Solution" title="Direct link to Solution"></a></h3><p>There&#x27;s not much to mention since it&#x27;s just a cellular automaton simulation
(even though the AoC rules for cellular automatons usually get out of hand
😉).</p><p>Although I had a need to determine boundaries of the elves&#x27; positions and ended
up with a nasty DRY violation. Knowing that you you&#x27;re looking for maximum and
minimum that are, of course, exactly the same except for initial values and
comparators, it looks like a rather simple fix, but typing in Rust is something
else, right? In the end I settled for a function that computes both boundaries
without any duplication while using a closure:</p><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">get_bounds</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">positions</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token class-name" style="color:rgb(38, 127, 153)">Input</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> f </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params">init</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"> cmp</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token closure-params"> </span><span class="token closure-params operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token closure-params keyword" style="color:rgb(0, 0, 255)">dyn</span><span class="token closure-params"> </span><span class="token closure-params class-name" style="color:rgb(38, 127, 153)">Fn</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token closure-params keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"> </span><span class="token closure-params keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token closure-params"> </span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token closure-params"> </span><span class="token closure-params keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> positions</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">iter</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">fold</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector2D</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">new</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">init</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> init</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params">acc</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"> elf</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector2D</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">new</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token function" style="color:rgb(0, 0, 255)">cmp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">acc</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> elf</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">cmp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">acc</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">y</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> elf</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">y</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token function" style="color:rgb(0, 0, 255)">f</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token constant" style="color:rgb(129, 31, 63)">MAX</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token function" style="color:rgb(0, 0, 255)">min</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">f</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token constant" style="color:rgb(129, 31, 63)">MIN</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token function" style="color:rgb(0, 0, 255)">max</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This function returns a pair of 2D vectors that represent opposite points of the
bounding rectangle of all elves.</p><p>You might ask why would we need a closure and the answer is that <code>positions</code>
cannot be captured from within the nested function, only via closure. One more
fun fact on top of that is the type of the comparator</p><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">dyn</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Fn</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">isize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">isize</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Once we remove the <code>dyn</code> keyword, compiler yells at us and also includes a way
how to get a more thorough explanation of the error by running</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">$ rustc --explain E0782</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>which shows us</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">Trait objects must include the `dyn` keyword.</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">Erroneous code example:</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">```</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">trait Foo {}</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">fn test(arg: Box&lt;Foo&gt;) {} // error!</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">```</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">Trait objects are a way to call methods on types that are not known until</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">runtime but conform to some trait.</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">Trait objects should be formed with `Box&lt;dyn Foo&gt;`, but in the code above</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">`dyn` is left off.</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">This makes it harder to see that `arg` is a trait object and not a</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">simply a heap allocated type called `Foo`.</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">To fix this issue, add `dyn` before the trait name.</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">```</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">trait Foo {}</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">fn test(arg: Box&lt;dyn Foo&gt;) {} // ok!</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">```</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">This used to be allowed before edition 2021, but is now an error.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="theme-admonition theme-admonition-danger alert alert--danger admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>Rant</div><div class="admonitionContent_S0QG"><p>Not all of the explanations are helpful though, in some cases they might be even
more confusing than helpful, since they address <em>very simple</em> use cases.</p><p>As you can see, even in this case there are two sides to the explanations:</p><ul><li>it explains why you need to use <code>dyn</code>, but</li><li>it still mentions that trait objects need to be heap-allocated via <code>Box&lt;T&gt;</code>
that, as you can see in my snippet, <strong>does not</strong> apply here 😄 IMO it&#x27;s
caused by the fact that we are borrowing it and therefore we don&#x27;t need to
care about the size or whereabouts of it.</li></ul></div></div><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>C++ parallel</div><div class="admonitionContent_S0QG"><p>If you dive into the explanation above, you can notice that the <code>Box&lt;dyn Trait&gt;</code>
pattern is very helpful for using types that are not known during compile-time.
You would use a very similar approach in C++ when parsing some data structure
from input (let&#x27;s say JSON for example).</p><p>On the other hand, in this case, it doesn&#x27;t really make much sense, cause you
can clearly see that the types <strong>are known</strong> during the compile-time, which in
C++ could be easily resolved by templating the helper function.</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="day-24-blizzard-basin"><a href="https://adventofcode.com/2022/day/24" target="_blank" rel="noopener noreferrer">Day 24: Blizzard Basin</a><a href="#day-24-blizzard-basin" class="hash-link" aria-label="Direct link to day-24-blizzard-basin" title="Direct link to day-24-blizzard-basin"></a></h2><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>tl;dr</div><div class="admonitionContent_S0QG"><p>Navigating your way through a basin with series of blizzards that move around
you as you move.</p></div></div><div class="theme-admonition theme-admonition-caution alert alert--warning admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_S0QG"><p>It&#x27;s second to last day and I went “<em>bonkers</em>” on the Rust 😄 Proceed to
read <em>Solution</em> part on your own risk.</p></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="solution-2">Solution<a href="#solution-2" class="hash-link" aria-label="Direct link to Solution" title="Direct link to Solution"></a></h3><p>You are given a map with blizzards all over the place and you&#x27;re supposed to
find the minimum time it requires you to walk through the basin without getting
in any of the blizzards.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="breakdown">Breakdown<a href="#breakdown" class="hash-link" aria-label="Direct link to Breakdown" title="Direct link to Breakdown"></a></h4><p>Relatively simple, yet a bit annoying, approach can be taken. It&#x27;s technically
a shortest-path algorithm implementation with some relaxation restrictions and
being able to stay on one position for some time, so each <em>vertex</em> of the graph
is determined by the position on the map and the <em>timestamp</em>. I have chosen to
use <code>Vector3D&lt;usize&gt;</code>, since <code>x</code> and <code>y</code> attributes can be used for the position
and, well, let&#x27;s use <code>z</code> for a timestamp, cause why not, right? 😉</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="evaluating-the-blizzards">Evaluating the blizzards<a href="#evaluating-the-blizzards" class="hash-link" aria-label="Direct link to Evaluating the blizzards" title="Direct link to Evaluating the blizzards"></a></h4><div class="theme-admonition theme-admonition-caution alert alert--warning admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_S0QG"><p>I think that this is the most perverted abuse of the traits in the whole 4 weeks
of AoC in Rust…</p></div></div><p>The blizzards move along their respective directions in time and loop around in
their respective row/column. Each vertex holds position <strong>and</strong> time, so we can
<em>just</em> index the basin with the vertex itself, right? Yes, we can 😈</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Fun fact</div><div class="admonitionContent_S0QG"><p>While writing this part, I&#x27;ve recognized unnecessary verbosity in the code and
cleaned it up a bit. The changed version is shown here and the original was just
more verbose.</p></div></div><p>I&#x27;ll skip the boring parts of checking bounds and entry/exit of the basin 😉
We can easily calculate positions of the blizzards using a modular arithmetics:</p><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">impl</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Index</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">Position</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Basin</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">type</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">Output</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">char</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Position</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">Self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token class-name" style="color:rgb(38, 127, 153)">Output</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// skipped boring parts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// We need to account for the loops of the blizzards</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> width </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">cols </span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">2</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> height </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">rows </span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">2</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> blizzard_origin </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params">size</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"> d</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"> t</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"> i</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">i </span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">+</span><span class="token plain"> size </span><span class="token operator" style="color:rgb(0, 0, 0)">+</span><span class="token plain"> d </span><span class="token operator" style="color:rgb(0, 0, 0)">*</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">t </span><span class="token operator" style="color:rgb(0, 0, 0)">%</span><span class="token plain"> size</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">%</span><span class="token plain"> size </span><span class="token operator" style="color:rgb(0, 0, 0)">+</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">y</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">blizzard_origin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">width</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">z</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token char" style="color:rgb(129, 31, 63)">&#x27;&gt;&#x27;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">y</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">blizzard_origin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">width</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">z</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token char" style="color:rgb(129, 31, 63)">&#x27;&lt;&#x27;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">blizzard_origin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">height</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">z</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">y</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token char" style="color:rgb(129, 31, 63)">&#x27;v&#x27;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">blizzard_origin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">height</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">z</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">y</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token char" style="color:rgb(129, 31, 63)">&#x27;^&#x27;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">iter</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">find_map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token closure-params">y</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"> x</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"> direction</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">y</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">==</span><span class="token plain"> direction </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Some</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">y</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">None</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">unwrap_or</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token char" style="color:rgb(129, 31, 63)">&#x27;.&#x27;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>As you can see, there is an expression for calculating the original position and
it&#x27;s used multiple times, so why not take it out to a lambda, right? 😉</p><p>I couldn&#x27;t get the <code>rustfmt</code> to format the <code>for</code>-loop nicely, so I&#x27;ve just
decided to go with iterating over an elements of a slice. I have used, once
again, a combination of two functions (<code>find_map</code> in this case) to do 2 things
at once and at the end, if we haven&#x27;t found any blizzard, we just return the
empty space.</p><p>I think it&#x27;s a very <em>nice</em> (and naughty) way how to use the <code>Index</code> trait, don&#x27;t
you think?</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="shortest-path-algorithm">Shortest-path algorithm<a href="#shortest-path-algorithm" class="hash-link" aria-label="Direct link to Shortest-path algorithm" title="Direct link to Shortest-path algorithm"></a></h4><p>For the shortest path you can choose and adjust any of the common shortest-path
algorithms, in my case, I have decided to use <a href="https://en.wikipedia.org/wiki/A*_search_algorithm" target="_blank" rel="noopener noreferrer"><em>A<!-- -->*</em></a> instead of Dijkstra&#x27;s
algorithm, since it better reflects the <em>cost</em> function.</p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Comparison of costs</div><div class="admonitionContent_S0QG"><p>With the Dijkstra&#x27;s algorithm I would proceed with the <code>time</code> attribute used as
a priority for the queue.</p><p>Whereas with the <em>A<!-- -->*</em>, I have chosen to use both time and Manhattan distance
that promotes vertices closer to the exit <strong>and</strong> with a minimum time taken.</p></div></div><p>Cost function is, of course, a closure 😉</p><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> cost </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params">p</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token closure-params"> </span><span class="token closure-params class-name" style="color:rgb(38, 127, 153)">Position</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">z</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">+</span><span class="token plain"> exit</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">y</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">abs_diff</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">y</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">+</span><span class="token plain"> exit</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">abs_diff</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>And also for checking the possible moves from the current vertex, I have
implemented, yet another, closure that yields an iterator with the next moves:</p><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> next_positions </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params">p</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">iter</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">filter_map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token keyword" style="color:rgb(0, 0, 255)">move</span><span class="token plain"> </span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token closure-params">x</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"> y</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"> t</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> next_p </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> p </span><span class="token operator" style="color:rgb(0, 0, 0)">+</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector3D</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">new</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> t</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> basin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">next_p</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">==</span><span class="token plain"> </span><span class="token char" style="color:rgb(129, 31, 63)">&#x27;.&#x27;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Some</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">next_p</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">None</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="min-heap">Min-heap<a href="#min-heap" class="hash-link" aria-label="Direct link to Min-heap" title="Direct link to Min-heap"></a></h4><p>In this case I had a need to use the priority queue taking the elements with the
lowest cost as the prioritized ones. Rust only offers you the <a href="https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html" target="_blank" rel="noopener noreferrer"><code>BinaryHeap</code></a> and
that is a max-heap. One of the ways how to achieve a min-heap is to put the
elements in wrapped in a <a href="https://doc.rust-lang.org/std/cmp/struct.Reverse.html" target="_blank" rel="noopener noreferrer"><code>Reverse</code></a> (as is even showed in the linked <a href="https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html#min-heap" target="_blank" rel="noopener noreferrer">docs of
the <code>BinaryHeap</code></a>). However the wrapping affects the type of the heap and also
popping the most prioritized elements yields values wrapped in the <code>Reverse</code>.</p><p>For this purpose I have just taken the max-heap and wrapped it as a whole in a
separate structure providing just the desired methods:</p><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">use</span><span class="token plain"> </span><span class="token namespace">std</span><span class="token namespace punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token namespace">cmp</span><span class="token namespace punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token class-name" style="color:rgb(38, 127, 153)">Ord</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Reverse</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">use</span><span class="token plain"> </span><span class="token namespace">std</span><span class="token namespace punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token namespace">collections</span><span class="token namespace punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token class-name" style="color:rgb(38, 127, 153)">BinaryHeap</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">pub</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">struct</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">MinHeap</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> heap</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">BinaryHeap</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">Reverse</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">impl</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Ord</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">MinHeap</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">pub</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">new</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">MinHeap</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">MinHeap</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> heap</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">BinaryHeap</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">new</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">pub</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">push</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">mut</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> item</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">heap</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">push</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token class-name" style="color:rgb(38, 127, 153)">Reverse</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">item</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">pub</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">pop</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token keyword" style="color:rgb(0, 0, 255)">mut</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Option</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">heap</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">pop</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params class-name" style="color:rgb(38, 127, 153)">Reverse</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token closure-params">x</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">impl</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Ord</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Default</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">MinHeap</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">default</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">Self</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">Self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">new</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Rest is just the algorithm implementation which is not that interesting.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="day-25-full-of-hot-air"><a href="https://adventofcode.com/2022/day/25" target="_blank" rel="noopener noreferrer">Day 25: Full of Hot Air</a><a href="#day-25-full-of-hot-air" class="hash-link" aria-label="Direct link to day-25-full-of-hot-air" title="Direct link to day-25-full-of-hot-air"></a></h2><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>tl;dr</div><div class="admonitionContent_S0QG"><p>Playing around with a numbers in a <em>special</em> base.</p></div></div><p>Getting flashbacks to the <em>IB111 Foundations of Programming</em>… Very nice “problem”
with a rather easy solution, as the last day always seems to be.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="solution-3">Solution<a href="#solution-3" class="hash-link" aria-label="Direct link to Solution" title="Direct link to Solution"></a></h3><p>Implementing 2 functions, converting from the <em>SNAFU base</em> and back to the <em>SNAFU</em>
<em>base</em> representation. Let&#x27;s do a bit more though! I have implemented two functions:</p><ul><li><code>from_snafu</code></li><li><code>to_snafu</code></li></ul><p>Now it is apparent that all I do is number to string and string to number. Hmm…
that sounds familiar, doesn&#x27;t it? Let&#x27;s introduce a structure for the SNAFU numbers
and implement the traits that we need.</p><p>Let&#x27;s start with a structure:</p><div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token attribute attr-name" style="color:rgb(255, 0, 0)">#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">struct</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">SNAFU</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">i64</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="converting-from-str">Converting from <code>&amp;str</code><a href="#converting-from-str" class="hash-link" aria-label="Direct link to converting-from-str" title="Direct link to converting-from-str"></a></h4><p>We will start by implementing the <code>FromStr</code> trait that will help us parse our input.
This is rather simple, I can just take the <code>from_snafu</code> function, copy-paste it
into the <code>from_str</code> method and the number I get will be wrapped in <code>Result</code> and
<code>SNAFU</code> structure.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="converting-to-string">Converting to <code>String</code><a href="#converting-to-string" class="hash-link" aria-label="Direct link to converting-to-string" title="Direct link to converting-to-string"></a></h4><p>This is more fun. In some cases you need to implement only one trait and others
are automatically implemented using that one trait. In our case, if you look in
the documentation, you can see that <code>ToString</code> trait is automatically implemented
for any type that implements <code>Display</code> trait.</p><p>Let&#x27;s implement the <code>Display</code> trait then. We should be able to use the <code>to_snafu</code>
function and just take the <code>self.value</code> from the <code>SNAFU</code> structure.</p><p>And for the convenience of tests, we can also implement a rather simple <code>From&lt;i64&gt;</code>
trait for the <code>SNAFU</code>.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="adjusting-the-code">Adjusting the code<a href="#adjusting-the-code" class="hash-link" aria-label="Direct link to Adjusting the code" title="Direct link to Adjusting the code"></a></h4><p>After those changes we need to adjust the code and tests.</p><p>Parsing of the input is very easy, before we have used the lines, now we parse
everything:</p><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> fn parse_input&lt;P: AsRef&lt;Path&gt;&gt;(pathname: P) -&gt; Input {</span><br></span><span class="token-line" style="color:#000000"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(163, 21, 21)">-</span><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"> file_to_lines(pathname)</span><br></span><span class="token-line" style="color:#000000"><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(9, 134, 88)">+</span><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"> file_to_structs(pathname)</span><br></span><span class="token-line" style="color:#000000"><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> }</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Part 1 needs to be adjusted a bit too:</p><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> fn part_1(input: &amp;Input) -&gt; Output {</span><br></span><span class="token-line" style="color:#000000"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(163, 21, 21)">-</span><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"> to_snafu(input.iter().map(|s| from_snafu(s)).sum())</span><br></span><span class="token-line" style="color:#000000"><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(9, 134, 88)">+</span><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"> SNAFU::from(input.iter().map(|s| s.value).sum::&lt;i64&gt;()).to_string()</span><br></span><span class="token-line" style="color:#000000"><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> }</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You can also see that it simplifies the meaning a bit and it is more explicit than
the previous versions.</p><p>And for the tests:</p><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> #[test]</span><br></span><span class="token-line" style="color:#000000"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> fn test_from() {</span><br></span><span class="token-line" style="color:#000000"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(163, 21, 21)">-</span><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"> for (n, s) in EXAMPLES.iter() {</span><br></span><span class="token-line" style="color:#000000"><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(163, 21, 21)">-</span><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"> assert_eq!(from_snafu(s), *n);</span><br></span><span class="token-line" style="color:#000000"><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(9, 134, 88)">+</span><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"> for (&amp;n, s) in EXAMPLES.iter() {</span><br></span><span class="token-line" style="color:#000000"><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(9, 134, 88)">+</span><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"> assert_eq!(s.parse::&lt;SNAFU&gt;().unwrap().value, n);</span><br></span><span class="token-line" style="color:#000000"><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> }</span><br></span><span class="token-line" style="color:#000000"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> }</span><br></span><span class="token-line" style="color:#000000"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"></span><br></span><span class="token-line" style="color:#000000"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> #[test]</span><br></span><span class="token-line" style="color:#000000"><span class="token unchanged line"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> fn test_to() {</span><br></span><span class="token-line" style="color:#000000"><span class="token unchanged line"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(163, 21, 21)">-</span><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"> for (n, s) in EXAMPLES.iter() {</span><br></span><span class="token-line" style="color:#000000"><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(163, 21, 21)">-</span><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"> assert_eq!(to_snafu(*n), s.to_string());</span><br></span><span class="token-line" style="color:#000000"><span class="token deleted-sign deleted line" style="color:rgb(163, 21, 21)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(9, 134, 88)">+</span><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"> for (&amp;n, s) in EXAMPLES.iter() {</span><br></span><span class="token-line" style="color:#000000"><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(9, 134, 88)">+</span><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"> assert_eq!(SNAFU::from(n).to_string(), s.to_string());</span><br></span><span class="token-line" style="color:#000000"><span class="token inserted-sign inserted line" style="color:rgb(9, 134, 88)"></span><span class="token unchanged prefix unchanged"> </span><span class="token unchanged line"> }</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary"></a></h2><p>Let&#x27;s wrap the whole thing up! Keeping in mind both AoC and the Rust…</p><p><img loading="lazy" alt="Finished advent calendar :smile:" src="/assets/images/calendar-f891b624f3e0efb34bba582100a7d8df.png" width="2417" height="1984" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="advent-of-code">Advent of Code<a href="#advent-of-code" class="hash-link" aria-label="Direct link to Advent of Code" title="Direct link to Advent of Code"></a></h3><p>This year was quite fun, even though most of the solutions and posts came in
later on (<em>cough</em> in &#x27;23 <em>cough</em>). Day 22 was the most obnoxious one… And also
it feels like I used priority queues and tree data structures <strong>a lot</strong> 👀</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="with-rust">with Rust<a href="#with-rust" class="hash-link" aria-label="Direct link to with Rust" title="Direct link to with Rust"></a></h3><p>I must admit that a lot of compiler warnings and errors were very useful. Even
though I still found some instances where they didn&#x27;t help at all or cause even
worse issues than I had. Compilation times have been addressed with the caching.</p><p>Building my first tree data structure in Rust has been a very “interesting”
journey. Being able to write a more generic BFS algorithm that allows you to not
duplicate code while still mantaining the desired functionality contributes to
a very readable code.</p><p>I am definitely much more aware of the basic things that bloated Python is
missing, yet Rust has them…</p><p>Using explicit types and writing down placeholder functions with <code>todo!()</code>
macros is very pleasant, since it allows you to easily navigate the type system
during the development when you don&#x27;t even need to be sure how are you going to
put the smaller pieces together.</p><p>I have used a plethora of traits and also implemented some of them to either be
idiomatic, or exploit the syntactic sugar they offer. Deriving the default trait
implementation is also very helpful in a lot of cases, e.g. debugging output,
copying, equality comparison, etc.</p><p>I confess to touching more “cursed” parts of the Rust, such as macros to
declutter the copy-paste for tests or writing my own structures that need to
carry a lifetime for their own fields.</p><p>tl;dr Relatively pleasant language until you hit brick wall 😉</p><hr><p>See you next year! Maybe in Rust, maybe not 🙃</p></div><footer class="row docusaurus-mt-lg blogPostFooterDetailsFull_mRVl"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/advent-of-code">advent-of-code</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/advent-of-code-2022">advent-of-code-2022</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/rust">rust</a></li></ul></div><div class="col margin-top--sm"><a href="https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/04-week-4.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/blog/2023/08/02/copr"><div class="pagination-nav__sublabel">Newer Post</div><div class="pagination-nav__label">How can Copr help with broken dependencies</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/blog/aoc-2022/3rd-week"><div class="pagination-nav__sublabel">Older Post</div><div class="pagination-nav__label">3rd week of Advent of Code &#x27;22 in Rust</div></a></nav></main><div class="col col--2"><div class="tableOfContents_bqdL thin-scrollbar"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#day-22-monkey-map" class="table-of-contents__link toc-highlight">Day 22: Monkey Map</a><ul><li><a href="#solution" class="table-of-contents__link toc-highlight">Solution</a></li></ul></li><li><a href="#day-23-unstable-diffusion" class="table-of-contents__link toc-highlight">Day 23: Unstable Diffusion</a><ul><li><a href="#solution-1" class="table-of-contents__link toc-highlight">Solution</a></li></ul></li><li><a href="#day-24-blizzard-basin" class="table-of-contents__link toc-highlight">Day 24: Blizzard Basin</a><ul><li><a href="#solution-2" class="table-of-contents__link toc-highlight">Solution</a></li></ul></li><li><a href="#day-25-full-of-hot-air" class="table-of-contents__link toc-highlight">Day 25: Full of Hot Air</a><ul><li><a href="#solution-3" class="table-of-contents__link toc-highlight">Solution</a></li></ul></li><li><a href="#summary" class="table-of-contents__link toc-highlight">Summary</a><ul><li><a href="#advent-of-code" class="table-of-contents__link toc-highlight">Advent of Code</a></li><li><a href="#with-rust" class="table-of-contents__link toc-highlight">with Rust</a></li></ul></li></ul></div></div></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Git</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/mfocko" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://gitlab.com/mfocko" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitLab<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://git.mfocko.xyz/mfocko" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitea (self-hosted)<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">Social #1</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://www.linkedin.com/in/mfocko/" target="_blank" rel="noopener noreferrer" class="footer__link-item">LinkedIn<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://fosstodon.org/@m4tt_314" target="_blank" rel="noopener noreferrer" class="footer__link-item">Fosstodon<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://hachyderm.io/@m4tt_314" target="_blank" rel="noopener noreferrer" class="footer__link-item">Hachyderm.io<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">Social #2</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://twitter.com/m4tt_314" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://twitch.tv/m4tt_314" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitch<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://ko-fi.com/m4tt_314" target="_blank" rel="noopener noreferrer" class="footer__link-item">Ko-fi<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 Matej Focko.</div></div></div></footer></div>
<script src="/assets/js/runtime~main.05f83fa7.js"></script>
<script src="/assets/js/main.9283b308.js"></script>
</body>
</html>