1
0
Fork 0
mirror of https://github.com/mfocko/blog.git synced 2025-04-15 17:33:40 +02:00
blog/blog/aoc-2022/2nd-week/index.html
github-actions[bot] c157f1c727 deploy: 31424770ce
2023-09-17 14:30:38 +00:00

172 lines
No EOL
276 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.

<!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">2nd 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/2nd-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="2nd week of Advent of Code &#x27;22 in Rust | mf"><meta data-rh="true" name="description" content="Surviving second week in Rust."><meta data-rh="true" property="og:description" content="Surviving second week in Rust."><meta data-rh="true" property="og:type" content="article"><meta data-rh="true" property="article:published_time" content="2022-12-25T23:15: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/2nd-week/"><link data-rh="true" rel="alternate" href="https://blog.mfocko.xyz/blog/aoc-2022/2nd-week/" hreflang="en"><link data-rh="true" rel="alternate" href="https://blog.mfocko.xyz/blog/aoc-2022/2nd-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.bfa6f67a.js" as="script">
<link rel="preload" href="/assets/js/main.9f54e33a.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 class="sidebarItemLink_mo7H" 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 aria-current="page" class="sidebarItemLink_mo7H sidebarItemLinkActive_I1ZP" 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">2nd week of Advent of Code &#x27;22 in Rust</h1><div class="container_mt6G margin-vert--md"><time datetime="2022-12-25T23:15:00.000Z" itemprop="datePublished">December 25, 2022</time> · <!-- -->21 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 second 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-8-treetop-tree-house"><a href="https://adventofcode.com/2022/day/8" target="_blank" rel="noopener noreferrer">Day 8: Treetop Tree House</a><a href="#day-8-treetop-tree-house" class="hash-link" aria-label="Direct link to day-8-treetop-tree-house" title="Direct link to day-8-treetop-tree-house"></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>We get a forest and we want to know how many trees are visible from the outside.
Apart from that we want to find the best view.</p></div></div><p>Nothing interesting. We are moving around 2D map though. And indexing can get a
bit painful when doing so, let&#x27;s refactor it a bit ;) During the preparation for
the AoC, I have written <code>Vector2D</code> and now it&#x27;s time to extend it with indexing
of <code>Vec</code> of <code>Vec</code>s. In my solution I was manipulating with indices in the following
way:</p><ul><li>swapping them</li><li>checking whether they are correct indices for the <code>Vec&lt;Vec&lt;T&gt;&gt;</code></li><li>indexing <code>Vec&lt;Vec&lt;T&gt;&gt;</code> with them</li></ul><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&#x27;m getting familiar with Rust and starting to “abuse” it… While doing so, I&#x27;m
also uncovering some “features” that I don&#x27;t really like. Therefore I will mark
all of my rants with <em>thicc</em> <strong>«↯»</strong> mark and will try to “lock” them into their
own “box of hell”.</p></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="swapping-indices">Swapping indices<a href="#swapping-indices" class="hash-link" aria-label="Direct link to Swapping indices" title="Direct link to Swapping indices"></a></h4><p>Relatively simple implementation, just take the values, swap them and return new
vector.</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 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)">Copy</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)">Vector2D</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)">swap</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)">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 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"> x</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)">self</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"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> y</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)">self</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><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"></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>Pretty straight-forward implementation, but let&#x27;s talk about the <code>T: Copy</code>. We
need to use it, since we are returning a <strong>new</strong> vector, with swapped <strong>values</strong>.
If we had values that cannot be copied, the only thing we could do, would be a
vector of references (and it would also introduce a lifetime, to which we&#x27;ll get
later on). This is pretty similar with the operations on sets from the first week.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="indexing-vec">Indexing <code>Vec</code><a href="#indexing-vec" class="hash-link" aria-label="Direct link to indexing-vec" title="Direct link to indexing-vec"></a></h4><p>I will start with the indexing, cause bound-checking is a bit more… complicated
than I would like to.</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)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">index</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 punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">U</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">v</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)">U</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"> idx</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)">Vector2D</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 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 lifetime-annotation symbol">&#x27;a</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">U</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)">where</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)">usize</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)">TryFrom</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 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)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 class-name" style="color:rgb(38, 127, 153)">TryFrom</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 class-name" style="color:rgb(38, 127, 153)">Error</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)">Debug</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)">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)">Copy</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)">let</span><span class="token plain"> </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 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 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 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 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">idx</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 function" style="color:rgb(0, 0, 255)">try_into</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 plain"> idx</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 function" style="color:rgb(0, 0, 255)">try_into</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 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 plain">v</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><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>Let&#x27;s talk about this mess… Body of the function is probably the most easy part
and should not be hard to understand, we just take the <code>x</code> and <code>y</code> and convert
them both to <code>usize</code> type that can be used later on for indexing.</p><p>The type signature of the function is where the fun is at 😉 We are trying
to convert unknown type to <code>usize</code>, so we must bound the <code>T</code> as a type that can
be converted to <code>usize</code>, that&#x27;s how we got <code>usize: TryFrom&lt;T&gt;</code> which basically
says that <code>usize</code> must implement <code>TryFrom&lt;T&gt;</code> trait and therefore allows us to
convert the indices to actual <code>usize</code> indices. Using <code>.unwrap()</code> also forces us
to bound the error that can occur when converting <code>T</code> into <code>usize</code>, that&#x27;s how
we get <code>&lt;usize as TryFrom&lt;T&gt;&gt;::Error: Debug</code> which loosely means</p><blockquote><p>error during conversion of <code>T</code> into <code>usize</code> must implement <code>Debug</code>,
i.e. can be printed in some way or other</p></blockquote><p><code>T: Copy</code> is required by <code>.try_into()</code> which takes <code>T</code> by-value.</p><p>And now we are left only with the first line of the definition.</p><div class="theme-admonition theme-admonition-note alert alert--secondary admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_S0QG"><p>Skilled Rustaceans might notice that this implementation is rather flaky and can
break in multiple places at once. I&#x27;ll get back to it…</p></div></div><p>Let&#x27;s split it in multiple parts:</p><ul><li><code>v: &amp;&#x27;a [Vec&lt;U&gt;]</code> represents the 2D <code>Vec</code>, we are indexing, <code>Vec</code> implements
<code>Slice</code> trait and <em>clippy</em> recommends using <code>&amp;[T]</code> to <code>&amp;Vec&lt;T&gt;</code>, exact details
are unknown to me</li><li><code>idx: &amp;Vector2D&lt;T&gt;</code> represents the <em>indices</em> which we use, we take them by
reference to avoid an unnecessary copy</li><li><code>-&gt; &amp;&#x27;a U</code> means that we are returning a <em>reference</em> to some value of type <code>U</code>.
Now the question is what does the <code>&#x27;a</code> mean, we can also see it as a generic
type declared along <code>T</code> and <code>U</code>. And the answer is <em>relatively</em> simple, <code>&#x27;a</code>
represents a <em>lifetime</em>. We take the <code>v</code> by a reference and return a reference,
borrow checker validates all of the <em>borrows</em> (or references), so we need to
specify that our returned value has <em>the same lifetime</em> as the vector we have
taken by a reference, i.e. returned reference must live at least as long as the
<code>v</code>. This way we can “be sure” that the returned reference is valid.</li></ul><h5 class="anchor anchorWithStickyNavbar_LWe7" id="issues">Issues<a href="#issues" class="hash-link" aria-label="Direct link to Issues" title="Direct link to Issues"></a></h5><p>First issue that our implementation has is the fact that we cannot get a mutable
reference out of that function. This could be easily resolved by introducing new
function, e.g. <code>index_mut</code>. Which I have actually done while writing this part:</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)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">index_mut</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 punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">U</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">v</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 keyword" style="color:rgb(0, 0, 255)">mut</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)">U</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"> idx</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)">Vector2D</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 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 lifetime-annotation symbol">&#x27;a</span><span class="token plain"> </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)">U</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)">where</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)">usize</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)">TryFrom</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 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)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 class-name" style="color:rgb(38, 127, 153)">TryFrom</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 class-name" style="color:rgb(38, 127, 153)">Error</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)">Debug</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)">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)">Copy</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)">let</span><span class="token plain"> </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 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 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 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 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">idx</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 function" style="color:rgb(0, 0, 255)">try_into</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 plain"> idx</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 function" style="color:rgb(0, 0, 255)">try_into</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 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"> v</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><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><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><mdxadmonitiontitle><strong>«↯»</strong> Why can&#x27;t we use one function?</mdxadmonitiontitle></div><div class="admonitionContent_S0QG"><p>When we consider a <code>Vec&lt;T&gt;</code>, we don&#x27;t need to consider containers as <code>T</code>, Rust
implements indexing as traits <code>Index&lt;T&gt;</code> and <code>IndexMut&lt;T&gt;</code> that do the dirty work
behind syntactic sugar of <code>container[idx]</code>.</p><p>However, implementing of traits is not allowed for <em>external</em> types, i.e. types
that you haven&#x27;t defined yourself. This means that you can implement indexing
over containers that you have implemented yourself, but you cannot use your own
types for indexing “built-in” types.</p><p>Another part of this rabbit hole is trait <code>SliceIndex&lt;T&gt;</code> that is of a relevance
because of</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 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)">I</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)">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)">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)">for</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)">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"></span><span class="token keyword" style="color:rgb(0, 0, 255)">where</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)">I</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)">SliceIndex</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</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 operator" style="color:rgb(0, 0, 0)">&gt;</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)">I</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)">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)">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)">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)">for</span><span class="token plain"> </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 punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">A</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</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)">where</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)">I</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)">SliceIndex</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</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 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><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)">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)">Allocator</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)">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)">const</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">N</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 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)">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)">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)">for</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)">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)">N</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)">where</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 class-name" style="color:rgb(38, 127, 153)">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><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)">I</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</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>In other words, if your type implements <code>SliceIndex&lt;T&gt;</code> trait, it can be used
for indexing. As of now, this trait has all of its required methods experimental
and is marked as <code>unsafe</code>.</p></div></div><p>Another problem is a requirement for indexing either <code>[Vec&lt;T&gt;]</code> or <code>Vec&lt;Vec&lt;T&gt;&gt;</code>.
This requirement could be countered by removing inner type <code>Vec&lt;T&gt;</code> and constraining
it by a trait <code>Index</code> (or <code>IndexMut</code> respectively) in a following way</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)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">index</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)">C</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 punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">v</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)">C</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"> idx</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)">Vector2D</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 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 lifetime-annotation symbol">&#x27;a</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">C</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><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">where</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)">usize</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)">TryFrom</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 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)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 class-name" style="color:rgb(38, 127, 153)">TryFrom</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 class-name" style="color:rgb(38, 127, 153)">Error</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)">Debug</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)">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)">Copy</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)">C</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)">Index</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</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)">let</span><span class="token plain"> </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 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 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 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 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">idx</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 function" style="color:rgb(0, 0, 255)">try_into</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 plain"> idx</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 function" style="color:rgb(0, 0, 255)">try_into</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 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 plain">v</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><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, we can also give a more meaningful typename for indexing type, such
as <code>I</code>.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="checking-bounds">Checking bounds<a href="#checking-bounds" class="hash-link" aria-label="Direct link to Checking bounds" title="Direct link to Checking bounds"></a></h4><p>Now we can get to the boundary checks, it is very similar, but a more… dirty.
First approach that came up was to convert the indices in <code>Vector2D</code> to <code>usize</code>,
but when you add the indices up, e.g. when checking the neighbors, you can end
up with negative values which, unlike in C++, causes an error (instead of underflow
that you can use to your advantage; you can easily guess how).</p><p>So how can we approach this then? Well… we will convert the bounds instead of
the indices and that lead us to:</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)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">in_range</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)">U</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">v</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 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)">U</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"> idx</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)">Vector2D</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 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 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)">where</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)">usize</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)">TryInto</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 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)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 class-name" style="color:rgb(38, 127, 153)">TryInto</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 class-name" style="color:rgb(38, 127, 153)">Error</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)">Debug</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)">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)">PartialOrd</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 class-name" style="color:rgb(38, 127, 153)">Copy</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"> idx</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">y </span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;=</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 function" style="color:rgb(0, 0, 255)">try_into</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 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;&amp;</span><span class="token plain"> idx</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">y </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token plain"> v</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 function" style="color:rgb(0, 0, 255)">try_into</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 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;&amp;</span><span class="token plain"> idx</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">x </span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;=</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 function" style="color:rgb(0, 0, 255)">try_into</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 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;&amp;</span><span class="token plain"> idx</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">x</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)">&lt;</span><span class="token plain"> v</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token class-name" style="color:rgb(38, 127, 153)">TryInto</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)">usize</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 function" style="color:rgb(0, 0, 255)">try_into</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">idx</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 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 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)">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><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)">try_into</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</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>You can tell that it&#x27;s definitely a shitty code. Let&#x27;s improve it now! We will
get back to the original idea, but do it better. We know that we cannot convert
negative values into <code>usize</code>, <strong>but</strong> we also know that conversion like that
returns a <code>Result&lt;T, E&gt;</code> which we can use to our advantage.</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)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">in_range</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)">U</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">v</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 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)">U</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"> idx</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)">Vector2D</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 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 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)">where</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)">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)">Copy</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)">usize</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)">TryFrom</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 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)">usize</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">try_from</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">idx</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"></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)">and_then</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">y</span><span class="token closure-params closure-punctuation 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 function" style="color:rgb(0, 0, 255)">try_from</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">idx</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 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">x</span><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token plain"> y </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token plain"> v</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 operator" style="color:rgb(0, 0, 0)">&amp;&amp;</span><span class="token plain"> x </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token plain"> v</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 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 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 boolean">false</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><code>Result&lt;T, E&gt;</code> is a type similar to <code>Either</code> in Haskell and it allows us to chain
multiple operations on correct results or propagate the original error without
doing anything. Let&#x27;s dissect it one-by-one.</p><p><code>try_from</code> is a method implemented in <code>TryFrom</code> trait, that allows you to convert
types and either successfully convert them or fail (with a reasonable error). This
method returns <code>Result&lt;T, E&gt;</code>.</p><p>We call <code>and_then</code> on that <em>result</em>, let&#x27;s have a look at the type signature of
<code>and_then</code>, IMO it explains more than enough:</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)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">and_then</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">U</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)">F</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 keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> op</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)">F</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)">Result</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">U</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)">E</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</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)">where</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)">F</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)">FnOnce</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</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)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Result</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">U</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)">E</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</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>OK… So it takes the result and a function and returns another result with
different value and different error. However we can see that the function, which
represents an operation on a result, takes just the value, i.e. it doesn&#x27;t care
about any previous error. To make it short:</p><blockquote><p><code>and_then</code> allows us to run an operation, which can fail, on the correct result</p></blockquote><p>We parsed a <code>y</code> index and now we try to convert the <code>x</code> index with <code>try_from</code>
again, but on that result we use <code>map</code> rather than <code>and_then</code>, why would that be?</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)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">map</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">U</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)">F</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 keyword" style="color:rgb(0, 0, 255)">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> op</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)">F</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)">Result</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">U</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)">E</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</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)">where</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)">F</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)">FnOnce</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</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)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">U</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>Huh… <code>map</code> performs an operation that <strong>cannot</strong> fail. And finally we use
<code>unwrap_or</code> which takes the value from result, or in case of an error returns the
default that we define.</p><p>How does this work then? If <code>y</code> is negative, the conversion fails and the error
propagates all the way to <code>unwrap_or</code>, if <code>y</code> can be a correct <code>usize</code> value, then
we do the same with <code>x</code>. If <code>x</code> is negative, we propagate the error as with <code>y</code>,
and if it&#x27;s not, then we check whether it exceeds the higher bounds or not.</p><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>Relatively simple, you just need follow the rules and not get too smart, otherwise
it will get back at you.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="day-9-rope-bridge"><a href="https://adventofcode.com/2022/day/9" target="_blank" rel="noopener noreferrer">Day 9: Rope Bridge</a><a href="#day-9-rope-bridge" class="hash-link" aria-label="Direct link to day-9-rope-bridge" title="Direct link to day-9-rope-bridge"></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>We get a rope with knots and we want to track how many different positions are
visited with the rope&#x27;s tail.</p></div></div><p>By this day, I have come to a conclusion that current skeleton for each day
generates a lot of boilerplate. And even though it can be easily copied, it&#x27;s
just a waste of space and unnecessary code. Let&#x27;s “simplify” this (on one end
while creating monster on the other end). I&#x27;ve gone through what we need in the
preparations for the AoC. Let&#x27;s sum up our requirements:</p><ul><li>parsing</li><li>part 1 &amp; 2</li><li>running on sample / input</li><li>tests</li></ul><p>Parsing and implementation of both parts is code that changes each day and we
cannot do anything about it. However running and testing can be simplified!</p><p>Let&#x27;s introduce and export a new module <code>solution</code> that will take care of all of
this. We will start by introducing a trait for each day.</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)">trait</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">Solution</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</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 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><span class="token class-name" style="color:rgb(38, 127, 153)">Display</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)">parse_input</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">P</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)">AsRef</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">Path</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">pathname</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)">P</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)">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" 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)">part_1</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 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)">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 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)">part_2</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 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)">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>This does a lot of work for us already, we have defined a trait and for each day
we will create a structure representing a specific day. That structure will also
implement the <code>Solution</code> trait.</p><p>Now we need to get rid of the boilerplate, we can&#x27;t get rid of the <code>main</code> function,
but we can at least move out the functionality.</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)">run</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">type_of_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 keyword" style="color:rgb(0, 0, 255)">str</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)">Result</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</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 operator" style="color:rgb(0, 0, 0)">&gt;</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)">where</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"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Sized</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 namespace">tracing_subscriber</span><span class="token namespace punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">fmt</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)">with_env_filter</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token class-name" style="color:rgb(38, 127, 153)">EnvFilter</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">from_default_env</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 function" style="color:rgb(0, 0, 255)">with_target</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token boolean">false</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)">with_file</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token boolean">true</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)">with_line_number</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token boolean">true</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)">without_time</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)">compact</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)">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 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 namespace">color_eyre</span><span class="token namespace punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">install</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 operator" style="color:rgb(0, 0, 0)">?</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"> input </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 function" style="color:rgb(0, 0, 255)">parse_input</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token macro property">format!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;{}s/{}.txt&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> type_of_input</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)">Self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">day</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 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 macro property">info!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;Part 1: {}&quot;</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)">Self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">part_1</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">input</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 macro property">info!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;Part 2: {}&quot;</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)">Self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">part_2</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">input</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 class-name" style="color:rgb(38, 127, 153)">Ok</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 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)">main</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)">Result</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</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 operator" style="color:rgb(0, 0, 0)">&gt;</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)">where</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"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Sized</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)">Self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">run</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;input&quot;</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 is all part of the <code>Solution</code> trait, which can implement methods while being
dependent on what is provided by the implementing types. In this case, we just
need to bound the <code>Output</code> type to implement <code>Display</code> that is necessary for the
<code>info!</code> and format string there.</p><p>Now we can get to first of the nasty things we are going to do… And it is the
<code>day()</code> method that you can see being used when constructing path to the input
file. That method will generate a name of the file, e.g. <code>day01</code> and we know that
we can <em>somehow</em> deduce it from the structure name, given we name it reasonably.</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)">day</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)">String</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"> day </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)">String</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">from</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token function" style="color:rgb(0, 0, 255)">type_name</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)">Self</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 punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">split</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;::&quot;</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)">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 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"> day</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">make_ascii_lowercase</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"> day</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">to_string</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><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><mdxadmonitiontitle><code>type_name</code></mdxadmonitiontitle></div><div class="admonitionContent_S0QG"><p>This feature is still experimental and considered to be internal, it is not
advised to use it any production code.</p></div></div><p>And now we can get to the nastiest stuff 😩 We will <strong>generate</strong> the tests!</p><p>We want to be able to generate tests for sample input in a following way:</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 macro property">test_sample!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">day_01</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)">Day01</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)">42</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)">69</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>There&#x27;s not much we can do, so we will write a macro to generate the tests for us.</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)">#[macro_export]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token macro property">macro_rules!</span><span class="token plain"> test_sample </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 variable" style="color:rgb(9, 134, 88)">$mod_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token fragment-specifier punctuation" style="color:rgb(4, 81, 165)">ident</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">$day_struct</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token fragment-specifier punctuation" style="color:rgb(4, 81, 165)">tt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">$part_1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token fragment-specifier punctuation" style="color:rgb(4, 81, 165)">expr</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">$part_2</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token fragment-specifier punctuation" style="color:rgb(4, 81, 165)">expr</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)">=&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 attribute attr-name" style="color:rgb(255, 0, 0)">#[cfg(test)]</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)">mod</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">$mod_name</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)">use</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">super</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 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 attribute attr-name" style="color:rgb(255, 0, 0)">#[test]</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)">test_part_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 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"> sample </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">$day_struct</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">parse_input</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 macro property">format!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;samples/{}.txt&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">$day_struct</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">day</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 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 macro property">assert_eq!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token variable" style="color:rgb(9, 134, 88)">$day_struct</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">part_1</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">sample</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 variable" style="color:rgb(9, 134, 88)">$part_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 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 attribute attr-name" style="color:rgb(255, 0, 0)">#[test]</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)">test_part_2</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)">let</span><span class="token plain"> sample </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">$day_struct</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">parse_input</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 macro property">format!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;samples/{}.txt&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(9, 134, 88)">$day_struct</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">day</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 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 macro property">assert_eq!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token variable" style="color:rgb(9, 134, 88)">$day_struct</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">part_2</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">sample</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 variable" style="color:rgb(9, 134, 88)">$part_2</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"> </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>We have used it in a similar way as macros in C/C++, one of the things that we
can use to our advantage is defining “type” of the parameters for the macro. All
parameters have their name prefixed with <code>$</code> sign and you can define various “forms”
of your macro. Let&#x27;s go through it!</p><p>We have following parameters:</p><ul><li><code>$mod_name</code> which represents the name for the module with tests, it is typed
with <code>ident</code> which means that we want a valid identifier to be passed in.</li><li><code>$day_struct</code> represents the structure that will be used for tests, it is typed
with <code>tt</code> which represents a <em>token tree</em>, in our case it is a type.</li><li><code>$part_X</code> represents the expected output for the <code>X</code>th part and is of type <code>expr</code>
which literally means an <em>expression</em>.</li></ul><p>Apart from that we need to use <code>#[macro_export]</code> to mark the macro as exported
for usage outside of the module. Now our skeleton looks like:</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">aoc_2022</span><span class="token namespace punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token operator" style="color:rgb(0, 0, 0)">*</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)">type</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">Input</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 class-name" style="color:rgb(38, 127, 153)">String</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 class-name" style="color:rgb(38, 127, 153)">String</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)">struct</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">DayXX</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 plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Solution</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</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 class-name" style="color:rgb(38, 127, 153)">Output</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)">DayXX</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)">parse_input</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">P</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)">AsRef</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">Path</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">pathname</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)">P</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)">Input</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)">file_to_string</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pathname</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)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">part_1</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 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)">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 macro property">todo!</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)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">part_2</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 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)">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 macro property">todo!</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)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">main</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)">Result</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</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 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)">// DayXX::run(&quot;sample&quot;)</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)">DayXX</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token function" style="color:rgb(0, 0, 255)">main</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 comment" style="color:rgb(0, 128, 0)">// test_sample!(day_XX, DayXX, , );</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><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>Not much to talk about, it is relatively easy to simulate.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="day-10-cathode-ray-tube"><a href="https://adventofcode.com/2022/day/10" target="_blank" rel="noopener noreferrer">Day 10: Cathode-Ray Tube</a><a href="#day-10-cathode-ray-tube" class="hash-link" aria-label="Direct link to day-10-cathode-ray-tube" title="Direct link to day-10-cathode-ray-tube"></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>Emulating basic arithmetic operations on a CPU and drawing on CRT based on the
CPU&#x27;s accumulator.</p></div></div><p>In this day I have discovered an issue with my design of the <code>Solution</code> trait.
And the issue is caused by different types of <code>Output</code> for the part 1 and part 2.</p><p>Problem is relatively simple and consists of simulating a CPU, I have approached
it in a following way:</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)">evaluate_instructions</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">instructions</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 punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token class-name" style="color:rgb(38, 127, 153)">Instruction</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)">mut</span><span class="token plain"> out</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)">Output</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 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"> instructions</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)">State</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><span class="token closure-params closure-punctuation punctuation" style="color:rgb(4, 81, 165)">|</span><span class="token closure-params">state</span><span class="token closure-params punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token closure-params"> instruction</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"> state</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">execute</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">instruction</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 keyword" style="color:rgb(0, 0, 255)">mut</span><span class="token plain"> out</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"> out</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>We just take the instructions, we have some state of the CPU and we execute the
instructions one-by-one. Perfect usage of the <code>fold</code> (or <code>reduce</code> as you may know
it from other languages).</p><p>You can also see that we have an <code>Output</code> type, so the question is how can we fix
that problem. And the answer is very simple and <em>functional</em>. Rust allows you to
have an <code>enumeration</code> that can <em>bear</em> some other values apart from the type itself.</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>tip</div><div class="admonitionContent_S0QG"><p>We could&#x27;ve seen something like this with the <code>Result&lt;T, E&gt;</code> type that can be
defined as</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)">enum</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">Result</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)">E</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)">Ok</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</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 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)">Err</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token class-name" style="color:rgb(38, 127, 153)">E</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><h6 class="anchor anchorWithStickyNavbar_LWe7" id="what-does-that-mean-though">What does that mean though?<a href="#what-does-that-mean-though" class="hash-link" aria-label="Direct link to What does that mean though?" title="Direct link to What does that mean though?"></a></h6><p>When we have an <code>Ok</code> value, it has the result itself, and when we get an <code>Err</code>
value, it has the error. This also allows us to handle <em>results</em> in a rather
pretty way:</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)">match</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">do_something</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 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)">Ok</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"> </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 macro property">println!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;SUCCESS: {}&quot;</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"></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 class-name" style="color:rgb(38, 127, 153)">Err</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"> </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 macro property">eprintln!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;ERROR: {}&quot;</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"></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></div></div><p>My solution has a following outline:</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)">execute</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"> i</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)">Instruction</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> output</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 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)">Output</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)">State</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)">// execute the instruction</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)">// collect results if necessary</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)">match</span><span class="token plain"> 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 class-name" style="color:rgb(38, 127, 153)">Output</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token class-name" style="color:rgb(38, 127, 153)">Part1</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)">=&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 function" style="color:rgb(0, 0, 255)">execute_part_1</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"> 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 class-name" style="color:rgb(38, 127, 153)">Output</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token class-name" style="color:rgb(38, 127, 153)">Part2</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)">=&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 function" style="color:rgb(0, 0, 255)">execute_part_2</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"> 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><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)">// return the obtained state</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> new_state</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>You might think that it&#x27;s a perfectly reasonable thing to do. Yes, <strong>but</strong> notice
that the <code>match</code> statement doesn&#x27;t <em>collect</em> the changes in any way and also we
pass <code>output</code> by <code>&amp;mut</code>, so it is shared across each <em>iteration</em> of the <code>fold</code>.</p><p>The dirty and ingenious thing is that <code>x</code>s are passed by <code>&amp;mut</code> too and therefore
they are directly modified by the helper functions. To sum it up and let it sit</p><blockquote><p>We are <strong>collecting</strong> the result <strong>into</strong> an <strong>enumeration</strong> that is <strong>shared</strong>
across <strong>all</strong> iterations of <code>fold</code>.</p></blockquote><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>Similar to <em>Day 9</em>, but there are some technical details that can get you.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="day-11-monkey-in-the-middle"><a href="https://adventofcode.com/2022/day/11" target="_blank" rel="noopener noreferrer">Day 11: Monkey in the Middle</a><a href="#day-11-monkey-in-the-middle" class="hash-link" aria-label="Direct link to day-11-monkey-in-the-middle" title="Direct link to day-11-monkey-in-the-middle"></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>Simulation of monkeys throwing stuff around and measuring your stress levels
while your stuff is being passed around.</p></div></div><p>I think I decided to use regular expressions here for the first time, cause
parsing the input was a pain.</p><p>Also I didn&#x27;t expect to implement Euclidean algorithm in Rust…</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>Again, we&#x27;re just running a simulation. Though I must admit it was very easy to
make a small technical mistakes that could affect the final results very late.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="day-12-hill-climbing-algorithm"><a href="https://adventofcode.com/2022/day/12" target="_blank" rel="noopener noreferrer">Day 12: Hill Climbing Algorithm</a><a href="#day-12-hill-climbing-algorithm" class="hash-link" aria-label="Direct link to day-12-hill-climbing-algorithm" title="Direct link to day-12-hill-climbing-algorithm"></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>Finding shortest path up the hill and also shortest path down to the ground while
also rolling down the hill…</p></div></div><p>As I have said in the <em>tl;dr</em>, we are looking for the shortest path, but the start
and goal differ for the part 1 and 2. So I have decided to refactor my solution
to a BFS algorithm that takes necessary parameters via functions:</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)">bfs</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">F</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)">G</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><br></span><span class="token-line" style="color:#000000"><span class="token plain"> graph</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 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 keyword" style="color:rgb(0, 0, 255)">char</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"> start</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)">Position</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> has_edge</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)">F</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> is_target</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)">G</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 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)">usize</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</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)">where</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)">F</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)">Fn</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 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 keyword" style="color:rgb(0, 0, 255)">char</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 operator" style="color:rgb(0, 0, 0)">&amp;</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 operator" style="color:rgb(0, 0, 0)">&amp;</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 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 class-name" style="color:rgb(38, 127, 153)">G</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)">Fn</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 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 keyword" style="color:rgb(0, 0, 255)">char</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 operator" style="color:rgb(0, 0, 0)">&amp;</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 keyword" style="color:rgb(0, 0, 255)">bool</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>We pass the initial vertex from the caller and everything else is left to the BFS
algorithm, based on the <code>has_edge</code> and <code>is_target</code> functions.</p><p>This was easy! And that is not very usual in Rust once you want to pass around
functions. 👀</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="solution-4">Solution<a href="#solution-4" class="hash-link" aria-label="Direct link to Solution" title="Direct link to Solution"></a></h3><p>Looking for the shortest path… Must be Dijkstra, right? <strong>Nope!</strong> Half of the
Reddit got jebaited though. In all fairness, nothing stops you from implementing
the Dijkstra&#x27;s algorithm for finding the shortest path, <strong>but</strong> if you know that
all connected vertices are in a unit (actually <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">d = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em"></span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">1</span></span></span></span></span>) distance from each other,
then you know that running Dijkstra is equivalent to running BFS, only with worse
time complexity, because of the priority heap instead of the queue.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="day-13-distress-signal"><a href="https://adventofcode.com/2022/day/13" target="_blank" rel="noopener noreferrer">Day 13: Distress Signal</a><a href="#day-13-distress-signal" class="hash-link" aria-label="Direct link to day-13-distress-signal" title="Direct link to day-13-distress-signal"></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>Processing packets with structured data from the distress signal.</p></div></div><p>You can implement a lot of traits if you want to. It is <em>imperative</em> to implement
ordering on the packets. I had a typo, so I also proceeded to implement a <code>Display</code>
trait for debugging purposes:</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)">Display</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)">Packet</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)">fmt</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"> f</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 keyword" style="color:rgb(0, 0, 255)">mut</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">fmt</span><span class="token namespace punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token class-name" style="color:rgb(38, 127, 153)">Formatter</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token lifetime-annotation symbol">&#x27;_</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)">-&gt;</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">fmt</span><span class="token namespace punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token class-name" style="color:rgb(38, 127, 153)">Result</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)">match</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 class-name" style="color:rgb(38, 127, 153)">Packet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token class-name" style="color:rgb(38, 127, 153)">Integer</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)">=&gt;</span><span class="token plain"> </span><span class="token macro property">write!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">f</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;{x}&quot;</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 class-name" style="color:rgb(38, 127, 153)">Packet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">::</span><span class="token class-name" style="color:rgb(38, 127, 153)">List</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">lst</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)">=&gt;</span><span class="token plain"> </span><span class="token macro property">write!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">f</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">&quot;[{}]&quot;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> lst</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 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">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 macro property">format!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;{p}&quot;</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)">join</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;,&quot;</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"></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><h3 class="anchor anchorWithStickyNavbar_LWe7" id="solution-5">Solution<a href="#solution-5" class="hash-link" aria-label="Direct link to Solution" title="Direct link to Solution"></a></h3><p>A lot of technical details… Parsing is nasty too…</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="day-14-regolith-reservoir"><a href="https://adventofcode.com/2022/day/14" target="_blank" rel="noopener noreferrer">Day 14: Regolith Reservoir</a><a href="#day-14-regolith-reservoir" class="hash-link" aria-label="Direct link to day-14-regolith-reservoir" title="Direct link to day-14-regolith-reservoir"></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>Let&#x27;s simulate falling sand grain-by-grain.</p></div></div><p>Again, both parts are relatively similar with minimal changes, so it is a good
idea to refactor it a bit. Similar approach to the <a href="#day-12-hill-climbing-algorithm">BFS above</a>. Also this is the
first day where I ran into efficiency issues and had to redo my solution to speed
it up just a bit.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="solution-6">Solution<a href="#solution-6" class="hash-link" aria-label="Direct link to Solution" title="Direct link to Solution"></a></h3><p>Tedious.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="post-mortem">Post Mortem<a href="#post-mortem" class="hash-link" aria-label="Direct link to Post Mortem" title="Direct link to Post Mortem"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="indexing">Indexing<a href="#indexing" class="hash-link" aria-label="Direct link to Indexing" title="Direct link to Indexing"></a></h3><p>I was asked about the indexing after publishing the blog. And truly it is rather
complicated topic, especially after releasing <code>SliceIndex&lt;I&gt;</code> trait. I couldn&#x27;t
leave it be, so I tried to implement the <code>Index</code> and <code>IndexMut</code> trait.</p><div class="theme-admonition theme-admonition-note alert alert--secondary admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_S0QG"><p>I have also mentioned that the <code>SliceIndex</code> trait is <code>unsafe</code>, but truth be told,
only <em>unsafe</em> part are the 2 methods that are named <code>*unchecked*</code>. Anyways, I will
be implementing the <code>Index*</code> traits for now, rather than the <code>SliceIndex</code>.</p></div></div><p>It&#x27;s relatively straightforward…</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 operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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)">C</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)">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)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;&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 punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token class-name" style="color:rgb(38, 127, 153)">C</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)">where</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)">I</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)">Copy</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 class-name" style="color:rgb(38, 127, 153)">TryInto</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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 class-name" style="color:rgb(38, 127, 153)">TryInto</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 class-name" style="color:rgb(38, 127, 153)">Error</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)">Debug</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)">C</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)">Index</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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><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)">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 class-name" style="color:rgb(38, 127, 153)">C</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 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)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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)">-&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 keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> </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 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 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 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 operator" style="color:rgb(0, 0, 0)">=</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">index</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 function" style="color:rgb(0, 0, 255)">try_into</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 plain"> index</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 function" style="color:rgb(0, 0, 255)">try_into</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 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)">self</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><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)">I</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)">C</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)">IndexMut</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</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 class-name" style="color:rgb(38, 127, 153)">I</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;&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 punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token class-name" style="color:rgb(38, 127, 153)">C</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)">where</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)">I</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)">Copy</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 class-name" style="color:rgb(38, 127, 153)">TryInto</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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 class-name" style="color:rgb(38, 127, 153)">TryInto</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 class-name" style="color:rgb(38, 127, 153)">Error</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)">Debug</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)">C</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)">IndexMut</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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><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)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">index_mut</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"> 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)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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)">-&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)">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 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 keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> </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 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 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 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 operator" style="color:rgb(0, 0, 0)">=</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">index</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 function" style="color:rgb(0, 0, 255)">try_into</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 plain"> index</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 function" style="color:rgb(0, 0, 255)">try_into</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 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 keyword" style="color:rgb(0, 0, 255)">self</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><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>We can see a lot of similarities to the implementation of <code>index</code> and <code>index_mut</code>
functions. In the end, they are 1:1, just wrapped in the trait that provides a
syntax sugar for <code>container[idx]</code>.</p><div class="theme-admonition theme-admonition-note alert alert--secondary admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_S0QG"><p>I have also switched from using the <code>TryFrom</code> to <code>TryInto</code> trait, since it better
matches what we are using, the <code>.try_into</code> rather than <code>usize::try_from</code>.</p><p>Also implementing <code>TryFrom</code> automatically provides you with a <code>TryInto</code> trait,
since it is relatively easy to implement. Just compare the following:</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)">trait</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">TryFrom</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 plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Sized</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)">Error</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)">try_from</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><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 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)">-&gt;</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Result</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 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 class-name" style="color:rgb(38, 127, 153)">Error</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><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)">trait</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">TryInto</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 plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Sized</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)">Error</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)">try_into</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"> </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)">Result</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 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)">Error</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><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></div></div><p>OK, so we have our trait implemented, we should be able to use <code>container[index]</code>,
right? Yes… but actually no 😦</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">error[E0277]: the type `[std::vec::Vec&lt;i8&gt;]` cannot be indexed by `aoc_2022::Vector2D&lt;usize&gt;`</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> --&gt; src/bin/day08.rs:26:18</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">26 | if trees[pos] &gt; tallest {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> | ^^^ slice indices are of type `usize` or ranges of `usize`</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"> = help: the trait `std::slice::SliceIndex&lt;[std::vec::Vec&lt;i8&gt;]&gt;` is not implemented for `aoc_2022::Vector2D&lt;usize&gt;`</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> = note: required for `std::vec::Vec&lt;std::vec::Vec&lt;i8&gt;&gt;` to implement `std::ops::Index&lt;aoc_2022::Vector2D&lt;usize&gt;&gt;`</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">error[E0277]: the type `[std::vec::Vec&lt;i8&gt;]` cannot be indexed by `aoc_2022::Vector2D&lt;usize&gt;`</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> --&gt; src/bin/day08.rs:30:28</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">30 | max(tallest, trees[pos])</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> | ^^^ slice indices are of type `usize` or ranges of `usize`</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"> = help: the trait `std::slice::SliceIndex&lt;[std::vec::Vec&lt;i8&gt;]&gt;` is not implemented for `aoc_2022::Vector2D&lt;usize&gt;`</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> = note: required for `std::vec::Vec&lt;std::vec::Vec&lt;i8&gt;&gt;` to implement `std::ops::Index&lt;aoc_2022::Vector2D&lt;usize&gt;&gt;`</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">error[E0277]: the type `[std::vec::Vec&lt;i8&gt;]` cannot be indexed by `aoc_2022::Vector2D&lt;isize&gt;`</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> --&gt; src/bin/day08.rs:52:28</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">52 | let max_height = trees[position];</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> | ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`</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"> = help: the trait `std::slice::SliceIndex&lt;[std::vec::Vec&lt;i8&gt;]&gt;` is not implemented for `aoc_2022::Vector2D&lt;isize&gt;`</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> = note: required for `std::vec::Vec&lt;std::vec::Vec&lt;i8&gt;&gt;` to implement `std::ops::Index&lt;aoc_2022::Vector2D&lt;isize&gt;&gt;`</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>Why? We have it implemented for the slices (<code>[C]</code>), why doesn&#x27;t it work? Well,
the fun part consists of the fact that in other place, where we were using it,
we were passing the <code>&amp;[Vec&lt;T&gt;]</code>, but this is coming from a helper functions that
take <code>&amp;Vec&lt;Vec&lt;T&gt;&gt;</code> instead. And… we don&#x27;t implement <code>Index</code> and <code>IndexMut</code> for
those. Just for the slices. 🤯 <em>What are we going to do about it?</em></p><p>We can either start copy-pasting or be smarter about it… I choose to be smarter,
so let&#x27;s implement a macro! The only difference across the implementations are
the types of the outer containers. Implementation doesn&#x27;t differ <strong>at all</strong>!</p><p>Implementing the macro can be done in a following way:</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 macro property">macro_rules!</span><span class="token plain"> generate_indices </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 variable" style="color:rgb(9, 134, 88)">$container</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token fragment-specifier punctuation" style="color:rgb(4, 81, 165)">ty</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)">=&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)">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)">I</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)">C</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)">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)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;&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 variable" style="color:rgb(9, 134, 88)">$container</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)">where</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)">I</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)">Copy</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 class-name" style="color:rgb(38, 127, 153)">TryInto</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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 class-name" style="color:rgb(38, 127, 153)">TryInto</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 class-name" style="color:rgb(38, 127, 153)">Error</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)">Debug</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)">C</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)">Index</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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><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)">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 class-name" style="color:rgb(38, 127, 153)">C</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 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)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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)">-&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 keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> </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 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 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 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 operator" style="color:rgb(0, 0, 0)">=</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">index</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 function" style="color:rgb(0, 0, 255)">try_into</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 plain"> index</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 function" style="color:rgb(0, 0, 255)">try_into</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 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)">self</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><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)">I</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)">C</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)">IndexMut</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</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 class-name" style="color:rgb(38, 127, 153)">I</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;&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 variable" style="color:rgb(9, 134, 88)">$container</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)">where</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)">I</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)">Copy</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 class-name" style="color:rgb(38, 127, 153)">TryInto</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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><br></span><span class="token-line" style="color:#000000"><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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 class-name" style="color:rgb(38, 127, 153)">TryInto</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 class-name" style="color:rgb(38, 127, 153)">Error</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)">Debug</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)">C</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)">IndexMut</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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><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)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">index_mut</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"> 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)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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)">-&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)">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 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 keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> </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 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 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 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 operator" style="color:rgb(0, 0, 0)">=</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">index</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 function" style="color:rgb(0, 0, 255)">try_into</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 plain"> index</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 function" style="color:rgb(0, 0, 255)">try_into</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 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 keyword" style="color:rgb(0, 0, 255)">self</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><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"> </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>And now we can simply do</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 macro property">generate_indices!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token class-name" style="color:rgb(38, 127, 153)">VecDeque</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token class-name" style="color:rgb(38, 127, 153)">C</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 macro property">generate_indices!</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 class-name" style="color:rgb(38, 127, 153)">C</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 macro property">generate_indices!</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)">C</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 comment" style="color:rgb(0, 128, 0)">// generate_indices!([C; N], const N: usize);</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>The last type (I took the inspiration from the implementations of the <code>Index</code> and
<code>IndexMut</code> traits) is a bit problematic, because of the <code>const N: usize</code> part,
which I haven&#x27;t managed to be able to parse. And that&#x27;s how I got rid of the error.</p><div class="theme-admonition theme-admonition-note alert alert--secondary admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_S0QG"><p>If I were to use 2D-indexing over <code>[C; N]</code> slices, I&#x27;d probably just go with the
copy-paste, cause the cost of this “monstrosity” outweighs the benefits of no DRY.</p></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="cause-of-the-problem">Cause of the problem<a href="#cause-of-the-problem" class="hash-link" aria-label="Direct link to Cause of the problem" title="Direct link to Cause of the problem"></a></h4><p>This issue is relatively funny. If you don&#x27;t use any type aliases, just the raw
types, you&#x27;ll get suggested certain changes by the <em>clippy</em>. For example if you
consider the following piece of code</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_sum</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">nums</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)">Vec</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token keyword" style="color:rgb(0, 0, 255)">i32</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)">-&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">i32</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"> nums</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 function" style="color:rgb(0, 0, 255)">sum</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)">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:rgb(0, 0, 255)">main</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)">let</span><span class="token plain"> nums </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token macro property">vec!</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)">2</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)">3</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 macro property">println!</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">&quot;Sum: {}&quot;</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)">get_sum</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">nums</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><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 you run <em>clippy</em> on it, you will get</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">Checking playground v0.0.1 (/playground)</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">warning: writing `&amp;Vec` instead of `&amp;[_]` involves a new object where a slice will do</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> --&gt; src/main.rs:1:18</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">1 | fn get_sum(nums: &amp;Vec&lt;i32&gt;) -&gt; i32 {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> | ^^^^^^^^^ help: change this to: `&amp;[i32]`</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"> = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> = note: `#[warn(clippy::ptr_arg)]` on by default</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">warning: `playground` (bin &quot;playground&quot;) generated 1 warning</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> Finished dev [unoptimized + debuginfo] target(s) in 0.61s</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>However, if you introduce a type alias, such as</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)">type</span><span class="token plain"> </span><span class="token type-definition class-name" style="color:rgb(38, 127, 153)">Numbers</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 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 keyword" style="color:rgb(0, 0, 255)">i32</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</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>Then <em>clippy</em> won&#x27;t say anything, cause there is literally nothing to suggest.
However the outcome is not the same…</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://github.com/mfocko/blog/tree/main/blog/aoc-2022/02-week-2.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/leetcode/sort-diagonally/"><div class="pagination-nav__sublabel">Newer Post</div><div class="pagination-nav__label">Sort the matrix diagonally</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/blog/aoc-2022/1st-week/"><div class="pagination-nav__sublabel">Older Post</div><div class="pagination-nav__label">1st 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-8-treetop-tree-house" class="table-of-contents__link toc-highlight">Day 8: Treetop Tree House</a><ul><li><a href="#solution" class="table-of-contents__link toc-highlight">Solution</a></li></ul></li><li><a href="#day-9-rope-bridge" class="table-of-contents__link toc-highlight">Day 9: Rope Bridge</a><ul><li><a href="#solution-1" class="table-of-contents__link toc-highlight">Solution</a></li></ul></li><li><a href="#day-10-cathode-ray-tube" class="table-of-contents__link toc-highlight">Day 10: Cathode-Ray Tube</a><ul><li><a href="#solution-2" class="table-of-contents__link toc-highlight">Solution</a></li></ul></li><li><a href="#day-11-monkey-in-the-middle" class="table-of-contents__link toc-highlight">Day 11: Monkey in the Middle</a><ul><li><a href="#solution-3" class="table-of-contents__link toc-highlight">Solution</a></li></ul></li><li><a href="#day-12-hill-climbing-algorithm" class="table-of-contents__link toc-highlight">Day 12: Hill Climbing Algorithm</a><ul><li><a href="#solution-4" class="table-of-contents__link toc-highlight">Solution</a></li></ul></li><li><a href="#day-13-distress-signal" class="table-of-contents__link toc-highlight">Day 13: Distress Signal</a><ul><li><a href="#solution-5" class="table-of-contents__link toc-highlight">Solution</a></li></ul></li><li><a href="#day-14-regolith-reservoir" class="table-of-contents__link toc-highlight">Day 14: Regolith Reservoir</a><ul><li><a href="#solution-6" class="table-of-contents__link toc-highlight">Solution</a></li></ul></li><li><a href="#post-mortem" class="table-of-contents__link toc-highlight">Post Mortem</a><ul><li><a href="#indexing" class="table-of-contents__link toc-highlight">Indexing</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.bfa6f67a.js"></script>
<script src="/assets/js/main.9f54e33a.js"></script>
</body>
</html>