mirror of
https://github.com/mfocko/blog.git
synced 2025-04-15 17:33:40 +02:00
172 lines
No EOL
276 KiB
HTML
172 lines
No EOL
276 KiB
HTML
<!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 '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 '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 '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 '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 '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 '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'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's refactor it a bit ;) During the preparation for
|
||
the AoC, I have written <code>Vector2D</code> and now it'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<Vec<T>></code></li><li>indexing <code>Vec<Vec<T>></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'm getting familiar with Rust and starting to “abuse” it… While doing so, I'm
|
||
also uncovering some “features” that I don'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)"><</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)">></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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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"></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)">&</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)">-></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'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'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)"><</span><span class="token lifetime-annotation symbol">'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)">></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)">&</span><span class="token lifetime-annotation symbol">'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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">U</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 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)">&</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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><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 lifetime-annotation symbol">'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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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"> </span><span class="token operator" style="color:rgb(0, 0, 0)"><</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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 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)">&</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'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's how we got <code>usize: TryFrom<T></code> which basically
|
||
says that <code>usize</code> must implement <code>TryFrom<T></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's how
|
||
we get <code><usize as TryFrom<T>>::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'll get back to it…</p></div></div><p>Let's split it in multiple parts:</p><ul><li><code>v: &'a [Vec<U>]</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>&[T]</code> to <code>&Vec<T></code>, exact details
|
||
are unknown to me</li><li><code>idx: &Vector2D<T></code> represents the <em>indices</em> which we use, we take them by
|
||
reference to avoid an unnecessary copy</li><li><code>-> &'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>'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>'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)"><</span><span class="token lifetime-annotation symbol">'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)">></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)">&</span><span class="token lifetime-annotation symbol">'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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">U</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 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)">&</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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><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 lifetime-annotation symbol">'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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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"> </span><span class="token operator" style="color:rgb(0, 0, 0)"><</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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 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)">&</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't we use one function?</mdxadmonitiontitle></div><div class="admonitionContent_S0QG"><p>When we consider a <code>Vec<T></code>, we don't need to consider containers as <code>T</code>, Rust
|
||
implements indexing as traits <code>Index<T></code> and <code>IndexMut<T></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'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<T></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)"><</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)">></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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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)">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)"><</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)">></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)"><</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)">></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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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)">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)"><</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)">></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)"><</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)">></span><span class="token punctuation" style="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)"><</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)">></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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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)">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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</span><span class="token operator" style="color:rgb(0, 0, 0)">></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>In other words, if your type implements <code>SliceIndex<T></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<T>]</code> or <code>Vec<Vec<T>></code>.
|
||
This requirement could be countered by removing inner type <code>Vec<T></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)"><</span><span class="token lifetime-annotation symbol">'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)">></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)">&</span><span class="token lifetime-annotation symbol">'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)">&</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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><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 lifetime-annotation symbol">'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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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"> </span><span class="token operator" style="color:rgb(0, 0, 0)"><</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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 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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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"></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)">&</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)"><</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)">></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)">&</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">U</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 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)">&</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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><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)">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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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"> </span><span class="token operator" style="color:rgb(0, 0, 0)"><</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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 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)">>=</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)">&&</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)"><</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)">&&</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)">>=</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)">&&</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)"><</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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 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's definitely a shitty code. Let'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<T, E></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)"><</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)">></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)">&</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">U</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 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)">&</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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><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)">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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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"></span><span class="token punctuation" style="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)"><</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)">&&</span><span class="token plain"> x </span><span class="token operator" style="color:rgb(0, 0, 0)"><</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<T, E></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'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<T, E></code>.</p><p>We call <code>and_then</code> on that <em>result</em>, let'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)"><</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)">></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)">-></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)"><</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)">></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)">-></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)"><</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)">></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'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)"><</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)">></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)">-></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)"><</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)">></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)">-></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'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'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's
|
||
just a waste of space and unnecessary code. Let's “simplify” this (on one end
|
||
while creating monster on the other end). I've gone through what we need in the
|
||
preparations for the AoC. Let's sum up our requirements:</p><ul><li>parsing</li><li>part 1 & 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'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)"><</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)">></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)"><</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">Path</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">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)">-></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)">&</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)">-></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)">&</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)">-></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'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)">&</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)">-></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)"><</span><span 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 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)">"{}s/{}.txt"</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)">"Part 1: {}"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">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)">&</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)">"Part 2: {}"</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)">&</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)">-></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)"><</span><span 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 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)">"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"></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)">-></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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">Self</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 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)">"::"</span><span 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'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)">=></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)">&</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)">"samples/{}.txt"</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)">&</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)">&</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)">"samples/{}.txt"</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)">&</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'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)"><</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)">></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)"><</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">Path</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">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)">-></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)">&</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)">-></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)">&</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)">-></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)">-></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)"><</span><span 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 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("sample")</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'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)">&</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)">-></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)">&</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've seen something like this with the <code>Result<T, E></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)"><</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)">></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)">=></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)">"SUCCESS: {}"</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)">=></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)">"ERROR: {}"</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)">&</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)">&</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)">&</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)">-></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)">=></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)">=></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's a perfectly reasonable thing to do. Yes, <strong>but</strong> notice
|
||
that the <code>match</code> statement doesn't <em>collect</em> the changes in any way and also we
|
||
pass <code>output</code> by <code>&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>&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'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'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)"><</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)">></span><span class="token punctuation" style="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)">&</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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">char</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 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)">&</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)">-></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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 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)">&</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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">char</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 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 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)">&</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)">-></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)">&</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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">char</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 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 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)">-></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'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)">&</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)">&</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)"><</span><span class="token lifetime-annotation symbol">'_</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><span class="token punctuation" style="color:rgb(4, 81, 165)">-></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)">=></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)">"{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)">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)">=></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)">"[{}]"</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)">"{p}"</span><span 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)">","</span><span 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'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<I></code> trait. I couldn'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'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)"><</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)">></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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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)">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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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"> </span><span class="token operator" style="color:rgb(0, 0, 0)"><</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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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"></span><span class="token punctuation" style="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)">&</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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><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 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)">&</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)"><</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)">></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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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)">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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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"> </span><span class="token operator" style="color:rgb(0, 0, 0)"><</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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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"></span><span class="token punctuation" style="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)">&</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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><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 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)">&</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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><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)">-></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)"><</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)">></span><span class="token punctuation" style="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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">T</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><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)">-></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)"><</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)">></span><span class="token punctuation" style="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<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> --> 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] > 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<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> = note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`</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<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> --> 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<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> = note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`</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<i8>]` cannot be indexed by `aoc_2022::Vector2D<isize>`</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> --> 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<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<isize>`</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> = note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<isize>>`</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Why? We have it implemented for the slices (<code>[C]</code>), why doesn'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>&[Vec<T>]</code>, but this is coming from a helper functions that
|
||
take <code>&Vec<Vec<T>></code> instead. And… we don'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's implement a macro! The only difference across the implementations are
|
||
the types of the outer containers. Implementation doesn'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)">=></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)"><</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)">></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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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)">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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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"> </span><span class="token operator" style="color:rgb(0, 0, 0)"><</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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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"> </span><span class="token punctuation" style="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)">&</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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><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 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)">&</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)"><</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)">></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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vector2D</span><span class="token operator" style="color:rgb(0, 0, 0)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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)">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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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"> </span><span class="token operator" style="color:rgb(0, 0, 0)"><</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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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 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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">usize</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"> </span><span class="token punctuation" style="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)">&</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">I</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><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 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)">&</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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">C</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 punctuation" style="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)"><</span><span class="token class-name" style="color:rgb(38, 127, 153)">C</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 punctuation" style="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't managed to be able to parse. And that'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'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't use any type aliases, just the raw
|
||
types, you'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)">&</span><span class="token class-name" style="color:rgb(38, 127, 153)">Vec</span><span class="token operator" style="color:rgb(0, 0, 0)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">i32</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><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)">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)">"Sum: {}"</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)">&</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 `&Vec` instead of `&[_]` involves a new object where a slice will do</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> --> 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: &Vec<i32>) -> i32 {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> | ^^^^^^^^^ help: change this to: `&[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 "playground") 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)"><</span><span class="token keyword" style="color:rgb(0, 0, 255)">i32</span><span class="token operator" style="color:rgb(0, 0, 0)">></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'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 '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> |