{
    "version": "https://jsonfeed.org/version/1",
    "title": "mf Blog",
    "home_page_url": "https://blog.mfocko.dev/blog/",
    "description": "mf's blog",
    "items": [
        {
            "id": "https://blog.mfocko.dev/blog/2026/07/12/dnf/",
            "content_html": "<p>After being a part of a Python-oriented team developing a CI for automating\nrelease syncing and shifting the testing process to left (to the original\nproject rather than at the distribution-level) for five and a half years I felt\nlike I need a bit of a change.</p>\n<p>And that’s why I’ve seeked the opportunity to switch up for some time with\na colleague that felt in a similar way working on a different project within the\nRed Hat.</p>\n<p>And that’s how I ended up for 2 quarters in the DNF Team working on <a href=\"https://github.com/rpm-software-management/dnf5\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">dnf5</a>. I’ll\ntry to sum up my experience over the 2 quarters.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"agile-processes\">Agile processes<a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#agile-processes\" class=\"hash-link\" aria-label=\"Direct link to Agile processes\" title=\"Direct link to Agile processes\" translate=\"no\">​</a></h2>\n<p>As of the time of me switching from the Packit Team to the DNF Team, our\norganization has been in the process of hiring a dedicated <em>Scrum Master</em>.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Note</div><div class=\"admonitionContent_BuS1\"><p>In the Packit Team we are used to rotating the <em>Kanban Lead</em> role (among the\nother regular / <em>maintainer</em> roles) around the team.</p></div></div>\n<p>It was my first time being a part of a team that has a dedicated agile\npractitioner. I was not used to this experience.</p>\n<p>On one hand it feels nice to have someone <em>having your back</em> and handling most\nof the annoying stuff, e.g., <em>Jira shenanigans</em>, or calendar and such, and, in\ngeneral, being in control of the whole <em>agile process</em> and ceremonies tied to\nit.</p>\n<div class=\"theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Sadly I have to admit that as the <em>Kanban Lead</em> role grew in the Packit Team, I\nhave managed to forgotten smaller things here and there, e.g., least recently\nupdated issue (when the stand up took longer than usual), or posting the summary\nof merge requests waiting for review.</p><p>Even if your whole job revolves around the agile practice, Jira is a miraculous\ncreation that will pull the rug from under your feet one way or another…</p></div></div>\n<p>In Packit we are using a <em>scrumban</em><sup><a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#user-content-fn-scrumban-596d9d\" id=\"user-content-fnref-scrumban-596d9d\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">1</a></sup>, so getting back to scrum kind of\nmade me relive some of the annoyances of scrum by itself, e.g., the time\nconstraint to 2 weeks.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Length of sprint</div><div class=\"admonitionContent_BuS1\"><p>Some time after I joined the DNF Team we have tried out the 3-week long sprint\ninstead of 2-week long.</p><p>It had quite a good reception, especially because of the lower frequency of\nplanning meetings.</p><p>AFAIK the 3-week sprints have been kept.</p><div class=\"theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>In general it is more common to shorten the “iterations” rather than prolong\nthem. Overall I think this impacts your capability of planning, because you’re\nplanning for a longer period of time and that, by definition, is less accurate.</p></div></div></div></div>\n<p>Carrying tickets over to the next sprint is quite common and also pulling in\ntickets during the sprint too…</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"meetings\">Meetings<a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#meetings\" class=\"hash-link\" aria-label=\"Direct link to Meetings\" title=\"Direct link to Meetings\" translate=\"no\">​</a></h3>\n<p>One thing that caught me by surprise was the low amount of meetings, partially\ncontributed by the <em>asynchronous stand ups</em><sup><a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#user-content-fn-standups-596d9d\" id=\"user-content-fnref-standups-596d9d\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">2</a></sup>.</p>\n<p>Also the DNF team is spread across multiple time zones, so the meetings are set\nin the afternoon for the European folk.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"story-points\">Story points<a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#story-points\" class=\"hash-link\" aria-label=\"Direct link to Story points\" title=\"Direct link to Story points\" translate=\"no\">​</a></h3>\n<p>As always, estimation of size of tasks is quite relative thing. There are teams\nthat measure the story points by days, weeks, etc.</p>\n<p>In the Packit Team we’re using the <em>Fibonacci scale</em> with a few rules that give\nquite basic idea of the sizing.</p>\n<div class=\"theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>The few rules for an idea</div><div class=\"admonitionContent_BuS1\"><ul>\n<li class=\"\">1 points = less than 20 minutes</li>\n<li class=\"\">2 points = recurrent task, manual, similar to 1 point one</li>\n<li class=\"\">3 and 5 points = normal tasks</li>\n<li class=\"\">8 points = one week and potentially over one week</li>\n<li class=\"\">13 points = two weeks (for our former scrum and 2-week sprints = whole sprint)</li>\n</ul></div></div>\n<p>After a quick glance through the DNF’s backlog I’ve noticed mostly higher points\nbeing assigned, which is totally OK, since it’s relative. However it also\nclashed a bit with my perception of sizing after 5 years in Packit <!-- -->😁</p>\n<p>Another difference to Packit was the fact that the story points were assigned by\nthe colleagues that were triaging the new issues/tickets at the time. Because\nthere was no agreement across the team on the <em>difficulty assessment</em>, the story\npoints vary (IMO at least).</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Understandably, both approaches have its merits:</p><ul>\n<li class=\"\">\n<p>when you assign points during triage</p>\n<ul>\n<li class=\"\">it saves time from the meetings, and also</li>\n<li class=\"\">you have nicely “pregroomed” backlog with story points almost<sup><a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#user-content-fn-grooming-596d9d\" id=\"user-content-fnref-grooming-596d9d\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">3</a></sup>\neverywhere; this also gives you a general idea of work in backlog (apart\nfrom the simple metric of <em>how many</em> tasks are waiting)</li>\n</ul>\n</li>\n<li class=\"\">\n<p>assigning points together — unfortunately consumes time, <strong>but</strong> instigates\na discussion over the topic</p>\n</li>\n</ul></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"technical-perspective\">Technical perspective<a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#technical-perspective\" class=\"hash-link\" aria-label=\"Direct link to Technical perspective\" title=\"Direct link to Technical perspective\" translate=\"no\">​</a></h2>\n<p>Developing for Linux on macOS can be challenging at times. One would expect that\ndeveloping <strong>service</strong> revolving around Linux packaging and testing would be\neven worse, but it’s not that problematic in reality, since everything is nicely\ncontainerized.</p>\n<p>Developing a package manager on the other hand… is also not an issue, unless you\nneed to run the tests.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"development-environment\">Development environment<a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#development-environment\" class=\"hash-link\" aria-label=\"Direct link to Development environment\" title=\"Direct link to Development environment\" translate=\"no\">​</a></h3>\n<p>Setting everything up was a bit challenging. In the end I have settled for\na Fedora Rawhide container where I mounted both sources and tests<sup><a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#user-content-fn-separation-596d9d\" id=\"user-content-fnref-separation-596d9d\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">4</a></sup>.</p>\n<p>Running the test suite based on <em><a href=\"https://github.com/behave/behave\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">behave</a></em> was however not possible… Main cause\nof failure was coming from the fact there were some tests for testing\narchitecture fields in specfiles which, of course, breaks the <em>assumptions</em> on\nthe Macs. To be fair, the different architecture (<em>Apple Silicon</em>) is to blame,\nnot the OS itself.</p>\n<div class=\"theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>In my opinion, BDD is something that could probably simplify Packit Service\ntests, but at the same time… the time/cost of converting the test suite would be\ndisgraceful.</p></div></div>\n<p>One of the other ARM<sup><a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#user-content-fn-silicon-596d9d\" id=\"user-content-fnref-silicon-596d9d\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">5</a></sup> quirks I hit, was not being able to utilize\nparallel builds. When I tried compiling with the classic <code>make -j$(nproc)</code> on\nLinux, it worked just fine. However from within the container on the Mac, it hit\nsome race conditions that caused the build to fail.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"first-rhel-bug\">First RHEL bug<a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#first-rhel-bug\" class=\"hash-link\" aria-label=\"Direct link to First RHEL bug\" title=\"Direct link to First RHEL bug\" translate=\"no\">​</a></h3>\n<blockquote>\n<p>For the first time in 5 years, I have been assigned a task that affected RHEL\ndirectly…</p>\n</blockquote>\n<p>Finding the issue and fixing it was probably the easiest part. Getting the fix\n<em>all the way down</em> to RHEL is where things complicate.</p>\n<p>DNF Team handles the downstream patching in such way that they keep the RHEL\nbranches on the upstream. To these branch you backport (most commonly simple\n<em>git cherry pick</em>) the fixes and then you can easily generate patches that are\nadded to the RHEL specfile.</p>\n<p>The whole process is simple and straightforward. Except… resolving the ticket\nconsists of:</p>\n<ul>\n<li class=\"\">fix in the source repo and test coverage (2 MRs, because tests are on its own)</li>\n<li class=\"\">backporting both fix and tests (+2 MRs)</li>\n<li class=\"\">then actually adjusting the specfile on downstream (+2 MRs; depends on how\nmany releases is the fix propagated to)</li>\n</ul>\n<p>Each of those MRs should be reviewed. Even if it has already been reviewed,\ncause, don’t forget, 2 of those are simple cherry picks and the specfiles, in\nthe end, consist again of the already reviewed patches.</p>\n<p>And even then it took me additional two merge requests, because neither I, nor\nmy reviewer, have realized that I am missing part of the tests in the backport.\nThose have been added during the triage a long time before I got the ticket\nassigned.</p>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>info</div><div class=\"admonitionContent_BuS1\"><p>Understandably, this “bureaucratic” work has no easy solution. The current\napproach <strong>is</strong> menial and annoying, but you’re guaranteed <em>audit</em> through the\nwhole process. And also it nicely prevents conflicts on the downstream when\nbackporting fixes.</p></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"summary\">Summary<a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#summary\" class=\"hash-link\" aria-label=\"Direct link to Summary\" title=\"Direct link to Summary\" translate=\"no\">​</a></h2>\n<p>Overall it was a very pleasant experience trying to onboard a different project\nwith different workflows and processes. Maybe I’m biased prior to my previous\nexperience, but the way we set up agile in Packit feels a lot more intuitive.</p>\n<p>I’m also content that I was able to contribute to the package manager that I use\non a daily basis as a user.</p>\n<!-- -->\n<section data-footnotes=\"true\" class=\"footnotes\"><h2 class=\"anchor anchorTargetStickyNavbar_Vzrq sr-only\" id=\"footnote-label\">Footnotes<a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#footnote-label\" class=\"hash-link\" aria-label=\"Direct link to Footnotes\" title=\"Direct link to Footnotes\" translate=\"no\">​</a></h2>\n<ol>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-scrumban-596d9d\">\n<p>Definitely an unusual mix of both <em>scrum</em> and <em>kanban</em>, we keep the\nretrospectives once in 2 weeks, we got back to estimating the tasks, though\nthe generic “flow” resembles more of a Kanban: there’s a list of\n<em>next TODOs</em> rather than a set of tasks to be done over a fixed time period\nand that list gets refilled once a week (or twice if needed).</p>\n<p>Also it’s not unusual to pull the tasks through the <em>in progress</em> to <em>done</em>\neven before they get even triaged/estimated/planned <!-- -->😉 <a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#user-content-fnref-scrumban-596d9d\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-standups-596d9d\">\n<p>because of the time zones, stand ups are held in a separate Slack\nchannel; and yes, I have forgotten to post the updates many a time… <a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#user-content-fnref-standups-596d9d\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-grooming-596d9d\">\n<p>of course, here and there you can find an exception without any\npoints assigned <a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#user-content-fnref-grooming-596d9d\" data-footnote-backref=\"\" aria-label=\"Back to reference 3\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-separation-596d9d\">\n<p>DNF has separate repositories for source code of dnf5 and its\ntests <a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#user-content-fnref-separation-596d9d\" data-footnote-backref=\"\" aria-label=\"Back to reference 4\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-silicon-596d9d\">\n<p>Apple Silicon is of ARM architecture, specifically <code>aarch64</code> <a href=\"https://blog.mfocko.dev/blog/2026/07/12/dnf/#user-content-fnref-silicon-596d9d\" data-footnote-backref=\"\" aria-label=\"Back to reference 5\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n</ol>\n</section>",
            "url": "https://blog.mfocko.dev/blog/2026/07/12/dnf/",
            "title": "Two quarters in the DNF",
            "summary": "Switching to a different team for two quarters.\n",
            "date_modified": "2026-07-12T00:00:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "🏭",
                "red-hat",
                "exchange"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/aoc-2025/third-03/",
            "content_html": "<p>Let's go through the final third of this year’s <a href=\"https://adventofcode.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><em>Advent of Code</em></a>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-9-movie-theater\"><a href=\"https://adventofcode.com/2025/day/9\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 9: Movie Theater</a><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#day-9-movie-theater\" class=\"hash-link\" aria-label=\"Direct link to day-9-movie-theater\" title=\"Direct link to day-9-movie-theater\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Covering the floor with red tiles… and maybe also some green in case it would\nbe too simple.</p></div></div>\n<p>First part was pretty easy, very simple thing to literally brute-force. On the\nother hand… the second part was a bit worse.</p>\n<p>My idea was a pretty primitive one, just do the same thing as in the first part\nand filter out the options that are not valid.</p>\n<p>Turns out that the process of deciding what is and what is not valid <strong>is</strong> the\nproblem.</p>\n<p>In the end I have managed to refactor the solution into:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token annotation punctuation\" style=\"color:hsl(119, 34%, 47%)\">@Override</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Long</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">getBiggestTriangle</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">_r </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:hsl(35, 99%, 36%)\">true</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token annotation punctuation\" style=\"color:hsl(119, 34%, 47%)\">@Override</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Long</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">getBiggestTriangle</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">this</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">isValidRectangle</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"changes-to-library\">Changes to library<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#changes-to-library\" class=\"hash-link\" aria-label=\"Direct link to Changes to library\" title=\"Direct link to Changes to library\" translate=\"no\">​</a></h3>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"queue-consumer\">“Queue consumer”<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#queue-consumer\" class=\"hash-link\" aria-label=\"Direct link to “Queue consumer”\" title=\"Direct link to “Queue consumer”\" translate=\"no\">​</a></h4>\n<p>This was the second day when I had to utilize the <em>heap consumer</em><sup><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#user-content-fn-1-8e748b\" id=\"user-content-fnref-1-8e748b\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">1</a></sup>, so I have\ndecided to factor it out to the library. Since the method itself accepts\nan object implementing <code>Queue&lt;T&gt;</code> interface, I have renamed it\nto <code>consumeQueue()</code>:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">/**</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"> * Creates a stream that consumes elements from a queue.</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"> *</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"> * @param &lt;T&gt; the type of elements in the queue</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"> * @param queue the queue to consume elements from</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"> * @return a stream of elements from the queue, in the order they are polled,</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"> *     terminating when the queue becomes empty (when {@code poll()} returns</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"> *     {@code null})</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"> */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">static</span><span class=\"token plain\"> </span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">consumeQueue</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Queue</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> queue</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iterate</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">queue</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">poll</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> _it </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> queue</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">poll</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">takeWhile</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">it </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> it </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">null</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"pairs-and-helpers\"><code>pairs()</code> and helpers<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#pairs-and-helpers\" class=\"hash-link\" aria-label=\"Direct link to pairs-and-helpers\" title=\"Direct link to pairs-and-helpers\" translate=\"no\">​</a></h4>\n<p>For iterating over the possible choices, in this puzzle, I had to generate all\npossible pairs from an input. Overall it made sense to just implement a method\nthat takes a stream and generates the pairs:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">static</span><span class=\"token plain\"> </span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">Pair</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token generics\"> </span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">pairs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Supplier</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">zip</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">indices</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">boxed</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">get</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">flatMap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">p </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">get</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">skip</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">p</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">first</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Pair</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">of</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">p</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">second</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>However, in the end, I needed some other helpers to get there… Namely it was\neasier to implement infinite <code>indices()</code> rather then iterate the stream twice.</p>\n<p>Also you can notice that <code>pairs()</code> gets passed a <code>Supplier&lt;Stream&lt;T&gt;&gt;</code> rather\nthan the stream itself. That's coming from the fact that streams can be iterated\nthrough only once, so I need to have a functional object that <em>generates</em> a new\nstream each time I need it.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-10-factory\"><a href=\"https://adventofcode.com/2025/day/10\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 10: Factory</a><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#day-10-factory\" class=\"hash-link\" aria-label=\"Direct link to day-10-factory\" title=\"Direct link to day-10-factory\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Pressing buttons to light up christmas lights in specific configuration. Until\nyou realize it's not about the <em>on</em> and <em>off</em>, but about the <em>“joltage”</em>…</p></div></div>\n<p>This day… was <strong>a scam</strong>. For the first part you had to light up lights on the\nmachine in a specific configuration. Part of the input were buttons that contain\na list of lights that get toggled with each press.</p>\n<p>A lot of people chose to go with integral representation of the lights and\nbuttons and then just applying simple XOR.</p>\n<p>I didn't try to simplify the inputs, so I've ended up with lists (or sets) of\nintegers and used BFS for solving the first part.</p>\n<p>And… second part is where the fun starts.</p>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>info</div><div class=\"admonitionContent_BuS1\"><p>Input consisted of multitude of machines where each one is represented by:</p><ul>\n<li class=\"\"><em>indicator lights</em> - used in part 1</li>\n<li class=\"\"><em>buttons</em> - that toggle indicator lights</li>\n<li class=\"\"><em>joltage</em> - used in part 2</li>\n</ul></div></div>\n<p>For the part 2 you have to find minimal number of presses to raise joltage to\nthe seeked joltage…</p>\n<p>The search space for this problem is enormous… I've tried a very naïve approach\nof preprocessing the buttons for each machine in such order that narrows the\nsearch space. This approach was <em>relatively</em> effective, but not effective enough\n<!-- -->😄<!-- --> To cut the story short, I've ended up with 97 % of the input processed,\nbut got stuck there for 3.5 hours after which I killed it.</p>\n<p>Once the solution has been running for about 30 minutes, I have started to pick\naway here and there to optimize bit by bit. And it was pretty effective! To sum\nit up:</p>\n<ul>\n<li class=\"\">\n<p>I had a method to generate counters (i.e., <code>long[]</code> of zeros); in the initial\nsolution I used <code>range().map().toArray()</code>, switched it to simple <code>new long[]</code></p>\n</li>\n<li class=\"\">\n<p>for read-only operations, where possible, I've switched to parallel streams\ninstead of sequential</p>\n</li>\n<li class=\"\">\n<p>changed the strategy of exploring the search space; instead of going from\nminimum needed to maximum possible presses of a button, I've turned it around\nand went from maximum possible to minimum needed, which prunes the unreachable\nbranches quicker</p>\n</li>\n<li class=\"\">\n<p>and finally the recursive calls that get called for each button press…\nfor each of this calls I create a separate “goal” joltage the search is\nsupposed to address, that way I can paralelize those too</p>\n</li>\n</ul>\n<p>And this has gotten me from 3.5 hours (still missing the last 4 results) to 6\nminutes.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-11-reactor\"><a href=\"https://adventofcode.com/2025/day/11\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 11: Reactor</a><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#day-11-reactor\" class=\"hash-link\" aria-label=\"Direct link to day-11-reactor\" title=\"Direct link to day-11-reactor\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Counting possible paths through a network of devices.</p></div></div>\n<p>Relatively easy way to solve this. Can be done recursively, it's basically just\ngoing through the graph, trying to find a way to the <em>goal</em>. And at the same\ntime counting how many ways there are…</p>\n<p>I have to admit that I <strong>did not</strong> expect to get burnt at this Java-specific\nthing on the 11th day <!-- -->😄<!-- --> I've been teaching at <em>Intro to programming</em> for\nyears that sometimes it's not a good idea to use niche features specific only to\none or two languages, yet… At first I didn't realize at all that</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">from </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> sink</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1l</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>does something totally different than</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">equals</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">sink</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1l</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p><code>==</code> compares references, and, as opposed to other languages like C++ or C#,\ncannot be overriden. However I noticed this mistake rather quickly, cause the\ngraph traversal doesn't terminate, duh…</p>\n<p>I expected to make this mistake during the beginning, not at the second to last\nday.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-12-christmas-tree-farm\"><a href=\"https://adventofcode.com/2025/day/12\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 12: Christmas Tree Farm</a><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#day-12-christmas-tree-farm\" class=\"hash-link\" aria-label=\"Direct link to day-12-christmas-tree-farm\" title=\"Direct link to day-12-christmas-tree-farm\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Puzzle about tiling problem. However the challenge input is a bit more simpler\nthan the complicated sample…</p></div></div>\n<p>At the first look, the problem looks extremely annoying. And it kinda is… The\nfun thing is that it is possible to solve simply by expecting a bit more area,\nas a buffer, to be occupied by the tiles and simply checking whether it could\nfit.</p>\n<p>What's even more funny is the fact that the provided sample is quite picky about\nthis, i.e., you need to account for 20 % buffer to make it pass. However the\nchallenge input… that works without any buffer…</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"final-changes-to-the-library\">Final changes to the library<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#final-changes-to-the-library\" class=\"hash-link\" aria-label=\"Direct link to Final changes to the library\" title=\"Direct link to Final changes to the library\" translate=\"no\">​</a></h3>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"parserof\"><code>Parser.of()</code><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#parserof\" class=\"hash-link\" aria-label=\"Direct link to parserof\" title=\"Direct link to parserof\" translate=\"no\">​</a></h4>\n<p>I've tried to simplify the parser a bit, so I introduced a method <code>Parser.of()</code>\nto be able to construct instances of parsers without the need to use <code>new</code> and\n<code>&lt;&gt;</code> for type inference of the resulting types to be produced by parsing…</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"summary\">Summary<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#summary\" class=\"hash-link\" aria-label=\"Direct link to Summary\" title=\"Direct link to Summary\" translate=\"no\">​</a></h2>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Finished advent calendar :smile:\" src=\"https://blog.mfocko.dev/assets/images/calendar-5bf14f0b5491b4f8d192afa33ea4e5a6.png\" width=\"2248\" height=\"1580\" class=\"img_ev3q\"></p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"advent-of-code-itself\">Advent of Code itself<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#advent-of-code-itself\" class=\"hash-link\" aria-label=\"Direct link to Advent of Code itself\" title=\"Direct link to Advent of Code itself\" translate=\"no\">​</a></h3>\n<p>I have a bit of mixed feelings. Thankfully, this year, there was only one day\nthat was particularly obnoxious with regards to parsing.</p>\n<p>There were only 12 days instead of the usual 25. I have tried to solve all days\nat 6am (CET) and… I'm not very used to writing Java at 6am to be honest <!-- -->😄<!-- -->\nSo I definitely don't mind an early end on that front <!-- -->👀<!-- --> Though it is quite\nknown that the complexity of the tasks grows towards the end of the AoC, so this\nyear might seem a bit <em>easy-going</em>? I can understand the need for a bit\nof a challenge.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"java\">Java<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#java\" class=\"hash-link\" aria-label=\"Direct link to Java\" title=\"Direct link to Java\" translate=\"no\">​</a></h3>\n<p>Even though Java is the first language I've learnt and also learnt to hate\nfurther on, it was quite pleasent experience in my opinion. I confess to abusing\nthe streams and other FP-like “features”.</p>\n<p>I definitely hate the boilerplate for each day… but looking back at it, it makes\nit quite customizable, so, for example, in <a class=\"\" href=\"https://blog.mfocko.dev/blog/aoc-2025/third-02/#day-8-playground\">day #8</a> I was able to simply add the\nconstraint (which was different for sample and challenge input) to constructor\nand it allowed pretty easy testing and computing the challenge at the same time.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"toolchain\">Toolchain<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#toolchain\" class=\"hash-link\" aria-label=\"Direct link to Toolchain\" title=\"Direct link to Toolchain\" translate=\"no\">​</a></h3>\n<p>I didn't feel comfortable working with either IDEA or VSCode. They each have\ntheir own quirks, e.g., not working completion (which is definitely helpful with\nstreams and data structures), or issues running the puzzles in a way that would\nfit my workflow.</p>\n<p>OTOH it was a quite pleasant experience with testing (apart from constructors in\nclasses that are not instantiated) and also doc-generation. Though I feel that\njavadoc is still… bit obscure format for me.</p>\n<!-- -->\n<section data-footnotes=\"true\" class=\"footnotes\"><h2 class=\"anchor anchorTargetStickyNavbar_Vzrq sr-only\" id=\"footnote-label\">Footnotes<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#footnote-label\" class=\"hash-link\" aria-label=\"Direct link to Footnotes\" title=\"Direct link to Footnotes\" translate=\"no\">​</a></h2>\n<ol>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-1-8e748b\">\n<p>the method I have implementing for converting a min-heap into a stream <a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-03/#user-content-fnref-1-8e748b\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n</ol>\n</section>",
            "url": "https://blog.mfocko.dev/blog/aoc-2025/third-03/",
            "title": "Final third of Advent of Code ‘25 in Java",
            "summary": "Final third of Advent of Code ‘25.",
            "date_modified": "2025-12-14T03:14:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "advent-of-code",
                "advent-of-code-2025",
                "java"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/aoc-2025/third-02/",
            "content_html": "<p>Let's go through the second third of this year’s <a href=\"https://adventofcode.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><em>Advent of Code</em></a>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-5-cafeteria\"><a href=\"https://adventofcode.com/2025/day/5\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 5: Cafeteria</a><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-02/#day-5-cafeteria\" class=\"hash-link\" aria-label=\"Direct link to day-5-cafeteria\" title=\"Direct link to day-5-cafeteria\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Ranges??? AGAIN??? Bit more annoying than the last time though. For the part 1\nyou check how many items of your “shopping list” fall into any of the ranges.</p><p>And for the part 2, you get to find how many IDs are covered by those ranges.</p></div></div>\n<p>Pretty eazy to solve, given that you chose a good representation for the input.\nEven <em>spotless</em> thought it's a good idea to keep the solution for part 1 on one\nline <!-- -->😉</p>\n<p>I have also tried using the IDEA instead of the VSCode, but… I've hit different\nissues with the IDE <!-- -->🤦‍♂️</p>\n<ul>\n<li class=\"\">\n<p>VSCode has trouble with the source dependencies defined by gradle and that's\nwhy any completion or type inference in the editor fails miserably :)</p>\n</li>\n<li class=\"\">\n<p>as for the IDEA… type inference and completion works, but it has the same\nproblem except for the fact that it »disassembles« compiled <code>*.class</code> files of\nthe library and that's how it gets type inference and completion to work, but…</p>\n<p>still no javadoc and on top of that running the “app” is problematic, as I\nhave not been able to get any output from the app in case it fails with an\nexception <!-- -->😄<!-- --> not even with <code>--stacktrace</code>… the output just vanishes</p>\n</li>\n</ul>\n<p>So in the end I've decided to revert back to the VSCode, as running the app is\na bit more comfortable than fighting the runner in IDEA.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"parsing-intermezzo-1\">Parsing intermezzo #1<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-02/#parsing-intermezzo-1\" class=\"hash-link\" aria-label=\"Direct link to Parsing intermezzo #1\" title=\"Direct link to Parsing intermezzo #1\" translate=\"no\">​</a></h3>\n<p>This is the day when I decided to improve the parsing situation. From the\nprevious years and other languages I've noticed some patterns, with Java… I did\nnot notice any <!-- -->👀</p>\n<ul>\n<li class=\"\">\n<p>For Rust there's a <code>FromStr</code> trait that allows you to use <code>T::from_str()</code> that\ncan either return the parsed structure or an error.</p>\n</li>\n<li class=\"\">\n<p>In Kotlin there was a funny “convention” of extending strings with a method\n<code>.toSomething()</code> which would allow you to do: <code>\"1,2\".toPoint()</code> or something\nsimilar.</p>\n</li>\n<li class=\"\">\n<p>In C# there's a pretty good construct of</p>\n<div class=\"language-cs codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cs codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">static</span><span class=\"token plain\"> </span><span class=\"token return-type class-name keyword\" style=\"color:hsl(301, 63%, 40%)\">bool</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">TryParse</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name keyword\" style=\"color:hsl(301, 63%, 40%)\">string</span><span class=\"token class-name punctuation\" style=\"color:hsl(119, 34%, 47%)\">?</span><span class=\"token plain\"> s</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">out</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>It seems a bit complex, but basically it allows you to get a result of the\nconversion as a return value (the <code>bool</code> indicates success or failure) and at\nthe same time you can populate an <code>out</code> variable with the parsed data. Overall\nit can be combined into:</p>\n<div class=\"language-cs codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cs codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token class-name keyword\" style=\"color:hsl(301, 63%, 40%)\">var</span><span class=\"token plain\"> stringRepresentation </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"1,2\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">Point</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">TryParse</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">stringRepresentation</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">out</span><span class=\"token plain\"> </span><span class=\"token class-name keyword\" style=\"color:hsl(301, 63%, 40%)\">var</span><span class=\"token plain\"> point</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  Console</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">WriteLine</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token interpolation-string string\" style=\"color:hsl(119, 34%, 47%)\">$\"Parsed point of x=</span><span class=\"token interpolation-string interpolation punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token interpolation-string interpolation expression language-csharp\">point</span><span class=\"token interpolation-string interpolation expression language-csharp punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token interpolation-string interpolation expression language-csharp\">x</span><span class=\"token interpolation-string interpolation punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token interpolation-string string\" style=\"color:hsl(119, 34%, 47%)\"> y=</span><span class=\"token interpolation-string interpolation punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token interpolation-string interpolation expression language-csharp\">point</span><span class=\"token interpolation-string interpolation expression language-csharp punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token interpolation-string interpolation expression language-csharp\">y</span><span class=\"token interpolation-string interpolation punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token interpolation-string string\" style=\"color:hsl(119, 34%, 47%)\">\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  Console</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">WriteLine</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token interpolation-string string\" style=\"color:hsl(119, 34%, 47%)\">$\"Failed to parse: ‹</span><span class=\"token interpolation-string interpolation punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token interpolation-string interpolation expression language-csharp\">stringRepresentation</span><span class=\"token interpolation-string interpolation punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token interpolation-string string\" style=\"color:hsl(119, 34%, 47%)\">›\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n</li>\n</ul>\n<p>As I have not been able to find any convention about that in Java, apart from\nthe parsing method for primitive data types: <code>Integer.parseInt()</code>\nor <code>Long.parseLong()</code>. I have decided to come up with something suitable for AoC\nmyself:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">abstract</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">StringParser</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">abstract</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token plain\"> s</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">it </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">it</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">List</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">stream</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Arrays</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">stream</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>We have a few adapters over the unimplemented method, so it is easy to parse\nmultiple values at once. And one abstract method that defines parsing from\na single string.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Of course, it is also possible to create anonymous objects of <code>StringParser&lt;T&gt;</code>\nthat don't have to be named, they just need to implement that <code>.from()</code> method.</p></div></div>\n<p>During the testing I have found out that… it works well, but at the same time is\nquite verbose:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token annotation punctuation\" style=\"color:hsl(119, 34%, 47%)\">@Test</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">testParse</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">var</span><span class=\"token plain\"> input </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">69</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"regression\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> map </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"123049575901212312312313\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">toCharArray</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"123123130999555554444433\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">toCharArray</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"000111100022222330000000\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">toCharArray</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">assertArrayEquals</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">parse</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">StringParser</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">              </span><span class=\"token annotation punctuation\" style=\"color:hsl(119, 34%, 47%)\">@Override</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">              </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token plain\"> s</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Arrays</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">stream</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">s</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">split</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"\\n\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">row </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> row</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">trim</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">toCharArray</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">toArray</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">::</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">              </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>As you can tell there's a lot of boilerplate still… And that's where I got\ninspired by the higher-order functions in Java. Even though they accept\n“callable” objects, you don't that much boilerplate around them. And the reason\nwhy you don't is a <em>functional interface</em>.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"functional-interface\">Functional interface<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-02/#functional-interface\" class=\"hash-link\" aria-label=\"Direct link to Functional interface\" title=\"Direct link to Functional interface\" translate=\"no\">​</a></h4>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>info</div><div class=\"admonitionContent_BuS1\"><p>Functional interface is a concept of an interface that has <strong>exactly</strong> one\nabstract method. Since there's exactly one method, you can create an instance\nof a functional interface with lambda, method or constructor reference.</p></div></div>\n<p>Given this annotation, I have converted <code>StringParser&lt;T&gt;</code> into:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token annotation punctuation\" style=\"color:hsl(119, 34%, 47%)\">@FunctionalInterface</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">interface</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">StringParser</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token plain\"> s</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>And to be able to utilize the other methods, if needed:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Parser</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">implements</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">StringParser</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">private</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">final</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">StringParser</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> parser</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Parser</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">StringParser</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> parser</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">parser </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">null</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">\t      </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">throw</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">IllegalArgumentException</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"‹parser› cannot be null\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">this</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">parser </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> parser</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token plain\"> s</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> parser</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">s</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">it </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">it</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">List</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">stream</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Arrays</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">stream</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">xs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>And the parser above can now be written as:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token annotation punctuation\" style=\"color:hsl(119, 34%, 47%)\">@Test</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">testParse</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">var</span><span class=\"token plain\"> input </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">69</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"regression\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> map </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"123049575901212312312313\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">toCharArray</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"123123130999555554444433\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">toCharArray</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"000111100022222330000000\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">toCharArray</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">assertArrayEquals</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">parse</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            s </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">              </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Arrays</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">stream</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">s</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">split</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"\\n\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">row </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> row</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">trim</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">toCharArray</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">toArray</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">::</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-6-trash-compactor\"><a href=\"https://adventofcode.com/2025/day/6\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 6: Trash Compactor</a><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-02/#day-6-trash-compactor\" class=\"hash-link\" aria-label=\"Direct link to day-6-trash-compactor\" title=\"Direct link to day-6-trash-compactor\" translate=\"no\">​</a></h2>\n<p>For this day we also have a photo from this year's setup at 6am <!-- -->😉</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://blog.mfocko.dev/assets/images/setup-b3368fdacc469985b433d916e396f50e.png\" width=\"1920\" height=\"1440\" class=\"img_ev3q\"></p>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p><em>Advent of Parsing</em>, here we go! Part 1? Easy! Part 2? You get to pay for your\nparsing decisions in the part 1 :)</p><p>Whole day is about a simple addition, or multiplication, of numbers in a column\nas you have definitely learned at the elementary schoold, but the part 2 shows\nyou that sometimes not everything is aligned as it's supposed to be…</p></div></div>\n<p>And the old <em>Advent of Parsing</em> is back…</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">123 328  51 64</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"> 45 64  387 23</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  6 98  215 314</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">*   +   *   +</span><br></span></code></pre></div></div>\n<p>Surely that whitespace around the numbers has no meaning, right? RIGHT?!?!</p>\n<div class=\"theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>Spoiler alert</div><div class=\"admonitionContent_BuS1\"><p>It does… <em>sigh</em></p></div></div>\n<p>Part 1 was relatively OK, just treat the last row as special, since it has\noperators and then for the other rows, split on whitespace and trim all other\nwhitespace.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>N.B.</div><div class=\"admonitionContent_BuS1\"><p>This was the day when my column iterator came in handy <!-- -->🎉</p></div></div>\n<p>As for the second part… that was not fun… had to rewrite almost all of the\nparsing. After making up an algorithm for handling the different representation\nof numbers (one column of <strong>digits</strong> being a number), and still getting wrong\nresults, I noticed that the alignment from both sides matters <!-- -->🤦‍♂️</p>\n<p>However after the refactoring I got to a solution that accepts an operator and\na stream of numbers, so it boiled down to one function doing “the math” and the\ntwo other (for each part) just passing a stream of numbers to it…</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-7-laboratories\"><a href=\"https://adventofcode.com/2025/day/7\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 7: Laboratories</a><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-02/#day-7-laboratories\" class=\"hash-link\" aria-label=\"Direct link to day-7-laboratories\" title=\"Direct link to day-7-laboratories\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Splitting beams, until… you're splitting timelines :)</p></div></div>\n<p>Part 1 was not the easiest to comprehend when reading it for the first time.\nHowever if you get what you're supposed to do (and do not try to be smart about\nit), it is rather easy to solve.</p>\n<p>During the refactoring I've done several improvements, though… I have to admit\nthat in the end I might've overdone it a bit and it's kinda…&nbsp;perverted.</p>\n<p>Since you're splitting beams on the splitters, the initial solution contained\na following bit of copy-paste:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">manifold</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'.'</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// …</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">manifold</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'.'</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// …</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>Which I have managed to refactor into:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">int</span><span class=\"token plain\"> dx </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">int</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">manifold</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> dx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!=</span><span class=\"token plain\"> </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'.'</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">continue</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// …</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>And I couldn't stop there… I have also decided to use <code>switch</code>-expressions where\npossible. For example the computation of possible timelines from part 2:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">dp</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">switch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">manifold</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">case</span><span class=\"token plain\"> </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'S'</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'|'</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">get</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">case</span><span class=\"token plain\"> </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'^'</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">get</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">get</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">default</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">throw</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">IllegalStateException</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"no need to evaluate empty cells\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>Furthermore I have decided to convert the <code>for-each</code>-loop above into a stream…\nand once I got a knack for it… I have created an adapter for consuming the queue\nas a stream <!-- -->🤦‍♂️</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">private</span><span class=\"token plain\"> </span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">consumeHeap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Queue</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> heap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iterate</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      heap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">poll</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">     _it </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> heap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">poll</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">takeWhile</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">it </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> it </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">null</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>Fun thing is, since the stream is lazily evaluated, you can add more elements\nto the heap while iterating through it. So it basically can work as\na <code>for-each</code>-loop through the heap as long as there's something in it.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"changes-to-library\">Changes to library<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-02/#changes-to-library\" class=\"hash-link\" aria-label=\"Direct link to Changes to library\" title=\"Direct link to Changes to library\" translate=\"no\">​</a></h3>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"pairof\"><code>Pair.of()</code><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-02/#pairof\" class=\"hash-link\" aria-label=\"Direct link to pairof\" title=\"Direct link to pairof\" translate=\"no\">​</a></h4>\n<p>For the cases where it is possible to use type inference, I have stolen a helper\nfrom <a href=\"https://github.com/S3MU1L/advent-of-code-2025\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">@semuil</a> to avoid unnecessary clutter, i.e., <code>new</code> and <code>&lt;&gt;</code>:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Pair</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// turns into</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Pair</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">of</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><br></span></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-8-playground\"><a href=\"https://adventofcode.com/2025/day/8\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 8: Playground</a><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-02/#day-8-playground\" class=\"hash-link\" aria-label=\"Direct link to day-8-playground\" title=\"Direct link to day-8-playground\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Substituting for electricians and going through the piles of cables…</p></div></div>\n<p>The core of this puzzle was to repeateadly connect the closest boxes together.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Probably the most appropriate way to approach this problem is to use union-find.\nSince it's something I'd include in the library, I've decided to just use\nmin-heap and go from there.</p></div></div>\n<p>Now the first part was relatively easy to solve, though the abstraction hurt\na bit here. More specifically we want to partition the boxes into subsets in\nsuch order that the one with the closest distance are together in one subset.</p>\n<p>So… you need to be able to track to which partition each box belongs. Therefore\nthe easiest solution was to simply keep indices in the heap and keep an array\nwith “marks” for each partition.</p>\n<p>And this is where I screwed up royally and was not able to find my mistake for\nsome time <!-- -->😄</p>\n<p>To sum up what we're going to do:</p>\n<blockquote>\n<p>We pick the closest two boxes from the queue, if they're already in the same\npartition, we can safely ignore and proceed. Otherwise we need to merge the\npartitions into one.</p>\n</blockquote>\n<p>This should be achieved with the following code:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">consumeHeap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">queue</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">limit</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">maxConnections</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">forEach</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    it </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">var</span><span class=\"token plain\"> a </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> it</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">first</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">var</span><span class=\"token plain\"> b </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> it</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">second</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">mapping</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> mapping</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">b</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">var</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\"> mapping</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">length</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">++</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">mapping</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> mapping</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">b</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          mapping</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> mapping</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>Except for one smaller issue… that I was not able to find for the longest time\npossible <!-- -->😄</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">//      vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">mapping</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> mapping</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">b</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          mapping</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> mapping</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</span><br></span></code></pre></div></div>\n<p><code>for</code>-loop is supposed to take each box from the same partition as the latter\nbox from the two closest ones and move it to the partition of the first box. And\nit does that… but once it wipes the mark of the original parition, cause it is\nequal to itself (duh…), we lose the track and everything from that point onwards\nstays in the original partition.</p>\n<p>That was a rookie and quite stupid mistake that cost a lot of time…</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Fun fact, if the indices were evaluated using the strict evaluation strategy,\nthe overwriting would happen afterwards and therefore this problem could've been\navoided. But… they're not, it's a <code>for</code>-loop with side effects.</p><p>And, even if, I used the streams, the stream of indices would've been evaluated\nlazily.</p></div></div>\n<p>As both parts are quite similar, I have managed to refactor the common logic\ninto:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token annotation punctuation\" style=\"color:hsl(119, 34%, 47%)\">@Override</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Long</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">consumeHeap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">queue</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">limit</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">maxConnections</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">forEach</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">this</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">connect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// construct the answer to part 1</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token annotation punctuation\" style=\"color:hsl(119, 34%, 47%)\">@Override</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Long</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Pair</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">Integer</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token generics\"> </span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">Integer</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> it </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">null</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">while</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">sizes</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">size</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    it </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> queue</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">poll</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">connect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">it</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// construct the answer to part 2</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"changes-to-library-1\">Changes to library<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-02/#changes-to-library-1\" class=\"hash-link\" aria-label=\"Direct link to Changes to library\" title=\"Direct link to Changes to library\" translate=\"no\">​</a></h3>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"euclidean-distance\">Euclidean distance<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-02/#euclidean-distance\" class=\"hash-link\" aria-label=\"Direct link to Euclidean distance\" title=\"Direct link to Euclidean distance\" translate=\"no\">​</a></h4>\n<p>Since the <em>Euclidean distance</em> used in this puzzle seemed handy, I moved it out\nto the library. Funnily as part of the optimization I've used the squared\nEuclidean distance throughout this puzzle, so the interface includes both actual\ndistance and the distance squared.</p>",
            "url": "https://blog.mfocko.dev/blog/aoc-2025/third-02/",
            "title": "Second third of Advent of Code ‘25 in Java",
            "summary": "Second third of Advent of Code ‘25.",
            "date_modified": "2025-12-10T03:14:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "advent-of-code",
                "advent-of-code-2025",
                "java"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/aoc-2025/third-01/",
            "content_html": "<p>Let's talk about the preparations for this year's <a href=\"https://adventofcode.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><em>Advent of Code</em></a> and its\nfirst third.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"preparations\">Preparations<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#preparations\" class=\"hash-link\" aria-label=\"Direct link to Preparations\" title=\"Direct link to Preparations\" translate=\"no\">​</a></h2>\n<p>As usual I prepare the repo for the year and also some kind of a library with\nhelpers that I use regularly during the AoC challenges.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"library-with-helpers\">Library with helpers<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#library-with-helpers\" class=\"hash-link\" aria-label=\"Direct link to Library with helpers\" title=\"Direct link to Library with helpers\" translate=\"no\">​</a></h3>\n<p>Library for AoC consists mostly of parsing helpers, as there's a long-going meme\nof referring to <em>Advent of Code</em> as <em>Advent of Parsing</em>. Additionally it's also\nhelpful to have 2D/3D vectors and maybe math functions or iterators.</p>\n<p>Basic list of helpers I've prepared for myself for the <em>Advent of Code in Java</em>:</p>\n<ul>\n<li class=\"\">\n<p><em>IO</em> - for reading an input; as it has a common structure, the sample and the\nchallenge input itself</p>\n</li>\n<li class=\"\">\n<p><em>iterators</em> - implementation of the column iterators that are usually needed\nfor iterating over maps, if they occur in the challenge input</p>\n</li>\n<li class=\"\">\n<p><em>streams</em> - implementation of some algorithms that generate streams</p>\n</li>\n<li class=\"\">\n<p><em>math</em> - GCD and LCM implementations for now as they are not included in the\nJava itself</p>\n</li>\n<li class=\"\">\n<p><em>vectors</em> - as always…</p>\n</li>\n</ul>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"static-classes\"><code>static</code> classes<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#static-classes\" class=\"hash-link\" aria-label=\"Direct link to static-classes\" title=\"Direct link to static-classes\" translate=\"no\">​</a></h4>\n<p>You can probably tell from the prrevious list of helpers that almost all of the\nrequired functionality does not depend on having an instance of a class itself.</p>\n<p>For example the GCD and LCM doesn't need any instance, they're just simple\nfunctions.</p>\n<p>Yet during the testing I've discovered that there's no easy way to deal with\nsuch thing. Classes in Java can be made <code>static</code>, but only if they're nested\nwithin some other class which makes them hidden from outside.</p>\n<div class=\"theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>danger</div><div class=\"admonitionContent_BuS1\"><p>Fun thing stemming from this hinderance is the fact that it lowers the test\ncoverage, as the default constructor is made <code>private</code> and throws an exception\nto ensure the class cannot be initialized, as it doesn't even make sense…</p></div></div>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"generics-for-numerics\">Generics for numerics<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#generics-for-numerics\" class=\"hash-link\" aria-label=\"Direct link to Generics for numerics\" title=\"Direct link to Generics for numerics\" translate=\"no\">​</a></h4>\n<p>One thing I hated the most about implementing the vectors is the fact that you\ncannot make the vectors generic…</p>\n<p>This is caused by non-existing interface for primitive data types. Therefore\nit's not possible to create a generic class for vector.</p>\n<p>I had to result to implementing two different classes that differ only in the\nunderlying data type of the coordinates:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// Representing a 2D or 3D vector having the floating-point coordinates.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">FVec</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// Representing a 2D or 3D vector having the integral (as ‹Long›) coordinates.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">IVec</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"parsing-input\">Parsing input<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#parsing-input\" class=\"hash-link\" aria-label=\"Direct link to Parsing input\" title=\"Direct link to Parsing input\" translate=\"no\">​</a></h4>\n<p>I have started with a simple class that allows me to read the input by lines and\ndo very simple parsing.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>During the testing I've found out that there's an issue with releasing the\nresources, if you read the input via stream, you might either close the file\nbefore finishing the reading, or don't close it at all.</p><p>The best solution to this is to implement an <code>AutoCloseable</code> interface and then\nyou can use the input class as:</p><div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">try</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">var</span><span class=\"token plain\"> input </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"sample\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// read whatever you want</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div></div></div>\n<p>I will leave out the boring technical part and just show how the input class\nworks:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">lines</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> bufferedReader</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">lines</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">asString</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">lines</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">reduce</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> b</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">format</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"%s\\n%s\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> b</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">orElse</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">Integer</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">asInts</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">lines</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Integer</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">parseInt</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">Integer</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">asCommaSeparatedInts</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Arrays</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">stream</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">asString</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">split</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\",\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Integer</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">parseInt</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"stream-helpers-from-leetcode\"><code>Stream</code> helpers from LeetCode<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#stream-helpers-from-leetcode\" class=\"hash-link\" aria-label=\"Direct link to stream-helpers-from-leetcode\" title=\"Direct link to stream-helpers-from-leetcode\" translate=\"no\">​</a></h4>\n<p>Also I've been able to snatch some <code>Stream</code> helpers after doing the LeetCode\nchallenges. They cover the following functionality:</p>\n<ul>\n<li class=\"\">\n<p><code>range()</code> that generates a stream in a similar fashion as the Python function,\nyou might know, would</p>\n</li>\n<li class=\"\">\n<p><code>indices()</code> that returns a stream of indices over an array or a <code>List&lt;T&gt;</code></p>\n</li>\n<li class=\"\">\n<p><code>product()</code> that takes two functions that can generate streams and returns\na stream of cartesian product over said streams</p>\n</li>\n<li class=\"\">\n<p><code>zip()</code> that “zips” two streams; providing both customizable zipping and\nsimple zip that just returns pairs of values</p>\n</li>\n</ul>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"abstract-class-for-representing-a-day\">Abstract class for representing a day<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#abstract-class-for-representing-a-day\" class=\"hash-link\" aria-label=\"Direct link to Abstract class for representing a day\" title=\"Direct link to Abstract class for representing a day\" translate=\"no\">​</a></h3>\n<p>Each day runs in the same way, the only difference is in the parsing and solving\nthe challenge itself. Each day has both parts, nowadays a sample input with\nprovided answers for testing. Therefore I have created for myself an abstract\nclass that takes care of these things:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">abstract</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Day</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics\">T1</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token generics\"> T2</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">abstract</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">precompute</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">abstract</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T1</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">abstract</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T2</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">abstract</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">runAll</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Generics</div><div class=\"admonitionContent_BuS1\"><p><code>T1</code> and <code>T2</code> represent return types of the results from the parts of the\nchallenge. They're usually the same type, but sometime they may differ.</p></div></div>\n<p>I have added a <code>precompute()</code> method in case there are some things that could be\nprecomputed for both parts right after parsing.</p>\n<p>Also with Java I've run into a limitation that doesn't allow me to test sample\ninputs and run for the challenge input without a lot of copy-paste, so I've\ncreated an abstract <code>runAll()</code> method which gets called when running the whole\napp and can be used in a following way:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token annotation punctuation\" style=\"color:hsl(119, 34%, 47%)\">@Override</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">runAll</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Day01</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"sample\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">test</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">42</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">69</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Day01</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"input\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">run</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>Still an annoying and technically a copy-paste, but somehow better.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"build-system-and-whatnot\">Build system and whatnot<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#build-system-and-whatnot\" class=\"hash-link\" aria-label=\"Direct link to Build system and whatnot\" title=\"Direct link to Build system and whatnot\" translate=\"no\">​</a></h3>\n<p>Since it's Java and I have my own library in a separate repository there's\na need to use some kind of a build system and also other tools.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"gradle\">gradle<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#gradle\" class=\"hash-link\" aria-label=\"Direct link to gradle\" title=\"Direct link to gradle\" translate=\"no\">​</a></h4>\n<p>It has already been some years I had Java course at the university, where we\nused Maven. And I've read some stuff about gradle, also it was used in the AoC\ntemplate for Kotlin done by the JetBrains, so it wasn't very hard to adapt.</p>\n<p>Though there were some issues hit, I'll get to them later on.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"spotless\">spotless<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#spotless\" class=\"hash-link\" aria-label=\"Direct link to spotless\" title=\"Direct link to spotless\" translate=\"no\">​</a></h4>\n<p>While writing the library I noticed that it's rather hard to have consistent\nformatting and the VSCode extensions don't do a very good job with formatting\nand cleaning up imports and such. I searched a bit on <!-- -->🦆<!-- --> and found\n<a href=\"https://github.com/diffplug/spotless\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><em>spotless</em></a>.</p>\n<p>Looking at the git repository now I have to admit that it can be applied to a\nmultitude of languages, so they must be doing something right…</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"testing\">testing<a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#testing\" class=\"hash-link\" aria-label=\"Direct link to testing\" title=\"Direct link to testing\" translate=\"no\">​</a></h4>\n<p>For the library I've decided to use whatever was in the gradle template for Java\nlibrary.</p>\n<p>As for the puzzle solutions themselves… That's rough to decide:</p>\n<ul>\n<li class=\"\">\n<p>with Kotlin it was a matter of simple <code>check()</code> statements that throw an\nexception if the assertion fails</p>\n</li>\n<li class=\"\">\n<p>with Rust I had a very good experience using my own macro machinery to create\na <em>mod</em> with tests for each day; I have to admit that this setup together with\n<a href=\"https://github.com/Canop/bacon\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><em>bacon</em></a> has been the best I've ever achieved</p>\n</li>\n</ul>\n<p>This time I have decided to go with two separate “runners” in the abstract class\nfor each day:</p>\n<ul>\n<li class=\"\">\n<p><code>run()</code> that simply runs and reports from each part:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">run</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">format</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"\\n[TRACE] Running input:\\t‹%s›\\n\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> inputType</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">println</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"  [INFO] Running precompute()\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">precompute</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">print</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"  [INFO] Part 1:\\t\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">println</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">print</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"  [INFO] Part 2:\\t\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">println</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n</li>\n<li class=\"\">\n<p>and <code>test(x, y)</code> that does basically the same, but also checks the results:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">test</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T1</span><span class=\"token plain\"> answer1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T2</span><span class=\"token plain\"> answer2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">format</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"\\n[TRACE] Testing input:\\t‹%s›\\n\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> inputType</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">println</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"  [INFO] Running precompute()\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">precompute</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">answer1 </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">null</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">print</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"  [INFO] Part 1:\\t\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">var</span><span class=\"token plain\"> result1 </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!</span><span class=\"token plain\">result1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">equals</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">answer1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">printf</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"[KO] Given answer: ‹%s› (expected ‹%s›)\\n\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> result1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> answer1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">println</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"[OK]\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">answer2 </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">null</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">print</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"  [INFO] Part 2:\\t\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">var</span><span class=\"token plain\"> result2 </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!</span><span class=\"token plain\">result2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">equals</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">answer2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">printf</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"[KO] Given answer: ‹%s› (expected ‹%s›)\\n\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> result2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> answer2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">System</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">println</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"[OK]\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">test</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T1</span><span class=\"token plain\"> answer1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">test</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">answer1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">null</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-1-secret-entrance\"><a href=\"https://adventofcode.com/2025/day/1\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 1: Secret Entrance</a><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#day-1-secret-entrance\" class=\"hash-link\" aria-label=\"Direct link to day-1-secret-entrance\" title=\"Direct link to day-1-secret-entrance\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>A sprinkling of modular arithmetics trying to crack a code to a vault.</p></div></div>\n<p>I didn't expect to smack an <code>enum</code> class and <code>record</code> right away on the first\nday, but here we go.</p>\n<p>Overall haven't hit any issues. Except for the fact that closures are something\nthat Java has never been designed for… Which means that you cannot modify\nreferences of higher data types or values of primitive data types of variables\nfrom an outer scope of a closure… This is something that I don't really like\nand it kinda defeats a purpose of <code>.reduce()</code> or <code>.forEach()</code>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-2-gift-shop\"><a href=\"https://adventofcode.com/2025/day/2\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 2: Gift Shop</a><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#day-2-gift-shop\" class=\"hash-link\" aria-label=\"Direct link to day-2-gift-shop\" title=\"Direct link to day-2-gift-shop\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Comma-separated ranges… Quite obvious <code>int</code> won't do here… Adjustment for\nsecond part can be a bit worse if you try to go for the simplest possible\nsolution :)</p></div></div>\n<p>You could choose to solve this by having “fun” with strings, or if you are\ncapable of running the mental masturbation, you can also have fun with decimal\nnumeral system.</p>\n<p>Chosen the latter, though the adjustment for the second part was not that easy…</p>\n<p>Leading zeroes were something that caused some trouble on my end, but I got over\nit.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-3-lobby\"><a href=\"https://adventofcode.com/2025/day/3\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 3: Lobby</a><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#day-3-lobby\" class=\"hash-link\" aria-label=\"Direct link to day-3-lobby\" title=\"Direct link to day-3-lobby\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Min-maxxing the joltage on the batteries. Starts to feel like there's a theme\nof screwing around with base 10 numeral system <!-- -->👀</p></div></div>\n<p>Part 1 was relatively easy… a lot of copy-paste in the first solution.</p>\n<p>Part 2… that was not okay and it took some time to get over it. Probably had\na bad sleep or something, I knew what I want to do, but I just couldn't write it\nin the code and always hit some problem, almost felt like a <em>whack-a-mole</em>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-4-printing-department\"><a href=\"https://adventofcode.com/2025/day/4\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 4: Printing Department</a><a href=\"https://blog.mfocko.dev/blog/aoc-2025/third-01/#day-4-printing-department\" class=\"hash-link\" aria-label=\"Direct link to day-4-printing-department\" title=\"Direct link to day-4-printing-department\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Having fun with rolls of toilet paper on a 2D grid…</p></div></div>\n<p>Pretty straightforward for solving… Initial solution contained quite a lot of\ncopy-paste, of course.</p>\n<p>Trying to refactor the solution brought to surface first issues with Java… What\nI hate the most, is the fact that I am not able to make type aliases correctly.\nThe closest I've gotten to a type alias is something like:</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">private</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Index</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">extends</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Pair</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&lt;</span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">Integer</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token generics\"> </span><span class=\"token generics class-name\" style=\"color:hsl(35, 99%, 36%)\">Integer</span><span class=\"token generics punctuation\" style=\"color:hsl(119, 34%, 47%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>However that creates issues on its own, because, well, it utilizes the\ninheritance to construct a type alias. And the properties of the inheritance are\nthe issue here.</p>\n<p>More specifically, as you may know from OOP, you can reference objects of\n<code>Index</code> as <code>Pair&lt;Integer, Integer&gt;</code> as they “extend” the latter type, but you\ncannot do that in the other way… Because <code>Pair&lt;Integer, Integer&gt;</code> doesn't have\nto, and usually doesn't, implement anything under the <code>Index</code>. Even though we\ndon't add anything, there's not an easy way to tell…</p>\n<p>This is the first day where I started to abuse the relatively new <code>Stream</code>\nfeatures of Java <!-- -->😉<!-- --> More specifically, part 2 of the puzzle was to repeat\npart 1 until you run out of possible candidates. You can probably tell that the\nfirst go-to of anyone would be to go for <code>do-while</code> loop, which I did in the\ninitial solution, but then I thought that it might be possible to just “abuse”\nthe <code>Stream</code> <!-- -->😈<!-- --> so I did…</p>\n<div class=\"language-java codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-java codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Stream</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iterate</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">removableRoles</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">toList</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  indices </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!</span><span class=\"token plain\">indices</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">isEmpty</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  indices </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    indices</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">forEach</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">idx </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">first</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">second</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'x'</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">removableRoles</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">toList</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">mapToLong</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">roles </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-&gt;</span><span class=\"token plain\"> roles</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">size</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">sum</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>",
            "url": "https://blog.mfocko.dev/blog/aoc-2025/third-01/",
            "title": "First third of Advent of Code ‘25 in Java",
            "summary": "First third of Advent of Code ‘25.",
            "date_modified": "2025-12-08T06:00:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "advent-of-code",
                "advent-of-code-2025",
                "java"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/",
            "content_html": "<p>Every now and then I get angry at something not working on the Raspberry and so\nI decide to swap the OSs. Now it's time for something new and not expected.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://i.imgur.com/svLIfIg.png\" alt=\"fastfetch on the Raspberry\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"purpose-and-past\">Purpose and past<a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#purpose-and-past\" class=\"hash-link\" aria-label=\"Direct link to Purpose and past\" title=\"Direct link to Purpose and past\" translate=\"no\">​</a></h2>\n<p>After I've subscribed a VPS at vpsfree.cz for myself, I got an opportunity to\ndrop using an old laptop for running a local “server”. At that point all I've\nhad was self-hosted Gitea, some aliases on nginx and that was all. Out with the\nold laptop and let's begin experimenting with the Raspberry, right?</p>\n<p>The first OS that got on the Raspberry was <em>archLinux</em> (BTW…). I've been using\nit for a long time and had the best experience with. I haven't hit any issues,\nbut at the same time, you need to keep in mind we're running it off the SD card\nand they are known to get worn out quickly, especially if you write <strong>a lot</strong>\nwhich… guess what, is quite common with rolling and bleeding-edge distribution\n<!-- -->😄<!-- --> And the worst part is keeping up with the updates.</p>\n<p>And that's how I migrated to openSUSE Leap :) I've been using openSUSE for at\nleast 4 years during the high school and a bit more before and after… openSUSE\nis very user-friendly (YaST is amazing) distribution and honestly just works.\nHowever the cost lies in Cockpit not being available<sup><a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#user-content-fn-1-930d69\" id=\"user-content-fnref-1-930d69\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">1</a></sup> and some weird design\ndecision, e.g., networking stack is very fragile<sup><a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#user-content-fn-2-930d69\" id=\"user-content-fnref-2-930d69\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">2</a></sup>.</p>\n<p>And I've got finished in the recent weeks with some issues during updates, but\nthose can be, of course, blamed on me, cause I don't watch over it as I should\n:)</p>\n<p>I should probably sum up the latest state of what was running before I decided\nto go for a merciless wipe. So here it is:</p>\n<ul>\n<li class=\"\">local Gitea instance, just in case and out of habit</li>\n<li class=\"\">Wireguard connection for easy administration</li>\n<li class=\"\">Certbot &amp; nginx; nginx is probably the biggest piece of work as it also\nprovides reverse proxy for mikrotik router and Ubiquiti AP provided by ISP</li>\n<li class=\"\">CUPS server that has joined the journey once the HP printer was too big of\na pain in the <!-- -->🍑<!-- --> to handle via USB</li>\n<li class=\"\">DDNS service, cause there's public, but dynamic IP from ISP</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"choosing-the-next-distro\">Choosing the next distro<a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#choosing-the-next-distro\" class=\"hash-link\" aria-label=\"Direct link to Choosing the next distro\" title=\"Direct link to Choosing the next distro\" translate=\"no\">​</a></h2>\n<p>I had the switch in mind for some time, but I couldn't decide on the\ndistribution… In the ideal world, I'd just slap CentOS Stream on it, <strong>but</strong>\nthere's no Raspberry “support” for CentOS<sup><a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#user-content-fn-3-930d69\" id=\"user-content-fnref-3-930d69\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">3</a></sup>. So the other choices were plain\nDebian and something else from the RHEL-family which could be either Fedora<sup><a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#user-content-fn-4-930d69\" id=\"user-content-fnref-4-930d69\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">4</a></sup>,\nAlmaLinux or Rocky Linux.</p>\n<p>I should admit that I'm not a big Debian fan <!-- -->😄<!-- --> Even though <em>12 bookworm</em>\nis relatively on the same terms as anything that tries to match RHEL9, it still\nfeels weird. That might be caused by the fact that I've switched RPM-based\ndistributions a long time ago (including screwing around with archLinux and\n<em>Jean Tux</em><sup><a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#user-content-fn-5-930d69\" id=\"user-content-fnref-5-930d69\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">5</a></sup>) and never looked back (except for the desktop with NVIDIA GPU\nthat's pain in the <!-- -->🍑<!-- --> and only Ubuntu runs reasonably… well).</p>\n<p>Wearing the <em>red fedora</em> also ruled out the Rocky Linux <!-- -->🙂<!-- -->\nas I don't endorse nor support their <em>way of operation</em></p>\n<p>So AlmaLinux it is!</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"installing-almalinux-9\">Installing AlmaLinux 9<a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#installing-almalinux-9\" class=\"hash-link\" aria-label=\"Direct link to Installing AlmaLinux 9\" title=\"Direct link to Installing AlmaLinux 9\" translate=\"no\">​</a></h2>\n<p>I'm going with AlmaLinux 9.4 on Raspberry Pi 3B. Opened the AlmaLinux's wiki and\nfirst thing I got slapped by is</p>\n<blockquote>\n<p>original Raspberry Pi 3 (without \"+\" models) are not supported</p>\n</blockquote>\n<p>GREAT! I took the risk, installed it. And it didn't boot <!-- -->😁<!-- --> It turns out\nthat the WiFi kernel module caused a kernel panic on the boot. From some people\non Reddit I found that it caused some issues, <strong>but</strong> worked, so I've just\ndecided to pop the SD card back in a PC and deny the module from loading. Voilà!\nIt boots!</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"setting-up-the-local-server\">Setting up the “local server”<a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#setting-up-the-local-server\" class=\"hash-link\" aria-label=\"Direct link to Setting up the “local server”\" title=\"Direct link to Setting up the “local server”\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Public disclaimer</div><div class=\"admonitionContent_BuS1\"><p>I suck as admin…</p></div></div>\n<p>Both the Raspberry and my VPS are maintained in the <em>caveman-style</em> <!-- -->😄<!-- --> And\nthat's why I've decided to start with the less painful one (the Raspberry) to\nwrite the Ansible playbooks for :)</p>\n<p>I have already managed to migrate my dotfiles and “bootstrap” to be run via\nAnsible, so I've just proceeded to extend that and also reorganize it a bit,\ncause the roles grew in size <!-- -->👀</p>\n<p>And I have to admit that I've been mostly successful. Let's delve into details!</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"selinux\">SELinux<a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#selinux\" class=\"hash-link\" aria-label=\"Direct link to SELinux\" title=\"Direct link to SELinux\" translate=\"no\">​</a></h3>\n<p>Yeah… that's something that hasn't been running on the openSUSE and I totally\nforgot that hardening the SSHD config (including port change) requires notifying\nSELinux about the port change :) Of course I managed to cut myself off <!-- -->😄</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"certbot\">Certbot<a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#certbot\" class=\"hash-link\" aria-label=\"Direct link to Certbot\" title=\"Direct link to Certbot\" translate=\"no\">​</a></h3>\n<p>Certbot was the service I feared the most, as there is no reasonable way to\nautomate this. You need to run it manually at least the first time. But in the\nend, it was quite OK.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"cockpit\">Cockpit<a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#cockpit\" class=\"hash-link\" aria-label=\"Direct link to Cockpit\" title=\"Direct link to Cockpit\" translate=\"no\">​</a></h3>\n<p>One downside of <em>caveman-style</em> administration is the fact that you forget about\nthe tweaking you do. Reverse proxy breaks Cockpit by default. I was reading\nthrough the documentation, but haven't managed to find the part that mentioned\nthe specific settings I had to change. When I was about to open the PR with\nproposed changes, I noticed that it was in a different chapter <!-- -->🤦‍♂️</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"cups\">CUPS<a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#cups\" class=\"hash-link\" aria-label=\"Direct link to CUPS\" title=\"Direct link to CUPS\" translate=\"no\">​</a></h3>\n<p>Cups went rather smoothly… except for the fact that it doesn't work on the one\nand only Ubuntu desktop and there are no logs with reason why it fails to add\nthe printer <!-- -->🙂</p>\n<p>Additionally installing the HP printer via <code>hp-setup</code> is very interesting\nexperience… I would've never expected the CLI to have a progress bar that opens\nup at 0% and then just switches into <em>terms &amp; conditions</em>… Yes, that progress\nbar stayed at 0% even though it was downloading a PPD file <strong>and progressing</strong>.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"ddns\">DDNS<a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#ddns\" class=\"hash-link\" aria-label=\"Direct link to DDNS\" title=\"Direct link to DDNS\" translate=\"no\">​</a></h3>\n<p>I had smallish issue with deciding how to run the DDNS service. I went with\ndropping my own buggy script and had to choose a DDNS client. Found <em>inadyn</em>\n(that isn't built at all for Fedora and family) and <em>ddclient</em>. The <em>ddclient</em>\nhad some not very nice feedback, and the version that introduced the Cloudflare\nsupport I need, was not included, so I dropped that. <em>inadyn</em> is not packaged,\nso I've set it up as systemd timer spawning a container :)</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"summary\">Summary<a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#summary\" class=\"hash-link\" aria-label=\"Direct link to Summary\" title=\"Direct link to Summary\" translate=\"no\">​</a></h2>\n<p>Overall I've had a very pleasant experience setting up the AlmaLinux on the\nRaspberry. Even though I took a gamble with the officially unsupported model of\nRPi, it works. And it also seems to be filling the purpose it has!</p>\n<!-- -->\n<section data-footnotes=\"true\" class=\"footnotes\"><h2 class=\"anchor anchorTargetStickyNavbar_Vzrq sr-only\" id=\"footnote-label\">Footnotes<a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#footnote-label\" class=\"hash-link\" aria-label=\"Direct link to Footnotes\" title=\"Direct link to Footnotes\" translate=\"no\">​</a></h2>\n<ol>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-1-930d69\">\n<p>AFAIK there was some issue with dependencies, so it is available on\nTumbleweed and also in the latest Leap 15.6 <a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#user-content-fnref-1-930d69\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-2-930d69\">\n<p>By default uses <em>wicked</em> and even when running it on desktop via\n<em>NetworkManager</em> I've hit some inconsistencies with DNS, but… DNS <strong>is</strong> the\nDevil, right? <!-- -->😁 <a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#user-content-fnref-2-930d69\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-3-930d69\">\n<p>And neither RHEL to be fair ;) <a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#user-content-fnref-3-930d69\" data-footnote-backref=\"\" aria-label=\"Back to reference 3\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-4-930d69\">\n<p>6-month release cycle goes against the idea to have the least amount of\nupdates as possible… and on top of that I think that we can safely agree on\nthe fact that Fedora feels like <em>archLinux with extra steps</em> <a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#user-content-fnref-4-930d69\" data-footnote-backref=\"\" aria-label=\"Back to reference 4\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-5-930d69\">\n<p>Gentoo… <a href=\"https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/#user-content-fnref-5-930d69\" data-footnote-backref=\"\" aria-label=\"Back to reference 5\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n</ol>\n</section>",
            "url": "https://blog.mfocko.dev/blog/2024/07/20/raspberry-alma/",
            "title": "Raspberry Alma",
            "summary": "Finally migrating to a stable distro on Raspberry…\n",
            "date_modified": "2024-07-20T00:00:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "raspberry-pi",
                "opensuse",
                "almalinux",
                "ansible",
                "self-hosting"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/2024/06/19/devconf-2024/",
            "content_html": "<p>I'd like to share my experience and views on some of the talks that I've\nattended on the DevConf.cz 2024.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-1\">Day 1<a href=\"https://blog.mfocko.dev/blog/2024/06/19/devconf-2024/#day-1\" class=\"hash-link\" aria-label=\"Direct link to Day 1\" title=\"Direct link to Day 1\" translate=\"no\">​</a></h2>\n<p>Let's start with the first day which was Thursday this year as opposed to the\nprevious years when the conference started on Friday and finished on Sunday.</p>\n<p>Let's start with the <em><a href=\"https://pretalx.com/devconf-cz-2024/talk/AD3HWR/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">keynote</a></em>. The keynote wasn't very interesting, at some of\nthe slides actually felt like advertisement for other talks on the topic of the\nAI…</p>\n<p>Next talk about <em><a href=\"https://pretalx.com/devconf-cz-2024/talk/3UKGLB/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">event-driven Ansible</a></em> was way more interesting. It allows you\nto run Ansible playbooks after provisioning hosts, or on certain events, such as\ndiscovered vulnerabilities. On one hand it feels like a very nice thing, but on\nthe other one I can't help but to think how you need to write the playbooks, so\nthat they are generic enough. One more example that's been given comes from the\npossibility to react to tickets, e.g., outages and this feels like something\nthat could be abused to cause DoS.</p>\n<p>Afterwards we've seen two lightning talks, one about\n<em><a href=\"https://pretalx.com/devconf-cz-2024/talk/KSDRWL/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">choosing the right OpenShift size</a></em> which was a pretty quick, but listed all\nof the possible ways you can deploy OpenShift in detail. This lightning talk\nwas followed by the first AI (lightning) talk I've attended about\n<em><a href=\"https://pretalx.com/devconf-cz-2024/talk/H9QFLM/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">rapid prototyping</a></em> of the open-source AI models.</p>\n<p>As someone who's involved in the automation of the RPM packaging and testing, of\ncourse, we had to attend <em><a href=\"https://pretalx.com/devconf-cz-2024/talk/NNKT3F/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Learning from Nix</a></em>. Nix has a very intriguing\nconcept which is pretty powerful, but painful at the same time. This can be\nsummed up pretty nicely by <a href=\"https://twitch.tv/tsoding\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Tsoding</a> who got asked about some tips &amp; tricks for\nsomeone who wants to try out NixOS:</p>\n<blockquote>\n<p>Just don't.</p>\n</blockquote>\n<p>And now we're moving into a section where everything revolves about the Packit\nTeam :)</p>\n<p>First talk about <em><a href=\"https://pretalx.com/devconf-cz-2024/talk/ECU7QS/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">changelogs</a></em> was an interactive session that was (probably)\nmeant to share different approaches we take to handle this rather convoluted\ntopic that involves changelogs on both upstream and also on downstream with no\nrules<sup><a href=\"https://blog.mfocko.dev/blog/2024/06/19/devconf-2024/#user-content-fn-1-ba1b92\" id=\"user-content-fnref-1-ba1b92\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">1</a></sup>.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://i.imgur.com/YHstMAt.jpg\" alt=\"changelogs\" class=\"img_ev3q\"></p>\n<p>Next one was about <em><a href=\"https://pretalx.com/devconf-cz-2024/talk/7C38GJ/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">static analysis</a></em> done by <a href=\"https://openscanhub.dev/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">OpenScanHub</a>. I like the idea of\nrunning the static analysis that can uncover nasty bugs (as it has been even\nshowed in the talk) at the same time as they are introduced. I gotta admit that\nafter seeing the UI of the <a href=\"https://openscanhub.fedoraproject.org/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">deployed OpenScanHub</a> on the Fedora Infra, I couldn't\nhelp but to think about the <a href=\"https://x.com/usgraphics\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">United States Graphics Company</a> <!-- -->😄<!-- --> The UI is\nto the point, no fancy annoying shit, you get what you need, it's hard to get\nlost. <strong>Just simplicity.</strong> Best kind of UI/UX in my opinion.</p>\n<p>After the OpenScanHub talk we're getting to talks that were taken in a totally\ndifferent direction from the usual talks you're used to <!-- -->😉<!-- --> First one was\ngiven title of <em><a href=\"https://pretalx.com/devconf-cz-2024/talk/X8SYDG/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">“Indiana Jones and obsoleted projects”</a></em> by <a href=\"https://rodina-sucha.cz/@mirek\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Mirek</a>. He talked\nabout projects that got obsoleted, but started with projects that had no\nrelation to IT field at all. I'd mark this talk as a <em>stand up</em> without any\nhesitation.</p>\n<p>And finally we will wrap up the first day with the talk where speakers spoke the\nleast… <em><a href=\"https://pretalx.com/devconf-cz-2024/talk/BDMWF3/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">“Let the users speak!”</a></em> that involved users of both Packit and\nTesting Farm who spoke about their use case and benefits they gained from using\nboth services in a symbiosis.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-2\">Day 2<a href=\"https://blog.mfocko.dev/blog/2024/06/19/devconf-2024/#day-2\" class=\"hash-link\" aria-label=\"Direct link to Day 2\" title=\"Direct link to Day 2\" translate=\"no\">​</a></h2>\n<p>On the second day I've attended less talks to not burn myself out :) I've\nstarted with an AI-related talk with title <em><a href=\"https://pretalx.com/devconf-cz-2024/talk/QSF9QQ/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">“AI: Open source will save us!”</a></em>,\neven though this talk has been improvised, as the speakers from the schedule\ncouldn't have attended, it provided a nice overview what <a href=\"https://github.com/instructlab/instructlab\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">InstructLab</a> can do\nand how can you “feed” the relevant info into the language models by yourself.</p>\n<p>After that I attended a <em>“coffee enthusiasts Meetup”</em> which was very nice and,\nof course, an organized chaos <!-- -->😉</p>\n<p>Before attending the social event I wrapped up the second day with a lightning\ntalk about <em><a href=\"https://pretalx.com/devconf-cz-2024/talk/SXWE7K/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">recent updates in Toolbx</a></em>. I've used both <a href=\"https://containertoolbx.org/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">toolbx</a> and\n<a href=\"https://distrobox.it/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">distrobox</a>, so it's nice to see the improvements in progress and also that both\nprojects are well and lively.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-3\">Day 3<a href=\"https://blog.mfocko.dev/blog/2024/06/19/devconf-2024/#day-3\" class=\"hash-link\" aria-label=\"Direct link to Day 3\" title=\"Direct link to Day 3\" translate=\"no\">​</a></h2>\n<p>On the third day I've attended only in the afternoon. “Started” my day with\na discussion <em><a href=\"https://pretalx.com/devconf-cz-2024/talk/8PARM8/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">“Leadership: Where people skills meet programmers”</a></em> which was\nvery nice for gaining an insight into how developer, manager and QE lead roles\noverlap.</p>\n<p>That talk has been followed up by a talk about <a href=\"https://pretalx.com/devconf-cz-2024/talk/8T88MT/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">role rotation</a> in our Packit\nTeam. I would say it is a nice “upgrade” to the agile process which allows you\nto not create a single point of failure in the mundane and repetitive processes\nwithin your team.</p>\n<p>And this day has been finished off with a talk about <a href=\"https://pretalx.com/devconf-cz-2024/talk/WVNJZS/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">shifting left</a> in Podman.\nIt's nice to see how other teams utilize our Packit Service and also the\nservices we rely on, such as <a href=\"https://copr.fedorainfracloud.org/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Copr</a> or <a href=\"https://docs.testing-farm.io/Testing%20Farm/0.1/index.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Testing Farm</a>. With the help of Cockpit\ntests they can catch breaking changes early on, or even bugs that have been\nintroduced and break usage of the dependent projects.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://i.imgur.com/bp6FxT9.jpg\" alt=\"shifting left\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"picks-from-the-packit-team\">Picks from the Packit Team<a href=\"https://blog.mfocko.dev/blog/2024/06/19/devconf-2024/#picks-from-the-packit-team\" class=\"hash-link\" aria-label=\"Direct link to Picks from the Packit Team\" title=\"Direct link to Picks from the Packit Team\" translate=\"no\">​</a></h2>\n<p>On the Tuesday, during our Packit stand up, I have managed to abuse my\nKanban Lead role to collect some of the talks that each of us would recommend:</p>\n<ul>\n<li class=\"\"><a href=\"https://pretalx.com/devconf-cz-2024/talk/H9QFLM/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Rapid Prototyping</a> with Open Source AI Models</li>\n<li class=\"\">Do you like your <a href=\"https://pretalx.com/devconf-cz-2024/talk/ECU7QS/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">changelogs</a>?</li>\n<li class=\"\">OpenScanHub - <a href=\"https://pretalx.com/devconf-cz-2024/talk/7C38GJ/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Static Analysis</a> of a Linux Distribution</li>\n<li class=\"\">Creating a <a href=\"https://pretalx.com/devconf-cz-2024/talk/RXKMKA/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Language Server</a> for RPM Spec Files</li>\n<li class=\"\">Containers and Kubernetes Made Easy: A 15-minute dive into <a href=\"https://pretalx.com/devconf-cz-2024/talk/HKWP7V/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Podman Desktop</a></li>\n<li class=\"\"><a href=\"https://pretalx.com/devconf-cz-2024/talk/8PARM8/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">“Leadership: Where people skills meet programmers”</a></li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"wrap-up\">Wrap up<a href=\"https://blog.mfocko.dev/blog/2024/06/19/devconf-2024/#wrap-up\" class=\"hash-link\" aria-label=\"Direct link to Wrap up\" title=\"Direct link to Wrap up\" translate=\"no\">​</a></h2>\n<p>I have to admit that these 3 days have been pretty exhaustive, including\ninformation overload <!-- -->😄<!-- --> but at the same time it was really nice to meet\nwith the colleagues and at least some of our users who are not based in Brno.</p>\n<!-- -->\n<section data-footnotes=\"true\" class=\"footnotes\"><h2 class=\"anchor anchorTargetStickyNavbar_Vzrq sr-only\" id=\"footnote-label\">Footnotes<a href=\"https://blog.mfocko.dev/blog/2024/06/19/devconf-2024/#footnote-label\" class=\"hash-link\" aria-label=\"Direct link to Footnotes\" title=\"Direct link to Footnotes\" translate=\"no\">​</a></h2>\n<ol>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-1-ba1b92\">\n<p>except for the Fedora's downstream ;) <a href=\"https://blog.mfocko.dev/blog/2024/06/19/devconf-2024/#user-content-fnref-1-ba1b92\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n</ol>\n</section>",
            "url": "https://blog.mfocko.dev/blog/2024/06/19/devconf-2024/",
            "title": "DevConf.cz 2024",
            "summary": "Sharing my experience on DevConf.cz 2024.\n",
            "date_modified": "2024-06-19T00:00:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "🏭",
                "red-hat",
                "fedora",
                "devconf",
                "conferences"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/2024/02/07/lts-distros/",
            "content_html": "<p>Linux distributions are a common choice for running the servers. There's a wide\nvariety of distributions, but on the servers majority is made by only a few.</p>\n<p>Some corporations also profit from the support of the “big” distributions. Let's\ndive into the pros, cons and peculiarities of such <em>business</em>.</p>\n<p>This post is inspired/triggered by the following Mastodon post:\n<a href=\"https://hackers.town/@antijingoist/111864760073049505\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><img decoding=\"async\" loading=\"lazy\" src=\"https://i.imgur.com/mh5RAlV.png\" alt=\"Mastodon post about Ubuntu Pro\" class=\"img_ev3q\"></a></p>\n<div class=\"theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Disclaimer</div><div class=\"admonitionContent_BuS1\"><p>You may take my opinion with a grain of salt, since I'm affiliated with Red Hat,\nbut at the same time I've also seen the other side of the fence, so I know how\nit works from the perspective of the provider/maintainer.</p></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>If you are not very oriented in the matters of Linux distributions and\nmaintaining of packages, I suggest looking at the <a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#glossary\" class=\"\">glossary</a> at the\nend to have a better grasp of the terms that are used throughout the post.</p></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"point-of-linux-distributions\">Point of linux distributions<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#point-of-linux-distributions\" class=\"hash-link\" aria-label=\"Direct link to Point of linux distributions\" title=\"Direct link to Point of linux distributions\" translate=\"no\">​</a></h2>\n<p>First thing I'd like to point out is the point of the Linux distributions. What\nbenefit do they provide? And why there are so many of them…</p>\n<p>As it has been brought up many times by the <em>rms</em><sup><a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#user-content-fn-1-e115ff\" id=\"user-content-fnref-1-e115ff\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">1</a></sup>, Linux by itself is not\nenough, it's just the kernel that does the underlying work. We need more\nsoftware to utilize the hardware. That's the gap that Linux distributions bridge\nby providing the Linux and much more other software that we need.</p>\n<p>Each distribution is unique in its own way. Some prefer different ways of\nhandling the software (like Gentoo that allows you to compile it yourself) and\nothers stable releases of software (like Debian).</p>\n<p>In the end it mostly boils down to the packaging. I, as a user, want to do\nsomething like</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">$ sudo dnf5 install firefox</span><br></span></code></pre></div></div>\n<p>and not bother about anything else. I don't want to open browser to look the\nthing up, download it and then click mindlessly 500× “Next”. I just want to run\none command and when the maintainers decide it's time to move on, another one to\nupgrade the software to the newer version.</p>\n<p>Of course, for some use cases you want to minimize the latter. And even make\nsure that it's safe to do it when you need to. You don't want to break your\nproduction deployment just because someone decided it's time to push something\nout.</p>\n<p>That's when the <em>maintainers</em> come in. They take upon themselves the\nresponsibility of maintaining the packages. If you've ever used the Debian, you\nknow very well how <em>old</em> the software is, but that's what you might need for\nyour servers.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"pain-of-packaging\">Pain of packaging<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#pain-of-packaging\" class=\"hash-link\" aria-label=\"Direct link to Pain of packaging\" title=\"Direct link to Pain of packaging\" translate=\"no\">​</a></h2>\n<p>Packaging software <em>is not</em> cost-free. You may as well have 80 % of packages\nthat don't need much care and it's rather easy to push them forward, but those\nremaining, which are complicated and raise issues regularly, will make it up and\ntake a lot of time and also pain.</p>\n<p>Libraries are the most common example that might not need much work to be done.\nOn the other hand, Linux kernel itself is a rather complicated machinery that\nis patched <strong>a lot</strong> and its build process is not simple either.</p>\n<p>Even if you consider just those <em>easily-maintainble</em> packages, the process can\nbe tedious, boring and overall time consuming.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Shameless RHEL-based ecosystem plug</div><div class=\"admonitionContent_BuS1\"><p><a href=\"https://packit.dev/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Packit</a> can help tremendously with the <em>easily-maintainable</em> packages, since it\n<strong>can</strong> be automated.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"packaging-whole-ecosystems\">Packaging whole ecosystems<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#packaging-whole-ecosystems\" class=\"hash-link\" aria-label=\"Direct link to Packaging whole ecosystems\" title=\"Direct link to Packaging whole ecosystems\" translate=\"no\">​</a></h3>\n<p>Now it's time to talk about whole ecosystems that have some kind of a packaging\nby themselves. Yes, I mean Python (with its continuous stream of different\npackage managers), Rust, Go, etc.</p>\n<p>Whole point of packaging is to have some form of <em>gating</em>. In other words, you\nwant some kind of <em>quality control</em> when pushing changes into the Linux distros.</p>\n<p>If you want to package some tool (or even library) from the aforementioned\necosystems, you need to package all of the dependencies to make sure something\ndoesn't get updated in the meantime (and also that you can safely reproduce the\nbuilds, if need be).</p>\n<p>I've tried to package some utilities for EPEL both in Rust and Go. Dependencies\nform a DAG<sup><a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#user-content-fn-2-e115ff\" id=\"user-content-fnref-2-e115ff\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">2</a></sup> and in case of Rust, it's <em>very</em> similar to the way <code>npm</code> does\nits packaging.</p>\n<div class=\"theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>Spoiler alert</div><div class=\"admonitionContent_BuS1\"><p>You get a lot of dependencies. And since it's a tree of dependencies, there may\nbe <strong>a lot</strong> of them.</p></div></div>\n<p>I have no clue how do the Rust maintainers operate, but I'm tipping my fedora in\ntheir direction, since it must be a <em>pain in the ass</em>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"paid-distributions\">Paid distributions<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#paid-distributions\" class=\"hash-link\" aria-label=\"Direct link to Paid distributions\" title=\"Direct link to Paid distributions\" translate=\"no\">​</a></h2>\n<p>You can find few Linux distributions that are “paid”. I'm very well aware of the\nfact I've used quotes around the word, cause it's not that easy and not even\nsame for all of the distributions that involve some kind of a payment.</p>\n<p>One of the first non-free distributions I've come into contact was <em><a href=\"https://zorin.com/os/pro/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Zorin OS</a></em>\nwhich basically tries to be the best <em>transition</em> solution when moving away from\nthe Windows or macOS. If you have a look at the <em>perks</em> of its <em>Pro</em> version\nthat's paid, you may as well decide they are rather questionable…</p>\n<p>It's time to move into the <em>Ubuntu Pro</em>, <em>RHEL</em> and <em>SLE</em> territory. What's the\npoint of those? They definitely offer different kind of, let's say,\n<em>non-free experience</em>.</p>\n<p>With those you are paying mainly for the support and bug/security patches.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>Fun fact</div><div class=\"admonitionContent_BuS1\"><p>There's no mention of any kind of support on the Zorin page… Apart from the fact\nthat <em>you are supporting</em> the Zorin development.</p></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"repository-structure\">Repository structure<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#repository-structure\" class=\"hash-link\" aria-label=\"Direct link to Repository structure\" title=\"Direct link to Repository structure\" translate=\"no\">​</a></h2>\n<p>As I have mentioned above, the three <em>services</em><sup><a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#user-content-fn-3-e115ff\" id=\"user-content-fnref-3-e115ff\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">3</a></sup> I mentioned are providing\nsupport with regards to bugs and security vulnerabilites. Therefore it makes\nsense to have some kind of a process in place when you're pushing changes\n(either updates, patches or <em>security</em> patches) to the distribution. And yes,\nthese processes are <em>in place</em>.</p>\n<p>If you think about the amount of packages that is present in the community\ndistributions like <em>archLinux</em> (14,830 packages) or <em>Fedora</em> (74,309 packages),\nit is safe to come to a conclusion that <em>there's no way</em> to support all of them.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>archLinux</div><div class=\"admonitionContent_BuS1\"><p>It may seem that archLinux contains rather small set of packages, but one of the\n<em>killer features</em> of archLinux lies in the AUR (archLinux User Repository) where\nyou can find additional <strong>93,283</strong> packages.</p></div></div>\n<p>That's why the Linux distributions have some structure to their repositories\nthat contain packages. The way you go around this is rather simple, you choose\nsome set of <em>critical</em> packages that you guarantee support for (like Linux\nkernel, openSSL, etc.) and maintain those with all the QA processes in place.</p>\n<div class=\"theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Unpopular opinion</div><div class=\"admonitionContent_BuS1\"><p>This is also one of the reasons why I'm quite against packaging anything and\neverything into the Linux distribution. In my opinion it is impossible to\n<strong>properly</strong> maintain <strong>huge</strong> set of packages and enforce some kind of\n<strong>quality control</strong>.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"ubuntu\">Ubuntu<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#ubuntu\" class=\"hash-link\" aria-label=\"Direct link to Ubuntu\" title=\"Direct link to Ubuntu\" translate=\"no\">​</a></h3>\n<p>Ubuntu has pretty granular structure of their repositories, namely:</p>\n<ul>\n<li class=\"\"><code>main</code> containing the “core” of the Ubuntu that is maintained by the Canonical,</li>\n<li class=\"\"><code>universe</code> containing literally the “universe”, packages that everyone likes,\nbut they're not crucial, this repo is maintained mostly by the community,</li>\n<li class=\"\"><code>multiverse</code> containing packages with some license or copyright issues, and</li>\n<li class=\"\"><code>restricted</code> containing <em>proprietary</em> packages like nvidia drivers and such.</li>\n</ul>\n<p>By briefly checking my Ubuntu 23.10 installation, here are stats of packages in\ntheir respective repositories:</p>\n<ul>\n<li class=\"\"><code>main</code> with 6,128 packages,</li>\n<li class=\"\"><code>universe</code> with 63,380 packages,</li>\n<li class=\"\"><code>multiverse</code> with 997 packages, and finally</li>\n<li class=\"\"><code>restricted</code> with 784 packages.</li>\n</ul>\n<p>As you can see, if we sum them up, they are relatively similar to the Fedora\nnumbers.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"centos\">CentOS<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#centos\" class=\"hash-link\" aria-label=\"Direct link to CentOS\" title=\"Direct link to CentOS\" translate=\"no\">​</a></h3>\n<p>CentOS on the other hand has a bit simpler structure with BaseOS for the base\nand AppStream for additional packages:</p>\n<ul>\n<li class=\"\"><code>baseos</code> with 1,058 packages,</li>\n<li class=\"\"><code>appstream</code> with 5,646 packages, and</li>\n<li class=\"\"><code>extras-common</code> with 42 packages.</li>\n</ul>\n<p>Overall they make up the similar number as the Ubuntu's <code>main</code> repository. And\nyou can also notice that there are no additional repositories.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>There's also a CRB (CodeReady Builder) repository with dev packages like headers\nand such.</p><p>And you can also enable EPEL (Extra Packages for Enterprise Linux) which is\ncommunity-supported and provides another 19,903 packages.</p></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"ubuntu-pro\">Ubuntu Pro<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#ubuntu-pro\" class=\"hash-link\" aria-label=\"Direct link to Ubuntu Pro\" title=\"Direct link to Ubuntu Pro\" translate=\"no\">​</a></h2>\n<p>Now it's time to get back to the Ubuntu Pro. There are multiple points that need\nto be taken in account to be either positive or negative about it…</p>\n<p>We can start with the way Ubuntu is released and maintained. Ubuntu has regular\n6-month release cycle and biannual LTS release. Releases are normally supported\nfor 9 months with the exception of the LTS releases being supported for 5 years.</p>\n<p>If you check out the <em><a href=\"https://ubuntu.com/pro/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Ubuntu Pro</a></em> website, you can find the following\nstatement:</p>\n<blockquote>\n<p><strong>Ubuntu Pro</strong></p>\n<p>The most comprehensive subscription for open-source software security</p>\n<p>30-day trial for enterprises. Always free for personal use.</p>\n</blockquote>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Personal use</div><div class=\"admonitionContent_BuS1\"><p>Ubuntu Pro for <em>personal use</em> consists of 5 installations and in case of the\ncommunity <em>ambassadors</em> 50.</p></div></div>\n<p>Overall if you try to find what is included in the Ubuntu Pro:</p>\n<ul>\n<li class=\"\">high and critical patches,</li>\n<li class=\"\">10 years of maintenance, and</li>\n<li class=\"\">(optional) 24/7 enterprise-grade support.</li>\n</ul>\n<p>If we get back to the screenshot all the way at the beginning of the post:\n<a href=\"https://hackers.town/@antijingoist/111864760073049505\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><img decoding=\"async\" loading=\"lazy\" src=\"https://i.imgur.com/mh5RAlV.png\" alt=\"Mastodon post about Ubuntu Pro\" class=\"img_ev3q\"></a></p>\n<p>and try to look up to which repository the packages mentioned in the screenshot\nbelong, we will find out that they belong to <code>universe</code> repository which is\nmaintained by the community. Not to mention nature of the packages: multimedia.</p>\n<p>You may think about this as a scam, but considering repository consisting of 70k\npackages, it is not an easy task to do. And with LTS releases we're talking\nabout 5+ years of support.</p>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Fedora</div><div class=\"admonitionContent_BuS1\"><p>Try to compare this state to Fedora. It also has a 6-month release cycle, but\nthere are no LTS releases and each release is supported only for a year.</p></div></div>\n<p>Common strategy, at this point, is to pull out the <em>open-source</em>. Yes, we are\nstill dealing with the open-source, but keep in mind that you're trying to patch\nsome issue in a version that's 5 years old, upstream definitely doesn't care\nanymore<sup><a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#user-content-fn-4-e115ff\" id=\"user-content-fnref-4-e115ff\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">4</a></sup>, the development didn't stop 5 years ago, it's going on and fixing\nthis issue in a release from 5 years is not the same as fixing it in the current\nrelease. At this point, if you are paying for such support, you are actually\npaying for someone to do <em>software archaeology</em> which <strong>can be</strong> <em>non-trivial</em>\nto do.</p>\n<p>In the case of Ubuntu Pro we're talking about community support and best-effort\nsupport by Canonical for the paying customers. And that makes sense to me,\nrunning LTS distro for 5+ years on a desktop seems like an odd choice, even\nwith the help of <em><a href=\"https://podman.io/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">podman</a></em> and <em><a href=\"https://distrobox.it/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">distrobox</a></em> or <em><a href=\"https://containertoolbx.org/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">toolbx</a></em> that allow us to use\nstable or LTS distro as a base and containerized development environments on top\nof that.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"rhel-ecosystem\">RHEL ecosystem<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#rhel-ecosystem\" class=\"hash-link\" aria-label=\"Direct link to RHEL ecosystem\" title=\"Direct link to RHEL ecosystem\" translate=\"no\">​</a></h2>\n<p>RHEL ecosystem is much more complicated in this matter. However it's very\nsimilar to the way SUSE operates with few exceptions.</p>\n<p>You can see a flow diagram here:</p>\n<!-- -->\n<p>Key things to take and not to take from the flow diagram:</p>\n<ul>\n<li class=\"\">getting from one upstream to its respective downstream is not as simple as the\npresence of an arrow and it's not the same process for all of them</li>\n<li class=\"\">lengths of the arrows are not proportional, specifically:<!-- -->\n<ul>\n<li class=\"\">Fedora Rawhide is <em>supposed to</em> consume updates as soon as possible,</li>\n<li class=\"\">depending on the decision of the maintainer they can, but <em>don't have to</em> be\nincluded in the currently supported Fedora releases (you can take <a href=\"https://src.fedoraproject.org/rpms/emacs/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Emacs</a> as\nan example of such package), but Rawhide eventually becomes the next Fedora\nrelease,</li>\n<li class=\"\">CentOS Stream gets branched off a specific Fedora release, and then</li>\n<li class=\"\">ultimately CentOS Stream becomes the next <strong>minor</strong> release of RHEL.</li>\n</ul>\n</li>\n<li class=\"\">this diagram is simplified by <strong>a lot</strong></li>\n</ul>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>SUSE flow for comparison</div><div class=\"admonitionContent_BuS1\"><p>I'll also include a SUSE flow, so you can compare:</p><p>You can notice, as opposed to the RHEL ecosystem, some changes are being\nbackported to the openSUSE Leap.</p><p>However this is subject to change as there is a new <a href=\"https://susealp.io/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">ALP</a> project arising which\nis, more than likely, going to replace the Leap.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"change-in-the-model\">Change in the model<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#change-in-the-model\" class=\"hash-link\" aria-label=\"Direct link to Change in the model\" title=\"Direct link to Change in the model\" translate=\"no\">​</a></h3>\n<p>The flow I've shown above is in effect since late ‘20 and early ‘21. I hope you\ncan see that it is quite similar to the way SUSE operates too. Before late ‘20\nthe flow was following:</p>\n<!-- -->\n<p>CentOS was the last distribution in that “chain”. This provides some benefits\nand some negatives.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"before-the-change\">Before the change<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#before-the-change\" class=\"hash-link\" aria-label=\"Direct link to Before the change\" title=\"Direct link to Before the change\" translate=\"no\">​</a></h4>\n<p>From the point of a developer, unless you have some kind of an early access to\nRHEL, you don't see the changes until they land and are already released. This\nimpairs your ability to test and verify your software before shipping it to your\nclients that use RHEL.</p>\n<p>From the point of a user, there is one positive, you basically get “free RHEL”\nwithout the support. This also allowed you to report bugs against the RHEL,\nsince they were 1:1 distros (minus the branding and support). So you'd\ntechnically get RHEL free of charge.</p>\n<p>Benefit of such project, except for the cost, is questionable. The main issue,\nwhich actually became even more apparent after changing the flow, is someone\nelse repackaging your own product and selling it again.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"after-the-change\">After the change<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#after-the-change\" class=\"hash-link\" aria-label=\"Direct link to After the change\" title=\"Direct link to After the change\" translate=\"no\">​</a></h4>\n<p>First of all, the current flow counters the issue mentioned above. You can test\nyour projects against the <em>next minor RHEL release</em>. CentOS Stream is free, so\nyou can freely incorporate it into your CI pipelines.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Shameless plug pt. 2</div><div class=\"admonitionContent_BuS1\"><p>Again, <a href=\"https://packit.dev/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Packit</a> can help you on upstream to verify that you're not breaking your\nRPM builds and on top of that you can also use <a href=\"https://docs.testing-farm.io/Testing%20Farm/0.1/index.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Testing Farm</a> to run tests on a\nspecific Fedora or CentOS Stream releases.</p><blockquote>\n<p>Green tests may not be green everywhere and catching such issues as soon as\npossible costs much less than catching them further down the chain.</p>\n</blockquote></div></div>\n<p>There are many people thinking that RHEL has become closed-source. It is not.\nThe development happens <em>out in the open</em>, it's more open that it was before.\nHowever with the cost of not getting the exact same thing for free. You can get\nthe next minor RHEL, not the same that's normally paid for. <a href=\"https://packit.dev/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Packit</a> is an\nexample of a service that is deployed on the CentOS 9 Stream and even used to be\ndeployed on Fedora, but the regular 6-month release cycle caused some minor\nissues here and there.</p>\n<p><em>Production-ready</em> is something that heavily depends on the context…</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Free “clones”</div><div class=\"admonitionContent_BuS1\"><p>After this change so-called <em>free “clones”</em> emerged. I have to admit that in\ncase of <em><a href=\"https://almalinux.org/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">AlmaLinux</a></em> I can see some benefits e.g., pushing for live images and\nsupport of various desktop environments, Raspberry Pi support or even WSL images\nbeing present in the M$ Store and easy to install.</p></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"open-source-and-paid-support\">Open-source and paid support<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#open-source-and-paid-support\" class=\"hash-link\" aria-label=\"Direct link to Open-source and paid support\" title=\"Direct link to Open-source and paid support\" translate=\"no\">​</a></h2>\n<p>Overall I don't think that paying for the support of 5 years old <em>non-critical</em>\npackages is going against the open-source. It is a non-trivial work that, in\nmajority of cases, cannot be included in the upstream, therefore the benefit is\nreapt only by the paying customers. I have to admit that in the case of the\nUbuntu Pro it may seem a bit weird (hiding patches behind the paywall). However\nwe're still talking about rather big set of packages that will affect a minority\nof server workloads, if any.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"glossary\">Glossary<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#glossary\" class=\"hash-link\" aria-label=\"Direct link to Glossary\" title=\"Direct link to Glossary\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\">\n<p><em>rolling release</em> - continuously released without “significant milestones”</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>As an example of rolling distribution you can take archLinux, openSUSE\nTumbleweed, Fedora Rawhide, or even CentOS 9 Stream.</p><p>As en example of <strong>not</strong> rolling distribution you can take Ubuntu, openSUSE\nLeap or Fedora.</p></div></div>\n</li>\n<li class=\"\">\n<p><em>bleeding edge</em> - contains the latest versions as they are released on the\nupstream</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>As an example you can take archLinux, openSUSE Tumbleweed or Fedora Rawhide.\nYou can also notice how common it is to combine <em>rolling release</em> with\n<em>bleeding edge</em>.</p></div></div>\n</li>\n<li class=\"\">\n<p><em>upstream</em> &amp; <em>downstream</em></p>\n<p>You're most likely to meet these terms in the meaning of upstream being the\nproject itself and downstream being the packaging of said project in some\ndistribution.</p>\n<p>However this can also apply to distributions like <em>openSUSE Tumbleweed</em> with\n<em>openSUSE Leap</em>, <em>Fedora</em> with <em>CentOS Stream</em>, or even <em>CentOS Stream</em> with\n<em>RHEL</em>. This basically means that the packages/software is being released into\nthe upstream (Tumbleweed, Fedora, or even CentOS) and then after being tested\nis taken further down into their respective downstreams (Leap, CentOS, RHEL).</p>\n</li>\n</ul>\n<!-- -->\n<section data-footnotes=\"true\" class=\"footnotes\"><h2 class=\"anchor anchorTargetStickyNavbar_Vzrq sr-only\" id=\"footnote-label\">Footnotes<a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#footnote-label\" class=\"hash-link\" aria-label=\"Direct link to Footnotes\" title=\"Direct link to Footnotes\" translate=\"no\">​</a></h2>\n<ol>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-1-e115ff\">\n<p>Richard Stallman <a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#user-content-fnref-1-e115ff\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-2-e115ff\">\n<p>directed acyclic graph <a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#user-content-fnref-2-e115ff\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-3-e115ff\">\n<p>Ubuntu Pro is technically a service whereas the RHEL and SLE are distros\nwith the support included. <a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#user-content-fnref-3-e115ff\" data-footnote-backref=\"\" aria-label=\"Back to reference 3\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-4-e115ff\">\n<p>There are upstream projects that keep LTS branches, such as Linux kernel,\nbut even in the case of the kernel itself, they're planning on ending it,\nsince the cost outweighs the benefits at this point. <a href=\"https://blog.mfocko.dev/blog/2024/02/07/lts-distros/#user-content-fnref-4-e115ff\" data-footnote-backref=\"\" aria-label=\"Back to reference 4\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n</ol>\n</section>",
            "url": "https://blog.mfocko.dev/blog/2024/02/07/lts-distros/",
            "title": "LTS distributions",
            "summary": "Shower thoughts on the LTS Linux distributions.\n",
            "date_modified": "2024-02-07T00:00:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "lts",
                "linux distributions",
                "support",
                "paywall"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/",
            "content_html": "<p>Rust has become a rather popular language these days. I've managed to get my\nhands dirty with it during <em><a href=\"https://adventofcode.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Advent of Code</a></em> ‘22 and partially ‘23. I've also\nused it for few rounds of <em><a href=\"https://codeforces.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Codeforces</a></em> and I have to try very hard to maintain\nsome variety of languages for LeetCode challenges along with Rust. I'll disclaim\nup front that I won't be only positive, since this post is a result of multiple\ndiscussions about Rust and I stand by <em>“All that glitters is not gold”</em>, so if\nyou can't stand your favorite language being criticized in any way, don't even\nproceed. <!-- -->😉</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"memory-safety\">Memory safety<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#memory-safety\" class=\"hash-link\" aria-label=\"Direct link to Memory safety\" title=\"Direct link to Memory safety\" translate=\"no\">​</a></h2>\n<p>I'll start by kicking the biggest benefit of the language, the memory safety.\nLet's be honest here, majority of the checks rely on the static analysis, cause\nyou can't do anything else during the compile-time, right? Therefore we can\nbasically say that we are relying on the compiler to “solve” all of our issues.</p>\n<div class=\"theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>danger</div><div class=\"admonitionContent_BuS1\"><p>I'm not doubting the fact that compiler can prevent <strong>a lot</strong> of the memory\nerrors, I'm just saying it's not realistic to cover <strong>everything</strong>.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"compiler\">Compiler<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#compiler\" class=\"hash-link\" aria-label=\"Direct link to Compiler\" title=\"Direct link to Compiler\" translate=\"no\">​</a></h3>\n<p>I guess we can safely<sup><a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#user-content-fn-2-e21849\" id=\"user-content-fnref-2-e21849\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">1</a></sup> agree on the fact that we 100% rely on the compiler to\n<em>have our back</em>. Is the compiler bug-free? I doubt it. This is not meant in an\noffensive way to the Rust compiler developers, but we need to be realistic here.\nIt's a compiler, even older and larger projects like <em>gcc</em> or <em>llvm</em> can't avoid\nbugs to appear.</p>\n<p>When I was trying out Rust for some of the LeetCode challenges I've stumbled\nupon the following warning:\n<img decoding=\"async\" loading=\"lazy\" src=\"https://i.imgur.com/NfPLF6o.png\" alt=\"Example of a compiler bug\" class=\"img_ev3q\"></p>\n<div class=\"theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span><a href=\"https://github.com/rust-lang/rust/issues/59159\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Issue</a></div><div class=\"admonitionContent_BuS1\"><p>The issue here comes from the fact that we have 2 simultaneous references to the\nsame memory (one is mutable and one immutable). If you cannot think of any way\nthis can break, I'll give you a rather simple example from C++ where this could\ncause an issue.</p><p>Imagine a function that has some complex object and also calls a coroutine which\nutilizes read-only reference to that object. When the coroutine suspends, the\ncaller can modify the object. This can break the integrity of data read by the\ncoroutine.</p><ul>\n<li class=\"\">Yes, this <strong>can</strong> cause a memory error.</li>\n<li class=\"\">Yes, this <strong>hasn't</strong> been handled until someone noticed it.</li>\n</ul><p>Fixing this bug is not backwards compatible, cause you're covering a case that\nhasn't been covered before.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"enforcing-the-safety\">Enforcing the safety<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#enforcing-the-safety\" class=\"hash-link\" aria-label=\"Direct link to Enforcing the safety\" title=\"Direct link to Enforcing the safety\" translate=\"no\">​</a></h3>\n<p>One of the ways Rust enforces the safety is by restricting what you can do, like\nthe example above. Aforementioned issue <em>can</em> happen, but <strong>doesn't have to</strong>.\nRule of the thumb in the Rust compiler is to <em>“block”</em> anything that can be an\nissue, static analysis can't do much more, it cannot decide whether it's safe to\ndo it or not.</p>\n<p>Satisfying the Rust compiler is sometimes a brutal pain in the ass, because you\ncannot do things like you're used to, you need to work around them <em>somehow</em>.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Key difference between Rust and C or C++ lies in the fact that Rust chooses to\n<em>ban</em> all “potentially offensive” actions, C and C++ <em>relies</em> on <strong>you</strong> to be\nsure it's safe to do.</p><p><img decoding=\"async\" loading=\"lazy\" src=\"https://i.imgur.com/0vbkYPp.png\" alt=\"C++ v. Rust\" class=\"img_ev3q\"></p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"consequences\">Consequences<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#consequences\" class=\"hash-link\" aria-label=\"Direct link to Consequences\" title=\"Direct link to Consequences\" translate=\"no\">​</a></h3>\n<p>Where are we heading with this approach of “if it compiles, it runs” though?\nIn this aspect I have a rather similar opinion as with regards to the ChatGPT\nand its derivatives.</p>\n<p>If you teach people to 100% depend on the compiler, they will do it, cause it's\n<em>easy</em>. All you need to do is make the compiler <em>shut up</em><sup><a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#user-content-fn-3-e21849\" id=\"user-content-fnref-3-e21849\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">2</a></sup>. Giving up the\n<em>intellectual masturbation</em> about the memory safety will make you lose your edge\nover the time. When we get to the point of everyone being in the mindset\nmentioned above, who's going to maintain the compiler? This is the place where\nyou <strong>need to</strong> think about the memory safety and furthermore in a much more\ngeneral way than in your own projects, because it is the thing that everyone\n<em>blindly believes in</em> in the end.</p>\n<p>I'm not saying that everyone should give up Rust and think about their memory\nmanagement and potential memory issues. I'm just saying that going the easy way\nwill make people <em>dull</em> and they should think about it anyways, that's how the\nissue above has been discovered. If everyone walked past and didn't think about\nit, no one would discover this issue till it bit them hard.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Standard library</div><div class=\"admonitionContent_BuS1\"><p>Even the standard library is littered with <code>unsafe</code> blocks that are prefixed\nwith comments in style:</p><div class=\"language-rs codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rs codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">// SAFETY: …</span><br></span></code></pre></div></div><p>The fact that the <em>casual</em> Rust dev doesn't have to think much about safety,\ncause the compiler has their back, doesn't mean that the Rust compiler dev\ndoesn't either.</p><p>I gotta admit that I adopted this concept in other languages (even in Python),\ncause you can encounter situations where it doesn't have to be clear <em>why</em> you\ncan do <em>what</em> you're doing.</p></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"development--design\">Development &amp; design<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#development--design\" class=\"hash-link\" aria-label=\"Direct link to Development &amp; design\" title=\"Direct link to Development &amp; design\" translate=\"no\">​</a></h2>\n<p>Development of Rust is… very fast. One positive is that they're trying to be as\nbackward compatible as possible at least by verifying against all the published\ncrates in the process. Of course, you cannot be backward compatible about fixing\nthe bugs that have been found, but such is life.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"fast-development-cycle\">Fast development cycle<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#fast-development-cycle\" class=\"hash-link\" aria-label=\"Direct link to Fast development cycle\" title=\"Direct link to Fast development cycle\" translate=\"no\">​</a></h3>\n<p>One of the negatives of the fast development cycle is the fact that they're\nusing the latest features already in the next release of Rust. Yes, it is\nsomething that you can use for verifying and testing your own changes, but at\nthe same time it places a requirement of the latest release to compile the next\none.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>If you check <code>gcc</code> for example, they have a requirement of minimal version of\ncompiler that you need for the build. Though gcc's requirement is not so <em>needy</em>\nas the Rust one.</p></div></div>\n<p>One of the other negatives is the introduction of bugs. If you're pushing\nchanges, somewhat mindlessly, at such a fast pace, it is inevitable to introduce\na bunch bugs in the process. Checking the GitHub issue tracker with</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">is:issue is:open label:C-bug label:T-compiler</span><br></span></code></pre></div></div>\n<p>yields <strong>2,224</strong> open issues at the time of writing this post.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"rfcs\">RFCs<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#rfcs\" class=\"hash-link\" aria-label=\"Direct link to RFCs\" title=\"Direct link to RFCs\" translate=\"no\">​</a></h3>\n<p>You can find <strong>a lot</strong> of RFCs for Rust. Some of them are more questionable than\nthe others. Fun thing is that a lot of them make it to the nightly builds, so\nthey can be tested and polished off. Even the questionable ones… I'll leave\na few examples for a better understanding.</p>\n<p>One of such features is the <code>do yeet</code> expression:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#![feature(yeet_expr)]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">foo</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">do</span><span class=\"token plain\"> yeet </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">assert_eq!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">foo</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Err</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">bar</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Option</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">do</span><span class=\"token plain\"> yeet</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">assert_eq!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">bar</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">None</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>It allows you to “yeet” the errors out of the functions that return <code>Result</code> or\n<code>Option</code>.</p>\n<p><a href=\"https://github.com/rust-lang/rfcs/pull/3503\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">One</a> of the more recent ones is\nthe ability to include Cargo manifests into the sources, so you can do something\nlike:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">#</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">/</span><span class=\"token plain\">usr</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">/</span><span class=\"token plain\">bin</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">/</span><span class=\"token plain\">env cargo</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">dependencies</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">clap </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> version </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"4.2\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> features </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"derive\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token namespace\">clap</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Parser</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[derive(Parser, Debug)]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[clap(version)]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">struct</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Args</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[clap(short, long, help = </span><span class=\"token attribute attr-name string\" style=\"color:hsl(119, 34%, 47%)\">\"Path to config\"</span><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">)]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    config</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Option</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token namespace\">std</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token namespace\">path</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">PathBuf</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> args </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Args</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">parse</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">println!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"{:?}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> args</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>I would say you can get almost anything into the language…</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"community-and-hype-train\">Community and hype train<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#community-and-hype-train\" class=\"hash-link\" aria-label=\"Direct link to Community and hype train\" title=\"Direct link to Community and hype train\" translate=\"no\">​</a></h2>\n<p>Rust community is a rather unique thing. A lot of people will hate me for this,\nbut I can't help, but to compare them to <em>militant vegans</em>. I'll go through some\nof the things related to it, so I can support my opinion at least.</p>\n<p><em>Rust is the best language.</em> It is not. There is no best language, each has its\nown positives and negatives, you need to choose the language that's <strong>the most</strong>\n<strong>suitable for your use case</strong>. There are areas where Rust excels, though I have\nto admit it's very close to being a universal hammer regardless of how suitable\nit is. There is a very steep learning curve to it, beginnings in Rust are very\npainful.</p>\n<p><em>Rewrite everything in Rust.</em> Just no. There are multiple feedbacks on doing\nrewrites, it is very common to fix <em>N</em> bugs with a rewrite while introducing\n<em>N + 1</em> other bugs in the process. It doesn't solve anything unless there are\nsome strong reasons to go with it. Majority of such suggested rewrites don't\nhave those reasons though.</p>\n<p><em>Language ‹x› is bad, though in Rust…</em> Cherry-picking one specific pain point of\none language and reflecting how it is better in other language can go both ways.\nFor example it is rather easy to pick the limitations imposed by Rust compiler\nand show how it's possible in other languages <!-- -->🤷‍♂️</p>\n<p>I don't mind any of those opinions, you're free to have them, as long as you\ndon't rub them in my face which is not the usual case… This experience makes it\njust worse for me, part of this post may be also influenced by this fact.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"rust-in-linux\">Rust in Linux<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#rust-in-linux\" class=\"hash-link\" aria-label=\"Direct link to Rust in Linux\" title=\"Direct link to Rust in Linux\" translate=\"no\">​</a></h3>\n<div class=\"theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>As someone who has seen the way Linux kernel is built in the RHEL ecosystem, how\ncomplex the whole thing is and how much resources you need to proceed, I have\nvery strong opinions on this topic.</p></div></div>\n<p>It took years of work to even “incorporate” Rust into the Linux codebase, just\nto get the “Hello World!”. I don't have anything against the idea of writing\ndrivers in Rust, I bet it can catch a lot of common mistakes, but still\nintroducing Rust to the kernel is another step to enlarge the monster.</p>\n<p>I have to admit though that the <em>Apple GPU</em> driver for Linux written in Rust is\nquite impressive. Apart from that there are not so many benefits, yet…</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"packaging\">Packaging<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#packaging\" class=\"hash-link\" aria-label=\"Direct link to Packaging\" title=\"Direct link to Packaging\" translate=\"no\">​</a></h2>\n<p>I'll divide the packaging into the packaging of the language itself and the\nprograms written in Rust.</p>\n<p>Let's start with the <code>cargo</code> itself though. Package managers of the languages\nusually get a lot of hate (you can take <code>npm</code> or <code>pip</code> as examples<sup><a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#user-content-fn-1-e21849\" id=\"user-content-fnref-1-e21849\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">3</a></sup>). If\nyou've ever tried out Rust, I bet you already know where I'm going with this.\nYes, I mean the compilation times, or even Cargo downloading <em>whole</em> index of\ncrates just so you can update that one dependency (and 3 millions of indirect\ndeps). When I was doing AoC ‘22 in Rust, I've set up <code>sccache</code> right away on the\nfirst day.</p>\n<p>Let's move to the packaging of the Rust itself, it's tedious. Rust has a very\nfast development cycle and doesn't even try to make the builds backward\ncompatible. If there is a new release of Rust, there is a very high chance that\nyou cannot build that release with anything other than <strong>the latest</strong> Rust\nrelease. If you have ever touched the packaging, you know that this is something\nthat can cause a lot of problems, cause you need the second-to-latest version to\ncompile the latest version, don't forget that this applies inductively… People\nrunning <em>Gentoo</em> could tell you a lot about this.</p>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>info</div><div class=\"admonitionContent_BuS1\"><p>Compiling the compilers takes usually more time than compiling the kernel\nitself…</p></div></div>\n<p>I cannot speak about packaging of Rust programs in other than RHEL-based\ndistros, though I can speak about RHEL ecosystem. Fedora packaging guidelines\nspecify that you need to build each and every dependency of the program\nseparately. I wanted to try out <em>AlmaLinux</em> and install Alacritty there and I\nfailed miserably. The solution that worked, consisted of ignoring the packaging\nguidelines, running <code>cargo build</code> and consuming the binaries afterwards.\nDependencies of the Rust programs are of a similar nature as JS dependencies.</p>\n<blockquote>\n<p>I'm tipping my fedora<sup><a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#user-content-fn-2-e21849\" id=\"user-content-fnref-2-e21849-2\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">1</a></sup> in the general direction of the maintainers of Rust\npackages in RHEL ecosystem. I wouldn't be able to do this without losing my\nsanity.</p>\n</blockquote>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"likes\">Likes<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#likes\" class=\"hash-link\" aria-label=\"Direct link to Likes\" title=\"Direct link to Likes\" translate=\"no\">​</a></h2>\n<p>If you've come all the way here and you're a Rustacean, I believe I've managed\nto get your blood boiling, so it's time to finish this off by stuff I like about\nRust. I doubt I will be able to cover everything, but I can try at least. You\nhave to admit it's much easier to remember the bad stuff as opposed to the good.\n<!-- -->😉</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"workflow-and-toolchain\">Workflow and toolchain<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#workflow-and-toolchain\" class=\"hash-link\" aria-label=\"Direct link to Workflow and toolchain\" title=\"Direct link to Workflow and toolchain\" translate=\"no\">​</a></h3>\n<p>I prefered using Rust for the <em>Advent of Code</em> and <em>Codeforces</em> as it provides\na rather easy way to test the solutions before running them with the challenge\ninput (or test runner). I can give an example from the <em>Advent of Code</em>:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token namespace\">aoc_2023</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Output1</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Output2</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">struct</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">DayXX</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Solution</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output2</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">DayXX</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">AsRef</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Path</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">pathname</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> lines</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">file_to_lines</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">pathname</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">todo!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output1</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">todo!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output2</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">todo!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">DayXX</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">test_sample!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">day_XX</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">DayXX</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">42</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">69</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>This was the skeleton I've used and the macro at the end is my own creation that\nexpands to:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[cfg(test)]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mod</span><span class=\"token plain\"> </span><span class=\"token module-declaration namespace\">day_</span><span class=\"token constant\" style=\"color:hsl(35, 99%, 36%)\">XX</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">super</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[test]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> path </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">DayXX</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">get_sample</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> day </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">DayXX</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">path</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">assert_eq!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">day</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">42</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[test]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> path </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">DayXX</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">get_sample</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> day </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">DayXX</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">path</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">assert_eq!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">day</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">69</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>When you're solving the problem, all you need to do is switch between\n<code>cargo test</code> and <code>cargo run</code> to check the answer to either sample or the\nchallenge input itself.</p>\n<p>Introduce <a href=\"https://dystroy.org/bacon/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">bacon</a> and it gets even better. Bacon is a CLI tool that wraps around\nthe <code>cargo</code> and allows you to check, run, lint or run tests on each file save.\nIt's a very pleasant thing for a so-called <em>compiler-assisted</em> development.</p>\n<p>Speaking of linting from within the bacon, you cannot leave out the <a href=\"https://github.com/rust-lang/rust-clippy\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">clippy</a>.\nNot only it can whip your ass because of errors, but it can also produce a lot\nof helpful suggestions, for example passing slices by borrow instead of\nborrowing the <code>Vec</code> itself when you don't need it.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"standard-library\">Standard library<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#standard-library\" class=\"hash-link\" aria-label=\"Direct link to Standard library\" title=\"Direct link to Standard library\" translate=\"no\">​</a></h3>\n<p>There's <strong>a lot</strong> included in the standard library. It almost feels like you\nhave all you need<sup><a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#user-content-fn-4-e21849\" id=\"user-content-fnref-4-e21849\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">4</a></sup>. I like placeholders (like <code>todo!()</code>, <code>unreachable!()</code>,\n<code>unimplemented!()</code>) to the extent of\n<a class=\"\" href=\"https://blog.mfocko.dev/cpp/exceptions-and-raii/placeholders/\">implementing</a> them as exceptions in C++.</p>\n<p>You can find almost anything. Though you can also hit some very weird issues\nwith some of the nuances of the type system.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"unsafe\"><code>unsafe</code><a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#unsafe\" class=\"hash-link\" aria-label=\"Direct link to unsafe\" title=\"Direct link to unsafe\" translate=\"no\">​</a></h3>\n<p>This might be something that people like to avoid as much as possible. However I\nthink that forming a habit of commenting posibly unsafe operations in <strong>any</strong>\nlanguage is a good habit, as I've mentioned above. You should be able to argue\nwhy you can do something safely, even if the compiler is not kicking your ass\nbecause of it.</p>\n<p>Excerpt of such comment from work:</p>\n<div class=\"language-py codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-py codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"># SAFETY: Taking first package instead of specific package should be</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"># safe, since we have put a requirement on »one« ‹upstream_project_url›</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"># per Packit config, i.e. even if we're dealing with a monorepo, there</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"># is only »one« upstream. If there is one upstream, there is only one</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"># set of GPG keys that can be allowed.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">downstream_config</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">packages</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">downstream_config</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">_first_package</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">allowed_gpg_keys</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"traits\">Traits<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#traits\" class=\"hash-link\" aria-label=\"Direct link to Traits\" title=\"Direct link to Traits\" translate=\"no\">​</a></h3>\n<p>One of the other things I like are the traits. They are more restrictive than\ntemplates or concepts in C++, but they're doing their job pretty good. If you\nare building library and require multiple traits to be satisfied it means a lot\nof copy-paste, but that's soon to be fixed by the <a href=\"https://github.com/rust-lang/rfcs/blob/master/text/1733-trait-alias.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">trait aliases</a>.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Comparing to other languages</div><div class=\"admonitionContent_BuS1\"><p>On Wikipedia I've seen trait being defined as a more restrictive type class as\nyou may know it from the Haskell for example. C++ isn't behind either with its\n<em>constraints and concepts</em>. I would say that we can order them in the following\norder based on the complexity they can express:</p><div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">Rust's trait &lt; Haskell's type class &lt; C++'s concept</span><br></span></code></pre></div></div></div></div>\n<p>You can also hit some issues, like me when trying to support conversions between\nunderlying numeric types of a 2D vectors or support for using an operator from\nboth sides (I couldn't get <code>c * u</code> to work in the same way as <code>u * c</code> because\nthe first one requires you to implement the trait of a built-in type).</p>\n<div class=\"theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Implementation</div><div class=\"admonitionContent_BuS1\"><p>Implementing traits lies in</p><div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">SomeTrait</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">SomeStruct</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// implementation goes here</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div><p>One of the things I <strong>would love to</strong> see is being able to define the helper\nfunctions within the same block. As of now, the only things allowed are the ones\nthat are required by the trait, which in the end results in a randomly lying\nfunctions around (or in a implementation of the structure itself). I don't like\nthis mess at all…</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"influence-of-functional-paradigm\">Influence of functional paradigm<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#influence-of-functional-paradigm\" class=\"hash-link\" aria-label=\"Direct link to Influence of functional paradigm\" title=\"Direct link to Influence of functional paradigm\" translate=\"no\">​</a></h3>\n<p>You can see a big influence of the functional paradigm. Not only in iterators,\nbut also in the other parts of the language. For example I prefer <code>Option&lt;T&gt;</code> or\n<code>Result&lt;T, E&gt;</code> to <code>null</code>s and exceptions. Pattern matching together with\ncompiler both enforces handling of the errors and rather user-friendly way of\ndoing it.</p>\n<p>Not to mention <code>.and_then()</code> and such. However spending most of the time with\nthe AoC you get pretty annoyed of the repetitive <code>.unwrap()</code> during parsing,\nsince you are guaranteed correct input.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"macros\">Macros<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#macros\" class=\"hash-link\" aria-label=\"Direct link to Macros\" title=\"Direct link to Macros\" translate=\"no\">​</a></h3>\n<p>Macros are a very strong pro of Rust. And no, we're not going to talk about the\nprocedural macros…</p>\n<p>As I've shown above I've managed to “tame” a lot of copy-paste in the tests for\nthe AoC by utilizing a macro that generated a very basic template for the tests.</p>\n<p>As I have mentioned the traits above, I cannot forget to give props to <code>derive</code>\nmacro that allows you to “deduce” the default implementation. It is very helpful\nfor a tedious tasks like implementing <code>Debug</code> (for printing out the structures)\nor comparisons, though with the comparisons you need to be careful about the\ndefault implementation, it has already bitten me once or twice.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"summary\">Summary<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#summary\" class=\"hash-link\" aria-label=\"Direct link to Summary\" title=\"Direct link to Summary\" translate=\"no\">​</a></h2>\n<p>Overall there are many things about the Rust I like and would love to see them\nimplemented in other languages. However there are also many things I don't like.\nNothing is <strong>exclusively</strong> black and white.</p>\n<!-- -->\n<section data-footnotes=\"true\" class=\"footnotes\"><h2 class=\"anchor anchorTargetStickyNavbar_Vzrq sr-only\" id=\"footnote-label\">Footnotes<a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#footnote-label\" class=\"hash-link\" aria-label=\"Direct link to Footnotes\" title=\"Direct link to Footnotes\" translate=\"no\">​</a></h2>\n<ol>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-2-e21849\">\n<p>pun intended <a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#user-content-fnref-2-e21849\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩</a> <a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#user-content-fnref-2-e21849-2\" data-footnote-backref=\"\" aria-label=\"Back to reference 1-2\" class=\"data-footnote-backref\">↩<sup>2</sup></a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-3-e21849\">\n<p>It's not that easy with the Rust compiler, but OK… <a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#user-content-fnref-3-e21849\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-1-e21849\">\n<p>not to even mention multiple different packaging standards Python has, which\nis borderline <a href=\"https://xkcd.com/927/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://xkcd.com/927/</a> <a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#user-content-fnref-1-e21849\" data-footnote-backref=\"\" aria-label=\"Back to reference 3\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-4-e21849\">\n<p>unlike Python where there's whole universe in the language itself, yet there\nare essential things not present… <a href=\"https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/#user-content-fnref-4-e21849\" data-footnote-backref=\"\" aria-label=\"Back to reference 4\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n</ol>\n</section>",
            "url": "https://blog.mfocko.dev/blog/2024/01/28/rust-opinion/",
            "title": "Mixed feelings on Rust",
            "summary": "Discussing my mixed feelings about the Rust language.\n",
            "date_modified": "2024-01-28T00:00:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "rust",
                "memory safety",
                "cult",
                "hype"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/2023/08/02/copr/",
            "content_html": "<p>When you decide to run Fedora on your VPS, you might get screwed over by using\nrandom repositories…</p>\n<p>When I “reserved” my VPS<sup><a href=\"https://blog.mfocko.dev/blog/2023/08/02/copr/#user-content-fn-1-d4045e\" id=\"user-content-fnref-1-d4045e\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">1</a></sup> back in June '20, I slapped Fedora on it without\nthinking. I bet 99% of people would say that I'm crazy for doing such thing<sup><a href=\"https://blog.mfocko.dev/blog/2023/08/02/copr/#user-content-fn-2-d4045e\" id=\"user-content-fnref-2-d4045e\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">2</a></sup>,\n<strong>BUT</strong> I've been using Fedora on my PCs for some time already and it felt very\nstable and natural to just use, even for VPS.</p>\n<p>One of the first things I've done was setting up a mail server. You may guess\nwhat's the fun part about having a mail server… Yes, it's all the spam you\nreceive and only then you realize how much “crap” gets filtered on free mail\nservices. To battle this problem I chose to use\n<a href=\"https://github.com/rspamd/rspamd\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">rspamd</a> that had CentOS support, but someone\nhad a <a href=\"https://copr.fedorainfracloud.org/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Copr</a> repository that I used to\ninstall it.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"how-does-copr-repositories-work\">How does Copr repositories work?<a href=\"https://blog.mfocko.dev/blog/2023/08/02/copr/#how-does-copr-repositories-work\" class=\"hash-link\" aria-label=\"Direct link to How does Copr repositories work?\" title=\"Direct link to How does Copr repositories work?\" translate=\"no\">​</a></h2>\n<p>If you have ever used Ubuntu, you might be familiar with the concept since it is\nvery close to <a href=\"https://help.ubuntu.com/community/PPA\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">PPAs</a>.</p>\n<p>tl;dr of the whole process consists of</p>\n<ol>\n<li class=\"\">enabling the Copr repository, and</li>\n<li class=\"\">installing the desired package.</li>\n</ol>\n<p>So in shell you would do</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"># dnf copr enable ‹copr-repository›</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"># dnf install ‹package-from-the-repository›</span><br></span></code></pre></div></div>\n<p>And… that's it! Nothing else needed! Simple, right? And literally same process\nas you would do for the PPA.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>AUR</div><div class=\"admonitionContent_BuS1\"><p>On the other hand, if you are familiar with the archLinux, you definitely know\nAUR and what it can do for you. Copr repository is pretty similar, but the\npackages are prebuilt in Copr and Copr repositories can carry the required\ndependencies for said packages, which simplifies the distribution, and can even\nhelp with installing singular packages (when you just need the dependency, not\neverything).</p></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"my-issue\">My issue<a href=\"https://blog.mfocko.dev/blog/2023/08/02/copr/#my-issue\" class=\"hash-link\" aria-label=\"Direct link to My issue\" title=\"Direct link to My issue\" translate=\"no\">​</a></h2>\n<p>Now you might wonder how would I use it on my VPS. It's rather simple, once in\n6 months a new Fedora release comes out. And you need to upgrade to newer\nrelease… You don't need to do it right away and for such setup it probably isn't\neven recommended.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Fedora releases are supported for a year, i.e. they live 6 months till the next\nrelease and then another 6 months till another release.</p><p>Some people prefer to run one version “behind”. If you ever decide to run it on\nyour home server or in a similar setup, it might be a pretty good idea to\nfollow. I'm using the “latest greatest”, cause why not <!-- -->😄</p><p>One way or another, you still need to bump the release every six months, unless\nyou'd bump 2 releases at once every year, which would be a decision, since, at\nleast I, cannot see any benefits in it… You don't go for “stability”, cause once\na year you switch to the latest release and then, before you bump, you use one\nyear old software, so you're not even using the latest.</p></div></div>\n<p>Fast-forward 2 years in the future, new Fedora release came out (October '22)\nand I was doing an upgrade. Dependencies of the rspamd have been updated and\nrspamd builds in Copr have failed and no one fixed it. Cool, so now I can\nupgrade, but can either ignore the dependencies or uninstall the rspamd…</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"how-can-copr-help\">How can Copr help?<a href=\"https://blog.mfocko.dev/blog/2023/08/02/copr/#how-can-copr-help\" class=\"hash-link\" aria-label=\"Direct link to How can Copr help?\" title=\"Direct link to How can Copr help?\" translate=\"no\">​</a></h2>\n<p>I have managed to find\n<a href=\"https://github.com/rspamd/rspamd/blob/master/rpm/rspamd.spec\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">specfile</a> for the\nrspamd package that they use for CentOS. There were some files apart from the\nspecfile, so I had to make an SRPM locally and then… I just uploaded the SRPM\nto the Copr to\n<a href=\"https://copr.fedorainfracloud.org/coprs/mfocko/rspamd/build/5046567/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">build</a>\nan RPM.</p>\n<p>I have switched the previous Copr repository for rspamd with my own and happily\nproceeded with the upgrade.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"conclusion\">Conclusion<a href=\"https://blog.mfocko.dev/blog/2023/08/02/copr/#conclusion\" class=\"hash-link\" aria-label=\"Direct link to Conclusion\" title=\"Direct link to Conclusion\" translate=\"no\">​</a></h2>\n<p>Copr is heavily used for testing builds on the upstream with\n<a href=\"https://packit.dev/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Packit</a>. However, as you can see, it is possible to use it\n<strong>very well</strong> for packaging your own stuff and avoiding issues (such as the one\nI have described above), if need be.</p>\n<!-- -->\n<section data-footnotes=\"true\" class=\"footnotes\"><h2 class=\"anchor anchorTargetStickyNavbar_Vzrq sr-only\" id=\"footnote-label\">Footnotes<a href=\"https://blog.mfocko.dev/blog/2023/08/02/copr/#footnote-label\" class=\"hash-link\" aria-label=\"Direct link to Footnotes\" title=\"Direct link to Footnotes\" translate=\"no\">​</a></h2>\n<ol>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-1-d4045e\">\n<p><a href=\"https://vpsfree.cz/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">vpsFree.cz</a> <a href=\"https://blog.mfocko.dev/blog/2023/08/02/copr/#user-content-fnref-1-d4045e\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-2-d4045e\">\n<p>Even though I've been running archLinux on some Raspberry Pi's and also\non one of my “home servers”, before getting the VPS. You could say I like\nto live on the edge… <a href=\"https://blog.mfocko.dev/blog/2023/08/02/copr/#user-content-fnref-2-d4045e\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n</ol>\n</section>",
            "url": "https://blog.mfocko.dev/blog/2023/08/02/copr/",
            "title": "How can Copr help with broken dependencies",
            "summary": "Copr comes to save you when maintainer doesn't care.",
            "date_modified": "2023-08-02T00:00:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "🏭",
                "red-hat",
                "copr",
                "admin",
                "vps"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/aoc-2022/4th-week/",
            "content_html": "<p>Let's go through the fourth week of <a href=\"https://adventofcode.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><em>Advent of Code</em></a> in Rust.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-22-monkey-map\"><a href=\"https://adventofcode.com/2022/day/22\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 22: Monkey Map</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#day-22-monkey-map\" class=\"hash-link\" aria-label=\"Direct link to day-22-monkey-map\" title=\"Direct link to day-22-monkey-map\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Simulating a movement on a 2D map with given instructions. Map becomes a cube in\nthe 2nd part…</p></div></div>\n<div class=\"theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>Rant</div><div class=\"admonitionContent_BuS1\"><p>This was the most obnoxious problem of this year… and a lot of Rust issues have\nbeen hit.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#solution\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>It seems like a very simple problem to solve, but with very obnoxious changes in\nthe 2nd part and also it's relatively hard to decompose »properly«.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"column-iterator\">Column iterator<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#column-iterator\" class=\"hash-link\" aria-label=\"Direct link to Column iterator\" title=\"Direct link to Column iterator\" translate=\"no\">​</a></h4>\n<p>In the first part of the problem it was needed to know the boundaries of each\nrow and column, since I stored them in <code>Vec&lt;Vec&lt;char&gt;&gt;</code> and padded with spaces\nto ensure I have a rectangular 2D “array”. However when you wanted to go through\neach row and column to determine the boundaries, it was very easy to do for the\nrows (cause each row is a <code>Vec</code> element), but not for the columns, since they\nspan multiple rows.</p>\n<p>For this use case I have implemented my own <em>column iterator</em>:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">struct</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">ColumnIterator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    column</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">ColumnIterator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> column</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">ColumnIterator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> column</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Iterator</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">ColumnIterator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Item</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">next</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Option</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Item</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">len</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">None</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Some</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">column</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>Given this piece of an iterator, it is very easy to factor out the common\nfunctionality between the rows and columns into:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> find_boundaries </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params\">constructor</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token closure-params\"> </span><span class=\"token closure-params keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token closure-params\"> </span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token closure-params\"> </span><span class=\"token closure-params class-name\" style=\"color:hsl(35, 99%, 36%)\">Orientation</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token closure-params\">                           iterator</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token closure-params\"> </span><span class=\"token closure-params operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token closure-params keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token closure-params\"> </span><span class=\"token closure-params keyword\" style=\"color:hsl(301, 63%, 40%)\">dyn</span><span class=\"token closure-params\"> </span><span class=\"token closure-params class-name\" style=\"color:hsl(35, 99%, 36%)\">Iterator</span><span class=\"token closure-params operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token closure-params class-name\" style=\"color:hsl(35, 99%, 36%)\">Item</span><span class=\"token closure-params\"> </span><span class=\"token closure-params operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token closure-params\"> </span><span class=\"token closure-params operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token closure-params keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token closure-params operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token closure-params\">                           upper_bound</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token closure-params\">                           i</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> first_non_empty </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> iterator</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">enumerate</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">skip_while</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params\">_</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> </span><span class=\"token closure-params operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token closure-params\">c</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> c </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">' '</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> start </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> first_non_empty</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">next</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> last_non_empty </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> first_non_empty</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">skip_while</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params\">_</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> </span><span class=\"token closure-params operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token closure-params\">c</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> c </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!=</span><span class=\"token plain\"> </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">' '</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> end </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> last_non_empty</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">next</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap_or</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">upper_bound</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'_'</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    boundaries</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">insert</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">constructor</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> start</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">..</span><span class=\"token plain\">end</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>And then use it as such:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// construct all horizontal boundaries</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">..</span><span class=\"token plain\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">len</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">for_each</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params\">row</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">find_boundaries</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Orientation</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">horizontal</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">row</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">row</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">len</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        row</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// construct all vertical boundaries</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">..</span><span class=\"token plain\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">len</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">for_each</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params\">col</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">find_boundaries</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Orientation</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vertical</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">ColumnIterator</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> col</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">len</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        col</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"walking-around-the-map\">Walking around the map<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#walking-around-the-map\" class=\"hash-link\" aria-label=\"Direct link to Walking around the map\" title=\"Direct link to Walking around the map\" translate=\"no\">​</a></h4>\n<p>Once the 2nd part got introduced, you start to think about a way how not to\ncopy-paste a lot of stuff (I haven't avoided it anyways…). In this problem, I've\nchosen to introduce a trait (i.e. <em>interface</em>) for 2D and 3D walker.</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">trait</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Wrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Clone</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">State</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// simulation</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">is_blocked</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">bool</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">step</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> steps</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">turn_left</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">turn_right</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// movement</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">next</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">State</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Direction</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// final answer</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">answer</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>Each walker maintains its own state and also provides the functions that are\nused during the simulation. The “promised” methods are separated into:</p>\n<ul>\n<li class=\"\"><em>simulation</em>-related: that are used during the simulation from the <code>.fold()</code></li>\n<li class=\"\"><em>movement</em>-related: just a one method that holds most of the logic differences\nbetween 2D and 3D</li>\n<li class=\"\"><em>final answer</em>: which extracts the <em>proof of solution</em> from the\nimplementation-specific walker</li>\n</ul>\n<p>Both 2D and 3D versions borrow the original input and therefore you must\nannotate the lifetime of it:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">struct</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Wrap2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    position</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Position</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    direction</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Direction</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Wrap2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Wrap2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// …</span><br></span></code></pre></div></div>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"problems\">Problems<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#problems\" class=\"hash-link\" aria-label=\"Direct link to Problems\" title=\"Direct link to Problems\" translate=\"no\">​</a></h4>\n<p>I have used a lot of closures for this problem and once I introduced a parameter\nthat was of unknown type (apart from the fact it implements a specific trait), I\ngot suggested a “fix” for the compilation error that resulted in something that\nwas not possible to parse, cause it, more than likely, violated the grammar.</p>\n<p>In a similar fashion, I have been suggested changes that led to a code that\ndidn't make sense by just looking at it (there was no need to try the changes),\nfor example one suggested change in the closure parameter caused disapperance of\nthe parameter name. <!-- -->😄</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"clippy\">Clippy<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#clippy\" class=\"hash-link\" aria-label=\"Direct link to Clippy\" title=\"Direct link to Clippy\" translate=\"no\">​</a></h4>\n<p>I have to admit that Clippy was rather helpful here, I'll include two examples\nof rather smart suggestions.</p>\n<p>When writing the parsing for this problem, the first thing I have spotted on the\n<code>char</code> was the <code>.is_digit()</code> function that takes a radix as a parameter. Clippy\nnoticed that I use <code>radix = 10</code> and suggested switching to <code>.is_ascii_digit()</code>\nthat does exactly the same thing:</p>\n<div class=\"language-diff codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">                .take_while(|c| c.is_digit(10))</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">                .take_while(|c| c.is_ascii_digit())</span><br></span></code></pre></div></div>\n<p>Another useful suggestion appeared when working with the iterators and I wanted\nto get the <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>n</mi></mrow><annotation encoding=\"application/x-tex\">n</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.4306em\"></span><span class=\"mord mathnormal\">n</span></span></span></span>-th element from it. You know the <code>.skip()</code>, you know the\n<code>.next()</code>, just “slap” them together and we're done for <!-- -->😁<!-- --> Well, I got\nsuggested to use <code>.nth()</code> that does exactly the combination of the two mentioned\nmethods on iterators:</p>\n<div class=\"language-diff codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">            match it.clone().skip(skip).next().unwrap() {</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">            match it.clone().nth(skip).unwrap() {</span><br></span></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-23-unstable-diffusion\"><a href=\"https://adventofcode.com/2022/day/23\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 23: Unstable Diffusion</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#day-23-unstable-diffusion\" class=\"hash-link\" aria-label=\"Direct link to day-23-unstable-diffusion\" title=\"Direct link to day-23-unstable-diffusion\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Simulating movement of elves around with a set of specific rules.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-1\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#solution-1\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>There's not much to mention since it's just a cellular automaton simulation\n(even though the AoC rules for cellular automatons usually get out of hand\n<!-- -->😉<!-- -->).</p>\n<p>Although I had a need to determine boundaries of the elves' positions and ended\nup with a nasty DRY violation. Knowing that you you're looking for maximum and\nminimum that are, of course, exactly the same except for initial values and\ncomparators, it looks like a rather simple fix, but typing in Rust is something\nelse, right? In the end I settled for a function that computes both boundaries\nwithout any duplication while using a closure:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">get_bounds</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">positions</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> f </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params\">init</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> cmp</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token closure-params\"> </span><span class=\"token closure-params operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token closure-params keyword\" style=\"color:hsl(301, 63%, 40%)\">dyn</span><span class=\"token closure-params\"> </span><span class=\"token closure-params class-name\" style=\"color:hsl(35, 99%, 36%)\">Fn</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> </span><span class=\"token closure-params keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token closure-params\"> </span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token closure-params\"> </span><span class=\"token closure-params keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        positions</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">fold</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">init</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> init</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params\">acc</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> elf</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">cmp</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">acc</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> elf</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">cmp</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">acc</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> elf</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">f</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token constant\" style=\"color:hsl(35, 99%, 36%)\">MAX</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">min</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">f</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token constant\" style=\"color:hsl(35, 99%, 36%)\">MIN</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">max</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>This function returns a pair of 2D vectors that represent opposite points of the\nbounding rectangle of all elves.</p>\n<p>You might ask why would we need a closure and the answer is that <code>positions</code>\ncannot be captured from within the nested function, only via closure. One more\nfun fact on top of that is the type of the comparator</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">dyn</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Fn</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><br></span></code></pre></div></div>\n<p>Once we remove the <code>dyn</code> keyword, compiler yells at us and also includes a way\nhow to get a more thorough explanation of the error by running</p>\n<div class=\"language-shell codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-shell codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">$ rustc </span><span class=\"token parameter variable\" style=\"color:hsl(221, 87%, 60%)\">--explain</span><span class=\"token plain\"> E0782</span><br></span></code></pre></div></div>\n<p>which shows us</p>\n<blockquote>\n<p>Trait objects must include the <code>dyn</code> keyword.</p>\n<p>Erroneous code example:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">trait Foo {}</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">fn test(arg: Box&lt;Foo&gt;) {} // error!</span><br></span></code></pre></div></div>\n<p>Trait objects are a way to call methods on types that are not known until\nruntime but conform to some trait.</p>\n<p>Trait objects should be formed with <code>Box&lt;dyn Foo&gt;</code>, but in the code above\n<code>dyn</code> is left off.</p>\n<p>This makes it harder to see that <code>arg</code> is a trait object and not a\nsimply a heap allocated type called <code>Foo</code>.</p>\n<p>To fix this issue, add <code>dyn</code> before the trait name.</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">trait Foo {}</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">fn test(arg: Box&lt;dyn Foo&gt;) {} // ok!</span><br></span></code></pre></div></div>\n<p>This used to be allowed before edition 2021, but is now an error.</p>\n</blockquote>\n<div class=\"theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z\"></path></svg></span>Rant</div><div class=\"admonitionContent_BuS1\"><p>Not all of the explanations are helpful though, in some cases they might be even\nmore confusing than helpful, since they address <em>very simple</em> use cases.</p><p>As you can see, even in this case there are two sides to the explanations:</p><ul>\n<li class=\"\">it explains why you need to use <code>dyn</code>, but</li>\n<li class=\"\">it still mentions that trait objects need to be heap-allocated via <code>Box&lt;T&gt;</code>\nthat, as you can see in my snippet, <strong>does not</strong> apply here <!-- -->😄<!-- --> IMO it's\ncaused by the fact that we are borrowing it and therefore we don't need to\ncare about the size or whereabouts of it.</li>\n</ul></div></div>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>C++ parallel</div><div class=\"admonitionContent_BuS1\"><p>If you dive into the explanation above, you can notice that the <code>Box&lt;dyn Trait&gt;</code>\npattern is very helpful for using types that are not known during compile-time.\nYou would use a very similar approach in C++ when parsing some data structure\nfrom input (let's say JSON for example).</p><p>On the other hand, in this case, it doesn't really make much sense, cause you\ncan clearly see that the types <strong>are known</strong> during the compile-time, which in\nC++ could be easily resolved by templating the helper function.</p></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-24-blizzard-basin\"><a href=\"https://adventofcode.com/2022/day/24\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 24: Blizzard Basin</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#day-24-blizzard-basin\" class=\"hash-link\" aria-label=\"Direct link to day-24-blizzard-basin\" title=\"Direct link to day-24-blizzard-basin\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Navigating your way through a basin with series of blizzards that move around\nyou as you move.</p></div></div>\n<div class=\"theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>It's second to last day and I went “<em>bonkers</em>” on the Rust <!-- -->😄<!-- --> Proceed to\nread <em>Solution</em> part on your own risk.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-2\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#solution-2\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>You are given a map with blizzards all over the place and you're supposed to\nfind the minimum time it requires you to walk through the basin without getting\nin any of the blizzards.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"breakdown\">Breakdown<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#breakdown\" class=\"hash-link\" aria-label=\"Direct link to Breakdown\" title=\"Direct link to Breakdown\" translate=\"no\">​</a></h4>\n<p>Relatively simple, yet a bit annoying, approach can be taken. It's technically\na shortest-path algorithm implementation with some relaxation restrictions and\nbeing able to stay on one position for some time, so each <em>vertex</em> of the graph\nis determined by the position on the map and the <em>timestamp</em>. I have chosen to\nuse <code>Vector3D&lt;usize&gt;</code>, since <code>x</code> and <code>y</code> attributes can be used for the position\nand, well, let's use <code>z</code> for a timestamp, cause why not, right? <!-- -->😉</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"evaluating-the-blizzards\">Evaluating the blizzards<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#evaluating-the-blizzards\" class=\"hash-link\" aria-label=\"Direct link to Evaluating the blizzards\" title=\"Direct link to Evaluating the blizzards\" translate=\"no\">​</a></h4>\n<div class=\"theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>I think that this is the most perverted abuse of the traits in the whole 4 weeks\nof AoC in Rust…</p></div></div>\n<p>The blizzards move along their respective directions in time and loop around in\ntheir respective row/column. Each vertex holds position <strong>and</strong> time, so we can\n<em>just</em> index the basin with the vertex itself, right? Yes, we can <!-- -->😈</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>Fun fact</div><div class=\"admonitionContent_BuS1\"><p>While writing this part, I've recognized unnecessary verbosity in the code and\ncleaned it up a bit. The changed version is shown here and the original was just\nmore verbose.</p></div></div>\n<p>I'll skip the boring parts of checking bounds and entry/exit of the basin <!-- -->😉<!-- -->\nWe can easily calculate positions of the blizzards using a modular arithmetics:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Index</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Position</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Basin</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Position</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// ‹skipped boring parts›</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// We need to account for the loops of the blizzards</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> width </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">cols </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> height </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">rows </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> blizzard_origin </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params\">size</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> d</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> t</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> i</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> size </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> d </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">t </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">%</span><span class=\"token plain\"> size</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">%</span><span class=\"token plain\"> size </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">blizzard_origin</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">width</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">z</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'&gt;'</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">blizzard_origin</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">width</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">z</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'&lt;'</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">blizzard_origin</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">height</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">z</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'v'</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">blizzard_origin</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">height</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">z</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'^'</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">find_map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params\">y</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> x</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> direction</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> direction </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Some</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">None</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap_or</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'.'</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>As you can see, there is an expression for calculating the original position and\nit's used multiple times, so why not take it out to a lambda, right? <!-- -->😉</p>\n<p>I couldn't get the <code>rustfmt</code> to format the <code>for</code>-loop nicely, so I've just\ndecided to go with iterating over an elements of a slice. I have used, once\nagain, a combination of two functions (<code>find_map</code> in this case) to do 2 things\nat once and at the end, if we haven't found any blizzard, we just return the\nempty space.</p>\n<p>I think it's a very <em>nice</em> (and naughty) way how to use the <code>Index</code> trait, don't\nyou think?</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"shortest-path-algorithm\">Shortest-path algorithm<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#shortest-path-algorithm\" class=\"hash-link\" aria-label=\"Direct link to Shortest-path algorithm\" title=\"Direct link to Shortest-path algorithm\" translate=\"no\">​</a></h4>\n<p>For the shortest path you can choose and adjust any of the common shortest-path\nalgorithms, in my case, I have decided to use <a href=\"https://en.wikipedia.org/wiki/A*_search_algorithm\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><em>A*</em></a> instead of Dijkstra's\nalgorithm, since it better reflects the <em>cost</em> function.</p>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 14 16\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg></span>Comparison of costs</div><div class=\"admonitionContent_BuS1\"><p>With the Dijkstra's algorithm I would proceed with the <code>time</code> attribute used as\na priority for the queue.</p><p>Whereas with the <em>A*</em>, I have chosen to use both time and Manhattan distance\nthat promotes vertices closer to the exit <strong>and</strong> with a minimum time taken.</p></div></div>\n<p>Cost function is, of course, a closure <!-- -->😉</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> cost </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params\">p</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token closure-params\"> </span><span class=\"token closure-params class-name\" style=\"color:hsl(35, 99%, 36%)\">Position</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">z</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> exit</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">abs_diff</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">p</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> exit</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">abs_diff</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">p</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>And also for checking the possible moves from the current vertex, I have\nimplemented, yet another, closure that yields an iterator with the next moves:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> next_positions </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params\">p</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">filter_map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">move</span><span class=\"token plain\"> </span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params\">x</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> y</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> t</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> next_p </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> p </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector3D</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> t</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> basin</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">next_p</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> </span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'.'</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Some</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">next_p</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">None</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"min-heap\">Min-heap<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#min-heap\" class=\"hash-link\" aria-label=\"Direct link to Min-heap\" title=\"Direct link to Min-heap\" translate=\"no\">​</a></h4>\n<p>In this case I had a need to use the priority queue taking the elements with the\nlowest cost as the prioritized ones. Rust only offers you the <a href=\"https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>BinaryHeap</code></a> and\nthat is a max-heap. One of the ways how to achieve a min-heap is to put the\nelements in wrapped in a <a href=\"https://doc.rust-lang.org/std/cmp/struct.Reverse.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>Reverse</code></a> (as is even showed in the linked <a href=\"https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html#min-heap\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">docs of\nthe <code>BinaryHeap</code></a>). However the wrapping affects the type of the heap and also\npopping the most prioritized elements yields values wrapped in the <code>Reverse</code>.</p>\n<p>For this purpose I have just taken the max-heap and wrapped it as a whole in a\nseparate structure providing just the desired methods:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token namespace\">std</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token namespace\">cmp</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Ord</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Reverse</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token namespace\">std</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token namespace\">collections</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BinaryHeap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">struct</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">MinHeap</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    heap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BinaryHeap</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Reverse</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Ord</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">MinHeap</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">MinHeap</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">MinHeap</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            heap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BinaryHeap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">push</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> item</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">heap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">push</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Reverse</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">item</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">pop</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Option</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">heap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">pop</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params class-name\" style=\"color:hsl(35, 99%, 36%)\">Reverse</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params\">x</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Ord</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Default</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">MinHeap</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">default</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>Rest is just the algorithm implementation which is not that interesting.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-25-full-of-hot-air\"><a href=\"https://adventofcode.com/2022/day/25\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 25: Full of Hot Air</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#day-25-full-of-hot-air\" class=\"hash-link\" aria-label=\"Direct link to day-25-full-of-hot-air\" title=\"Direct link to day-25-full-of-hot-air\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Playing around with a numbers in a <em>special</em> base.</p></div></div>\n<p>Getting flashbacks to the <em>IB111 Foundations of Programming</em>… Very nice “problem”\nwith a rather easy solution, as the last day always seems to be.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-3\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#solution-3\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>Implementing 2 functions, converting from the <em>SNAFU base</em> and back to the <em>SNAFU</em>\n<em>base</em> representation. Let's do a bit more though! I have implemented two functions:</p>\n<ul>\n<li class=\"\"><code>from_snafu</code></li>\n<li class=\"\"><code>to_snafu</code></li>\n</ul>\n<p>Now it is apparent that all I do is number to string and string to number. Hmm…\nthat sounds familiar, doesn't it? Let's introduce a structure for the SNAFU numbers\nand implement the traits that we need.</p>\n<p>Let's start with a structure:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">struct</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">SNAFU</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    value</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i64</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"converting-from-str\">Converting from <code>&amp;str</code><a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#converting-from-str\" class=\"hash-link\" aria-label=\"Direct link to converting-from-str\" title=\"Direct link to converting-from-str\" translate=\"no\">​</a></h4>\n<p>We will start by implementing the <code>FromStr</code> trait that will help us parse our input.\nThis is rather simple, I can just take the <code>from_snafu</code> function, copy-paste it\ninto the <code>from_str</code> method and the number I get will be wrapped in <code>Result</code> and\n<code>SNAFU</code> structure.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"converting-to-string\">Converting to <code>String</code><a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#converting-to-string\" class=\"hash-link\" aria-label=\"Direct link to converting-to-string\" title=\"Direct link to converting-to-string\" translate=\"no\">​</a></h4>\n<p>This is more fun. In some cases you need to implement only one trait and others\nare automatically implemented using that one trait. In our case, if you look in\nthe documentation, you can see that <code>ToString</code> trait is automatically implemented\nfor any type that implements <code>Display</code> trait.</p>\n<p>Let's implement the <code>Display</code> trait then. We should be able to use the <code>to_snafu</code>\nfunction and just take the <code>self.value</code> from the <code>SNAFU</code> structure.</p>\n<p>And for the convenience of tests, we can also implement a rather simple <code>From&lt;i64&gt;</code>\ntrait for the <code>SNAFU</code>.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"adjusting-the-code\">Adjusting the code<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#adjusting-the-code\" class=\"hash-link\" aria-label=\"Direct link to Adjusting the code\" title=\"Direct link to Adjusting the code\" translate=\"no\">​</a></h4>\n<p>After those changes we need to adjust the code and tests.</p>\n<p>Parsing of the input is very easy, before we have used the lines, now we parse\neverything:</p>\n<div class=\"language-diff codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    fn parse_input&lt;P: AsRef&lt;Path&gt;&gt;(pathname: P) -&gt; Input {</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">        file_to_lines(pathname)</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">        file_to_structs(pathname)</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    }</span><br></span></code></pre></div></div>\n<p>Part 1 needs to be adjusted a bit too:</p>\n<div class=\"language-diff codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    fn part_1(input: &amp;Input) -&gt; Output {</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">        to_snafu(input.iter().map(|s| from_snafu(s)).sum())</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">        SNAFU::from(input.iter().map(|s| s.value).sum::&lt;i64&gt;()).to_string()</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    }</span><br></span></code></pre></div></div>\n<p>You can also see that it simplifies the meaning a bit and it is more explicit than\nthe previous versions.</p>\n<p>And for the tests:</p>\n<div class=\"language-diff codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    #[test]</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    fn test_from() {</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">        for (n, s) in EXAMPLES.iter() {</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">            assert_eq!(from_snafu(s), *n);</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">        for (&amp;n, s) in EXAMPLES.iter() {</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">            assert_eq!(s.parse::&lt;SNAFU&gt;().unwrap().value, n);</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">        }</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    }</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token unchanged line\"></span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    #[test]</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token unchanged line\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    fn test_to() {</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token unchanged line\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">        for (n, s) in EXAMPLES.iter() {</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">            assert_eq!(to_snafu(*n), s.to_string());</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">        for (&amp;n, s) in EXAMPLES.iter() {</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">            assert_eq!(SNAFU::from(n).to_string(), s.to_string());</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">        }</span><br></span></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"summary\">Summary<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#summary\" class=\"hash-link\" aria-label=\"Direct link to Summary\" title=\"Direct link to Summary\" translate=\"no\">​</a></h2>\n<p>Let's wrap the whole thing up! Keeping in mind both AoC and the Rust…</p>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Finished advent calendar :smile:\" src=\"https://blog.mfocko.dev/assets/images/calendar-f891b624f3e0efb34bba582100a7d8df.png\" width=\"2417\" height=\"1984\" class=\"img_ev3q\"></p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"advent-of-code\">Advent of Code<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#advent-of-code\" class=\"hash-link\" aria-label=\"Direct link to Advent of Code\" title=\"Direct link to Advent of Code\" translate=\"no\">​</a></h3>\n<p>This year was quite fun, even though most of the solutions and posts came in\nlater on (<em>cough</em> in '23 <em>cough</em>). Day 22 was the most obnoxious one… And also\nit feels like I used priority queues and tree data structures <strong>a lot</strong> <!-- -->👀</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"with-rust\">with Rust<a href=\"https://blog.mfocko.dev/blog/aoc-2022/4th-week/#with-rust\" class=\"hash-link\" aria-label=\"Direct link to with Rust\" title=\"Direct link to with Rust\" translate=\"no\">​</a></h3>\n<p>I must admit that a lot of compiler warnings and errors were very useful. Even\nthough I still found some instances where they didn't help at all or cause even\nworse issues than I had. Compilation times have been addressed with the caching.</p>\n<p>Building my first tree data structure in Rust has been a very “interesting”\njourney. Being able to write a more generic BFS algorithm that allows you to not\nduplicate code while still mantaining the desired functionality contributes to\na very readable code.</p>\n<p>I am definitely much more aware of the basic things that bloated Python is\nmissing, yet Rust has them…</p>\n<p>Using explicit types and writing down placeholder functions with <code>todo!()</code>\nmacros is very pleasant, since it allows you to easily navigate the type system\nduring the development when you don't even need to be sure how are you going to\nput the smaller pieces together.</p>\n<p>I have used a plethora of traits and also implemented some of them to either be\nidiomatic, or exploit the syntactic sugar they offer. Deriving the default trait\nimplementation is also very helpful in a lot of cases, e.g. debugging output,\ncopying, equality comparison, etc.</p>\n<p>I confess to touching more “cursed” parts of the Rust, such as macros to\ndeclutter the copy-paste for tests or writing my own structures that need to\ncarry a lifetime for their own fields.</p>\n<p>tl;dr Relatively pleasant language until you hit brick wall <!-- -->😉</p>\n<hr>\n<p>See you next year! Maybe in Rust, maybe not <!-- -->🙃</p>",
            "url": "https://blog.mfocko.dev/blog/aoc-2022/4th-week/",
            "title": "4th week of Advent of Code '22 in Rust",
            "summary": "Surviving fourth week in Rust.",
            "date_modified": "2023-07-07T15:14:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "advent-of-code",
                "advent-of-code-2022",
                "rust"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/aoc-2022/3rd-week/",
            "content_html": "<p>Let's go through the third week of <a href=\"https://adventofcode.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><em>Advent of Code</em></a> in Rust.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-15-beacon-exclusion-zone\"><a href=\"https://adventofcode.com/2022/day/15\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 15: Beacon Exclusion Zone</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#day-15-beacon-exclusion-zone\" class=\"hash-link\" aria-label=\"Direct link to day-15-beacon-exclusion-zone\" title=\"Direct link to day-15-beacon-exclusion-zone\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Triangulating a distress beacon based on the information from the sensors.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#solution\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>Relatively easy thing to implement, no major Rust issues hit.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-16-proboscidea-volcanium\"><a href=\"https://adventofcode.com/2022/day/16\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 16: Proboscidea Volcanium</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#day-16-proboscidea-volcanium\" class=\"hash-link\" aria-label=\"Direct link to day-16-proboscidea-volcanium\" title=\"Direct link to day-16-proboscidea-volcanium\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Finding a max flow in a graph given some time constraints.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-1\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#solution-1\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>I have used some interesting things to implement this and make it easier for me.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"indexing-in-graph\">Indexing in graph<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#indexing-in-graph\" class=\"hash-link\" aria-label=\"Direct link to Indexing in graph\" title=\"Direct link to Indexing in graph\" translate=\"no\">​</a></h4>\n<p>I have come across a situation where I needed to keep more information regarding\nthe graph… In that case you can, of course, create a structure and keep it in,\nbut once you have multiple members in the structure it gets harder to work with\nsince you need to address the fields in the structure. When you work with graph,\nyou frequently need to access the vertices and in this case it felt a lot easier\nto implement the indexing in a graph, rather than explicitly access the\nunderlying data structure.</p>\n<p>Here you can see a rather short snippet from the solution that allows you to\n“index” the graph:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Index</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">str</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Graph</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vertex</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">str</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">g</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"cartesian-product\">Cartesian product<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#cartesian-product\" class=\"hash-link\" aria-label=\"Direct link to Cartesian product\" title=\"Direct link to Cartesian product\" translate=\"no\">​</a></h4>\n<p>During the implementation I had to utilize Floyd-Warshall algorithm for finding\nthe shortest path between pairs of vertices and utilized the <code>iproduct!</code> macro\nfrom the <a href=\"https://crates.io/crates/itertools\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>itertools</code></a>. It is a very useful higher-order function that allows\nyou to keep the nesting of the loops at a minimum level while still maintaining\nthe same functionality.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"implementing-an-iterator\">“Implementing” an iterator<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#implementing-an-iterator\" class=\"hash-link\" aria-label=\"Direct link to “Implementing” an iterator\" title=\"Direct link to “Implementing” an iterator\" translate=\"no\">​</a></h4>\n<p>For the second part, you get to split the work between 2 actors. That way you\ncan achieve higher efficiency of the whole process that you're planning, but it\nalso makes it harder to evaluate algorithmically, since you need to check the\ndifferent ways the work can be split.</p>\n<p>Being affected by <em>functional programming brain damage</em>™️<!-- -->, I have chosen to\ndo this part by function that returns an iterator over the possible ways:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">pairings</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    valves</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BTreeSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Iterator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Item</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BTreeSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BTreeSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'_</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> mapping </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> valves</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect_vec</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> max_mask </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;&lt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">valves</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">len</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">..</span><span class=\"token plain\">max_mask</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">move</span><span class=\"token plain\"> </span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params\">mask</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> elephant </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BTreeSet</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> human </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BTreeSet</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">in</span><span class=\"token plain\"> mapping</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">enumerate</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">mask </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;&lt;</span><span class=\"token plain\"> i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                human</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">insert</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">clone</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                elephant</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">insert</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">clone</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">human</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> elephant</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-17-pyroclastic-flow\"><a href=\"https://adventofcode.com/2022/day/17\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 17: Pyroclastic Flow</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#day-17-pyroclastic-flow\" class=\"hash-link\" aria-label=\"Direct link to day-17-pyroclastic-flow\" title=\"Direct link to day-17-pyroclastic-flow\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Simulating an autonomous Tetris where pieces get affected by a series of jets of\nhot gas.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-2\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#solution-2\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>Similarly to the previous day I have created some iterators <!-- -->😄</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"collision-detection\">Collision detection<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#collision-detection\" class=\"hash-link\" aria-label=\"Direct link to Collision detection\" title=\"Direct link to Collision detection\" translate=\"no\">​</a></h4>\n<p>Once you need to check for collisions it is very helpful to be able to just\niterate through the positions that can actually collide with the wall or other\npiece.</p>\n<p>To get the desired behaviour, you can just compose few smaller functions:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">occupied</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">shape</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Iterator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Item</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Position</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'_</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    shape</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">enumerate</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">flat_map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params\">y</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> row</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        row</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">enumerate</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">filter_map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">move</span><span class=\"token plain\"> </span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params\">x</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> c</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> c </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token char\" style=\"color:hsl(119, 34%, 47%)\">'#'</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Some</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">isize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">None</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>In the end, we get relative positions which we can adjust later when given the\nspecific positions from iterator. You can see some interesting parts in this:</p>\n<ul>\n<li class=\"\"><code>.enumerate()</code> allows us to get both the indices (coordinates) and the line\nor, later on, the character itself,</li>\n<li class=\"\"><code>.flat_map()</code> flattens the iterator, i.e. when we return another iterator,\nthey just get chained instead of iterating over iterators (which sounds pretty\ndisturbing, doesn't it?),</li>\n<li class=\"\">and finally <code>.filter_map()</code> which is pretty similar to the “basic” <code>.map()</code>\nwith a one, key, difference that it expects the items of an iterator to be\nmapped to an <code>Option&lt;T&gt;</code> from which it ignores nothing (as in <code>None</code> <!-- -->😉<!-- -->)\nand also unwraps the values from <code>Some(…)</code>.</li>\n</ul>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"infinite-iterator\">Infinite iterator<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#infinite-iterator\" class=\"hash-link\" aria-label=\"Direct link to Infinite iterator\" title=\"Direct link to Infinite iterator\" translate=\"no\">​</a></h4>\n<p>In the solution we cycle through both Tetris-like shapes that fall down and the\njets that move our pieces around. Initially I have implemented my own infinite\niterator that just yields the indices. It is a very simple, yet powerful, piece\nof code:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">struct</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">InfiniteIndex</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    size</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">InfiniteIndex</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">size</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">InfiniteIndex</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">InfiniteIndex</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> size</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> size </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Iterator</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">InfiniteIndex</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Item</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">next</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Option</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Item</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">%</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">size</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Some</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>However when I'm looking at the code now, it doesn't really make much sense…\nGuess what, we can use a built-in function that is implemented on iterators for\nthat! The function is called <code>.cycle()</code></p>\n<p>On the other hand, I am not going to switch to that function, since it would\nintroduce an another myriad of issues caused by the fact that I create iterators\nright away in the constructor of my structure and the iterators would borrow\nboth the jets and shapes which would introduce a lifetime dependency into the\nstructure.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-18-boiling-boulders\"><a href=\"https://adventofcode.com/2022/day/18\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 18: Boiling Boulders</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#day-18-boiling-boulders\" class=\"hash-link\" aria-label=\"Direct link to day-18-boiling-boulders\" title=\"Direct link to day-18-boiling-boulders\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Let's compute a surface area of some obsidian approximated via coordinates of\ncubes.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-3\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#solution-3\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>This day is kinda interesting, because it shows how easily you can complicate the\nproblem and also how much can you screw yourself over with the optimization and\n“smart” approach.</p>\n<p>For the first part you need to find the surface area of an obsidian that is\napproximated by cubes. Now, that is a very easy thing to do, just keep the track\nof already added cubes, and check if the newly added cube touches any face of any\nother cube. Simple, and with a <code>BTreeSet</code> relatively efficient way to do it.</p>\n<p>However the second part lets you on a secret that there may be some surface area\nfrom the “inside” too and you want to know only the one from the outside of the\nobsidian. I have seen some solutions later, but if you check your data, you might\nnotice that the bounding box of all the cubes isn't that big at all. Therefore I\nchose to pre-construct the box beforehand, fill in the cubes and then just run a\nBFS turning all the lava on the outside into the air. Now you just need to check\ncubes and count how many of their faces touch the air.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-19-not-enough-minerals\"><a href=\"https://adventofcode.com/2022/day/19\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 19: Not Enough Minerals</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#day-19-not-enough-minerals\" class=\"hash-link\" aria-label=\"Direct link to day-19-not-enough-minerals\" title=\"Direct link to day-19-not-enough-minerals\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Finding out the best strategy for building robots to collect geodes.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-4\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#solution-4\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>Not much interesting stuff to mention apart from the suggestion to never believe\nthat the default implementation given by <code>derive</code> macro is what you want, it\ndoesn't have to be. <!-- -->😄</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-20-grove-positioning-system\"><a href=\"https://adventofcode.com/2022/day/20\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 20: Grove Positioning System</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#day-20-grove-positioning-system\" class=\"hash-link\" aria-label=\"Direct link to day-20-grove-positioning-system\" title=\"Direct link to day-20-grove-positioning-system\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Shuffling around the <em>circular linked list</em> to find the coordinates.</p></div></div>\n<p>Now, small rant for this day is in place. They've never mentioned that coordinates\ncan repeat and therefore the values are non-unique. This is something that did\nnot happen in the given sample, but was present in the user input. It took »a lot«\nto realize that this is the issue.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-5\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#solution-5\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>I have tried implementing a circular linked list for this… and I have failed\nmiserably. To be fair, I still have no clue why. It was “fun” to play around with\nthe <code>Rc&lt;RefCell&lt;T&gt;&gt;</code>. In the end I failed on <em>wrong answer</em>. I have also encountered\na rather interesting issue with <code>.borrow_mut()</code> method being used on <code>Rc&lt;RefCell&lt;T&gt;&gt;</code>.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"borrow_mut\"><code>.borrow_mut()</code><a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#borrow_mut\" class=\"hash-link\" aria-label=\"Direct link to borrow_mut\" title=\"Direct link to borrow_mut\" translate=\"no\">​</a></h4>\n<p>Consider the following snippet of the code (taken from the documentation):</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token namespace\">std</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token namespace\">cell</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">RefCell</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">RefMut</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token namespace\">std</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token namespace\">collections</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashMap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token namespace\">std</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token namespace\">rc</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Rc</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// use std::borrow::BorrowMut;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> shared_map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Rc</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">RefCell</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">_</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Rc</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">RefCell</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashMap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// Create a new block to limit the scope of the dynamic borrow</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">RefMut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">_</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> shared_map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">borrow_mut</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">insert</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"africa\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">92388</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">insert</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"kyoto\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">11837</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">insert</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"piccadilly\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">11826</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">insert</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"marbles\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">38</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// Note that if we had not let the previous borrow of the cache fall out</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// of scope then the subsequent borrow would cause a dynamic thread panic.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// This is the major hazard of using `RefCell`.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> total</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> shared_map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">borrow</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">values</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">sum</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">println!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"{total}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>We allocate a hash map on the heap and then in the inner block, we borrow it as\na mutable reference, so that we can use it.</p>\n<div class=\"theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>It is a very primitive example for <code>Rc&lt;RefCell&lt;T&gt;&gt;</code> and mutable borrow.</p></div></div>\n<p>If you uncomment the 4th line with <code>use std::borrow::BorrowMut;</code>, you cannot\ncompile the code anymore, because of</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   Compiling playground v0.0.1 (/playground)</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">error[E0308]: mismatched types</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  --&gt; src/main.rs:10:34</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">10 |         let mut map: RefMut&lt;_&gt; = shared_map.borrow_mut();</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |                      ---------   ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `RefMut`, found mutable reference</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |                      |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |                      expected due to this</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   = note:         expected struct `RefMut&lt;'_, _&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">           found mutable reference `&amp;mut Rc&lt;RefCell&lt;HashMap&lt;_, _&gt;&gt;&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">error[E0599]: no method named `insert` found for struct `RefMut&lt;'_, _&gt;` in the current scope</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  --&gt; src/main.rs:11:13</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">11 |         map.insert(\"africa\", 92388);</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |             ^^^^^^ method not found in `RefMut&lt;'_, _&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">error[E0599]: no method named `insert` found for struct `RefMut&lt;'_, _&gt;` in the current scope</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  --&gt; src/main.rs:12:13</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">12 |         map.insert(\"kyoto\", 11837);</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |             ^^^^^^ method not found in `RefMut&lt;'_, _&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">error[E0599]: no method named `insert` found for struct `RefMut&lt;'_, _&gt;` in the current scope</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  --&gt; src/main.rs:13:13</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">13 |         map.insert(\"piccadilly\", 11826);</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |             ^^^^^^ method not found in `RefMut&lt;'_, _&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">error[E0599]: no method named `insert` found for struct `RefMut&lt;'_, _&gt;` in the current scope</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  --&gt; src/main.rs:14:13</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">14 |         map.insert(\"marbles\", 38);</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |             ^^^^^^ method not found in `RefMut&lt;'_, _&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">Some errors have detailed explanations: E0308, E0599.</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">For more information about an error, try `rustc --explain E0308`.</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">error: could not compile `playground` due to 5 previous errors</span><br></span></code></pre></div></div>\n<p>It might seem <strong>a bit</strong> ridiculous. However, I got to a point where the compiler\nsuggested <code>use std::borrow::BorrowMut;</code> and it resulted in breaking parts of the\ncode that worked previously. I think it may be a good idea to go over what is\nhappening here.</p>\n<h5 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"borrow_mut-on-rcrefcellt\"><code>.borrow_mut()</code> on <code>Rc&lt;RefCell&lt;T&gt;&gt;</code><a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#borrow_mut-on-rcrefcellt\" class=\"hash-link\" aria-label=\"Direct link to borrow_mut-on-rcrefcellt\" title=\"Direct link to borrow_mut-on-rcrefcellt\" translate=\"no\">​</a></h5>\n<p>Let's consider a variable <code>x</code> of type <code>Rc&lt;RefCell&lt;T&gt;&gt;</code>. What happens when you\ncall <code>.borrow_mut()</code> on it? We can look at the <code>Rc</code> type, and… hang on! There is\nneither <code>.borrow_mut()</code> method or <code>BorrowMut</code> trait implemented. How can we do it\nthen?</p>\n<p>Let's go further and we can see that <code>RefCell&lt;T&gt;</code> implements a <code>.borrow_mut()</code>\nmethod. OK, but how can we call it on the <code>Rc&lt;T&gt;</code>? Easily! <code>Rc&lt;T&gt;</code> implements\n<code>Deref&lt;T&gt;</code> and therefore you can call methods on <code>Rc&lt;T&gt;</code> objects as if they were\n<code>T</code> objects. If we read on <em><code>Deref</code> coercion</em>, we can see the following:</p>\n<blockquote>\n<p>If <code>T</code> implements <code>Deref&lt;Target = U&gt;</code>, …:</p>\n<ul>\n<li class=\"\">…</li>\n<li class=\"\"><code>T</code> implicitly implements all the (immutable) methods of the type <code>U</code>.</li>\n</ul>\n</blockquote>\n<p>What is the requirement for the <code>.borrow_mut()</code> on <code>RefCell&lt;T&gt;</code>? Well, it needs\n<code>&amp;self</code>, so the <code>Deref</code> implements the <code>.borrow_mut()</code> for the <code>Rc&lt;RefCell&lt;T&gt;&gt;</code>.</p>\n<h5 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"borrowmut-trait\"><code>BorrowMut</code> trait<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#borrowmut-trait\" class=\"hash-link\" aria-label=\"Direct link to borrowmut-trait\" title=\"Direct link to borrowmut-trait\" translate=\"no\">​</a></h5>\n<p>I have not been able to find a lot on this trait. My guess is that it provides a\nmethod instead of a syntactic sugar (<code>&amp;mut x</code>) for the mutable borrow. And also\nit provides default implementations for the types:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BorrowMut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">str</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BorrowMut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">?</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Sized</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BorrowMut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">?</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Sized</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">A</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BorrowMut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">A</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">A</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Allocator</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">A</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BorrowMut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Box</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">A</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">A</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Allocator</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">?</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Sized</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">N</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BorrowMut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">N</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><br></span></code></pre></div></div>\n<h5 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"conflict\">Conflict<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#conflict\" class=\"hash-link\" aria-label=\"Direct link to Conflict\" title=\"Direct link to Conflict\" translate=\"no\">​</a></h5>\n<p>Now the question is why did it break the code… My first take was that the type\n<code>Rc&lt;RefCell&lt;T&gt;&gt;</code> has some <em>specialized</em> implementation of the <code>.borrow_mut()</code> and\nthe <code>use</code> overrides it with the default, which is true <strong>in a sense</strong>. However\nthere is no <em>specialized</em> implementation. Let's have a look at the trait and the\ntype signature on the <code>RefCell&lt;T&gt;</code>:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// trait</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">trait</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">BorrowMut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Borrowed</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Borrow</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Borrowed</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Borrowed</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">?</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Sized</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">borrow_mut</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Borrowed</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// ‹RefCell&lt;T&gt;.borrow_mut()› type signature</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">borrow_mut</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">RefMut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'_</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><br></span></code></pre></div></div>\n<p>I think that we can definitely agree on the fact that <code>RefMut&lt;'_, T&gt;</code> is not the\n<code>RefCell&lt;T&gt;</code>.</p>\n<p><strong>In my opinion</strong>, <code>RefCell&lt;T&gt;</code> implements a <strong>separate</strong> <code>.borrow_mut()</code> rather\nthan implementing the interface, because it <strong>cannot</strong> satisfy the type requirements\nof the trait.</p>\n<div class=\"theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>I wonder how are we expected to deal with this conflict, if and when, we need\nboth the <code>.borrow_mut()</code> of the trait and <code>.borrow_mut()</code> of the <code>RefCell&lt;T&gt;</code>.</p></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>Fun fact</div><div class=\"admonitionContent_BuS1\"><p>I was suggested by the compiler to do <code>use std::borrow::BorrowMut;</code> and break the\ncode.</p><p>So much for the <em>almighty</em> and <em>helpful</em> compiler…</p></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-21-monkey-math\"><a href=\"https://adventofcode.com/2022/day/21\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 21: Monkey Math</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#day-21-monkey-math\" class=\"hash-link\" aria-label=\"Direct link to day-21-monkey-math\" title=\"Direct link to day-21-monkey-math\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Computing an expression tree and then also finding ideal value for a node.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-6\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#solution-6\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>Relatively simple, until you get to the 2nd part where you start to practice\na lot of the copy-paste. I have managed to sneak some perverted stuff in there\nthough :) Let's go through the details.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"default-trait\"><code>Default</code> trait<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#default-trait\" class=\"hash-link\" aria-label=\"Direct link to default-trait\" title=\"Direct link to default-trait\" translate=\"no\">​</a></h4>\n<p>For the first time and twice I had a need to have a default value for my types,\nenumerations in this case. Rust offers a very nice trait<sup><a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#user-content-fn-1-990909\" id=\"user-content-fnref-1-990909\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">1</a></sup> that is described\nas:</p>\n<blockquote>\n<p>A trait for giving a type a useful default value.</p>\n</blockquote>\n<p>I guess it sums it up nicely. The more interesting part about this is the fact\nthat you can use the <em>macro machinery</em> to save yourself some typing. If you have\nenumeration of which the default value doesn't bear any parameter, you can just\ndo<sup><a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#user-content-fn-2-990909\" id=\"user-content-fnref-2-990909\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">2</a></sup>:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[derive(Default)]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">enum</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Color</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[default]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">White</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Gray</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Black</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"abusing-negation\">Abusing negation<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#abusing-negation\" class=\"hash-link\" aria-label=\"Direct link to Abusing negation\" title=\"Direct link to Abusing negation\" translate=\"no\">​</a></h4>\n<p>If you want to use a <em>unary minus</em> operator on your own type, you can implement\na <code>Neg</code> trait<sup><a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#user-content-fn-3-990909\" id=\"user-content-fnref-3-990909\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">3</a></sup>. I was dealing with a binary tree and needed a way how to look\nat the other side, so I have just implemented the negation for flipping between\nleft and right <!-- -->😄</p>\n<!-- -->\n<section data-footnotes=\"true\" class=\"footnotes\"><h2 class=\"anchor anchorTargetStickyNavbar_Vzrq sr-only\" id=\"footnote-label\">Footnotes<a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#footnote-label\" class=\"hash-link\" aria-label=\"Direct link to Footnotes\" title=\"Direct link to Footnotes\" translate=\"no\">​</a></h2>\n<ol>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-1-990909\">\n<p><a href=\"https://doc.rust-lang.org/std/default/trait.Default.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>Default</code></a> docs <a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#user-content-fnref-1-990909\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-2-990909\">\n<p>Pardon my example from the graph algorithms ;) <a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#user-content-fnref-2-990909\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-3-990909\">\n<p><a href=\"https://doc.rust-lang.org/std/ops/trait.Neg.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>Neg</code></a> docs <a href=\"https://blog.mfocko.dev/blog/aoc-2022/3rd-week/#user-content-fnref-3-990909\" data-footnote-backref=\"\" aria-label=\"Back to reference 3\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n</ol>\n</section>",
            "url": "https://blog.mfocko.dev/blog/aoc-2022/3rd-week/",
            "title": "3rd week of Advent of Code '22 in Rust",
            "summary": "Surviving third week in Rust.",
            "date_modified": "2023-07-06T21:00:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "advent-of-code",
                "advent-of-code-2022",
                "rust"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/leetcode/sort-diagonally/",
            "content_html": "<p>Let's try to solve one of the LeetCode challenges in easy and hard mode at the\nsame time.</p>\n<ul>\n<li class=\"\">Link to the problem: <a href=\"https://leetcode.com/problems/sort-the-matrix-diagonally/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://leetcode.com/problems/sort-the-matrix-diagonally/</a></li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"problem-description\">Problem description<a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#problem-description\" class=\"hash-link\" aria-label=\"Direct link to Problem description\" title=\"Direct link to Problem description\" translate=\"no\">​</a></h2>\n<p>A <strong>matrix diagonal</strong> is a diagonal line of cells starting from some cell in\neither the topmost row or leftmost column and going in the bottom-right direction\nuntil reaching the matrix's end. For example, the <strong>matrix diagonal</strong> starting\nfrom <code>mat[2][0]</code>, where <code>mat</code> is a <code>6 x 3</code> matrix, includes cells <code>mat[2][0]</code>,\n<code>mat[3][1]</code>, and <code>mat[4][2]</code>.</p>\n<p>Given an <code>m x n</code> matrix <code>mat</code> of integers, sort each matrix diagonal in ascending\norder and return the resulting matrix.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"example\">Example<a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#example\" class=\"hash-link\" aria-label=\"Direct link to Example\" title=\"Direct link to Example\" translate=\"no\">​</a></h3>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://assets.leetcode.com/uploads/2020/01/21/1482_example_1_2.png\" alt=\"Image describing the problem\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"skeleton-and-initial-adjustments\">Skeleton and initial adjustments<a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#skeleton-and-initial-adjustments\" class=\"hash-link\" aria-label=\"Direct link to Skeleton and initial adjustments\" title=\"Direct link to Skeleton and initial adjustments\" translate=\"no\">​</a></h2>\n<p>We are given the following skeleton for the C++ and the given challenge:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Solution</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    vector</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">vector</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">int</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">diagonalSort</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">vector</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">vector</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">int</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> mat</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>The task is to sort the passed matrix diagonally and then return it. First of all,\nI don't like to solve this in a web browser, so we'll need to adjust it accordingly\nfor running it locally. We'll start by including the <code>vector</code> header and using\nfully-qualified namespaces<sup><a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#user-content-fn-1-b611be\" id=\"user-content-fnref-1-b611be\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">1</a></sup> and also adding few tests:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token macro property directive-hash\" style=\"color:hsl(5, 74%, 59%)\">#</span><span class=\"token macro property directive keyword\" style=\"color:hsl(301, 63%, 40%)\">include</span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\"> </span><span class=\"token macro property string\" style=\"color:hsl(119, 34%, 47%)\">&lt;cassert&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property directive-hash\" style=\"color:hsl(5, 74%, 59%)\">#</span><span class=\"token macro property directive keyword\" style=\"color:hsl(301, 63%, 40%)\">include</span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\"> </span><span class=\"token macro property string\" style=\"color:hsl(119, 34%, 47%)\">&lt;vector&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">using</span><span class=\"token plain\"> matrix </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">int</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Solution</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    matrix </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">diagonalSort</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">matrix</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> mat</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">static</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">test_case_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    Solution s</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">assert</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">s</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">diagonalSort</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">static</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">test_case_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// Input: mat =</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// Output:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    Solution s</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">assert</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">s</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">diagonalSort</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">11</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">25</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">66</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">69</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">7</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">23</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">55</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">17</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">45</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">15</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">52</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">75</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">31</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">36</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">44</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">58</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">8</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">22</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">27</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">33</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">25</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">68</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">84</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">28</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">14</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">11</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">5</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">50</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">5</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">17</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">52</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">7</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">11</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">11</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">25</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">45</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">8</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">69</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">14</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">23</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">25</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">44</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">58</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">15</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">22</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">27</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">31</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">36</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">50</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">66</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">84</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">28</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">75</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">33</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">55</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">68</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">int</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">test_case_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">test_case_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>We need to return the matrix, but we're given a reference to the input matrix. We\ncan easily abuse the C++ here and just switch the reference to value, this way\nthe matrix will be copied when passed to the function, we can sort the copy and\njust return it back. And we also get yelled by the compiler for the fact that the\nmethod doesn't return anything yet, so to make it “shut up” we will just return\nthe input for now:</p>\n<div class=\"language-diff codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">    matrix diagonalSort(matrix&amp; mat)</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">    matrix diagonalSort(matrix mat)</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    {</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token unchanged line\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">        return mat;</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\"></span><span class=\"token unchanged prefix unchanged\"> </span><span class=\"token unchanged line\">    }</span><br></span></code></pre></div></div>\n<p>Now, we get the copy and we're good to go.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"naïve-solution\">Naïve solution<a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#na%C3%AFve-solution\" class=\"hash-link\" aria-label=\"Direct link to Naïve solution\" title=\"Direct link to Naïve solution\" translate=\"no\">​</a></h2>\n<p>As you may know, C++ offers a plethora of functions that can be used to your\nadvantage, given that you know how to “bend” the data structures accordingly.</p>\n<p>What does that mean for us? Well, we have an <code>std::sort</code>, we can use it, right?\nLet's have a look at it:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">template</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">RandomIt</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">sort</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"> RandomIt first</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> RandomIt last </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>This overload is more than we need. What does it do? It just sorts the elements\nin the range <code>[first, last)</code> using <code>operator&lt;</code> on them. We can't sort the whole\nmatrix using this, but… we can sort just »one« diagonal without doing much work\non our end.</p>\n<p>What is the <code>RandomIt</code> type though? If we look more into the documentation, we\ncan easily find the requirements for it and also learn that it's a <em>random access</em>\n<em>iterator</em> and allows swapping its values at the same time.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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>Random access iterator</div><div class=\"admonitionContent_BuS1\"><p>What is the <em>random access iterator</em> though? We can find it in a documentation\nand see the following description:</p><blockquote>\n<p>A <strong>LegacyRandomAccessIterator</strong> is a <a href=\"https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">LegacyBidirectionalIterator</a>\nthat can be moved to point to any element in constant time.</p>\n</blockquote><p>After that we can see all the requirements for it being listed. I don't feel like\nreading them right now, so we will just use it and see where the compilation blows\nup, i.e. “<em>compiler-assisted development</em>”<sup><a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#user-content-fn-2-b611be\" id=\"user-content-fnref-2-b611be\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">2</a></sup> if you will ;)</p></div></div>\n<p>Now we know that we can use <code>std::sort</code> to sort the diagonal itself, but we also\nneed to get the diagonals somehow. I'm rather lazy, so I'll just delegate it to\nsomeone else<sup><a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#user-content-fn-3-b611be\" id=\"user-content-fnref-3-b611be\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">3</a></sup>. And that way we get</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">matrix </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">diagonalSort</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">matrix mat</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// we iterate over the diagonals</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">auto</span><span class=\"token plain\"> d </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">diagonals</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">mat</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// and we sort each diagonal</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">sort</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">d</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">begin</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> d</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">end</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// we take the matrix by copy, so we can sort in-situ and return the copy</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// that we sorted</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> mat</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>This solution looks very simple, doesn't it? Well, cause it is.\nLet's try compiling it:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">matrix-sort.cpp:11:23: error: use of undeclared identifier 'diagonals' [clang-diagnostic-error]</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        for (auto d : diagonals(mat)) {</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                      ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">Found compiler error(s).</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">make: *** [makefile:14: tidy] Error 1</span><br></span></code></pre></div></div>\n<p>OK, seems about right. We haven't implemented the <code>diagonals</code> yet. And based on\nwhat we've written so far, we need a function or a class <code>diagonals</code> that will\ngive us the diagonals we need.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"implementing-the-diagonals\">Implementing the <code>diagonals</code><a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#implementing-the-diagonals\" class=\"hash-link\" aria-label=\"Direct link to implementing-the-diagonals\" title=\"Direct link to implementing-the-diagonals\" translate=\"no\">​</a></h2>\n<p>Cool, so we need the function that will let us go through each and every diagonal\nin our matrix. We use the <em>for-range</em> loop, so whatever we get back from the\n<code>diagonals</code> must support <code>.begin()</code> and <code>.end()</code>. Since I am a masochist, we will\ndo such functionality for a matrix of any type, not just the <code>int</code> from the challenge.</p>\n<p>As I said, we need to be able to</p>\n<ul>\n<li class=\"\">construct the object</li>\n<li class=\"\">get the beginning</li>\n<li class=\"\">get the end (the “sentinel”)</li>\n</ul>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">template</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">typename</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">diagonals</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">using</span><span class=\"token plain\"> matrix_t </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    matrix_t</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> _matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">diagonals</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">matrix_t</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">_matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    diagonals_iter </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">begin</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">/* TODO */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    diagonals_iter </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">end</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">/* TODO */</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>Now we have a <code>diagonals</code> that we can use to go through the diagonals. We haven't\nimplemented the core of it yet. Let's go through what we have for now.</p>\n<p>We have a templated class with templated <code>T</code> that is used as a placeholder for any\ntype we would store in the matrix. Because I'm lazy, I have defined the <code>matrix_t</code>\ntype that is a “shortcut” for <code>std::vector&lt;std::vector&lt;T&gt;&gt;</code>, so I don't have to\ntype it out all the time. Of course, we need to store the matrix, we are given,\nas a private attribute. And then just have the constructor and the 2 methods we\nneed for the <em>for-range</em>.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"iterating-over-diagonals\">Iterating over diagonals<a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#iterating-over-diagonals\" class=\"hash-link\" aria-label=\"Direct link to Iterating over diagonals\" title=\"Direct link to Iterating over diagonals\" translate=\"no\">​</a></h3>\n<p>Now that we have an object that will allow us to iterate through the diagonals,\nwe need to implement the iterating itself. We need to go through all of them, so\nwe have multiple options how to do so. I have decided to start from the “main”\ndiagonal that starts at <code>(0, 0)</code> index and then proceed with the diagonals starting\nin the first row, followed by the rest of the diagonals in the first column.</p>\n<p>We need to be able to tell that we've iterated through all of them, and also we\nneed to know which diagonal is next. For that purpose we will pass the indices\nof the first cell on the diagonal. That way we can always tell how to move forward.</p>\n<p>We will start by updating the <code>begin</code> and <code>end</code> to reflect our choice accordingly.</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">diagonals_iter </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">begin</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> diagonals_iter </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> _matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">diagonals_iter </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">end</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> diagonals_iter </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> _matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> _matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">size</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>For the <code>begin</code> we return the first diagonal that starts at <code>(0, 0)</code>. And because\nwe have decided to do the diagonals in the first column at the end, the first\ndiagonal that is not a valid one is the one at <code>(0, height)</code>. Apart from the\nindices, we also need to pass reference to the matrix itself.</p>\n<div class=\"theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>You may have noticed that we also include the diagonals that have length 1,\nspecifically the ones at <code>(0, height - 1)</code> and <code>(width - 1, 0)</code>. We are implementing\nan iterator that <strong>should not</strong> care about the way it's being used. Therefore, we\ndon't care about the fact they don't need to be sorted.</p></div></div>\n<p>Cool, let's leave the iterator itself to someone else, right?<sup><a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#user-content-fn-4-b611be\" id=\"user-content-fnref-4-b611be\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">4</a></sup></p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"implementing-the-iterator-over-diagonals\">Implementing the iterator over diagonals<a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#implementing-the-iterator-over-diagonals\" class=\"hash-link\" aria-label=\"Direct link to Implementing the iterator over diagonals\" title=\"Direct link to Implementing the iterator over diagonals\" translate=\"no\">​</a></h3>\n<p>We can start with a simple skeleton based on the information that we pass from\nthe <code>diagonals</code>. Also to utilize the <code>matrix_t</code> and also contain implementation\ndetails hidden away, we will put this code into the <code>diagonals</code> class.</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">diagonals_iter</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    matrix_t</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">diagonals_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">matrix_t</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>In this case we will be implementing a “simple” forward iterator, so we don't\nneed to implement a lot. Notably it will be:</p>\n<ul>\n<li class=\"\">inequality operator (we need to know when we reach the end and have nothing to\niterate over)</li>\n<li class=\"\">preincrementation operator (we need to be able to move around the iterable)</li>\n<li class=\"\">dereference operator (we need to be able to retrieve the objects we iterate\nover)</li>\n</ul>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">diagonals_iter</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    matrix_t</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">diagonals_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">matrix_t</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">bool</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!=</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"> diagonals_iter</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// iterators are not equal if they reference different matrices, or</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// their positions differ</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> m </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!=</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">m </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">||</span><span class=\"token plain\"> x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!=</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">||</span><span class=\"token plain\"> y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!=</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    diagonals_iter</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">++</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">!=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// iterating through diagonals down the first column</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            y</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">++</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">this</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// iterating the diagonals along the first row</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        x</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">++</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">front</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">size</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// switching to diagonals in the first column</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            y</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">++</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">this</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    diagonal</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> diagonal </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>Let's go one-by-one. Inequality operator is rather simple, just compare iterator's\nattributes field-by-field. If you think about it, checking inequality of two 2D\nvectors may be a bit inefficient, therefore, we can swap around and check it as\na last thing.</p>\n<div class=\"language-diff codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">        return m != rhs.m || x != rhs.x || y != rhs.y;</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">        return x != rhs.x || y != rhs.y || m != rhs.m;</span><br></span></code></pre></div></div>\n<p>Preincrementation is where the magic happens. If you have a better look, you can\nsee two branches of this operation:</p>\n<ol>\n<li class=\"\">When <code>y != 0</code> (we're iterating over the diagonals in the first column)\nIn this case, we just bump the row and we're done.</li>\n<li class=\"\">When <code>y == 0</code> (we're iterating over the diagonals in the first row)\nIn this case, we bump the column and check if we haven't gotten out of bounds,\ni.e. the end of the first row. If we get out of the bounds, we're continuing\nwith the second diagonal in the first column.</li>\n</ol>\n<p>Dereferencing the iterator must “yield” something. In our case it will be the\ndiagonal that we want to sort. For sorting we need just the iterators that can\nmove around said diagonal. The simplest thing, we can do, is to delegate it to\nsomething else. In our case it will be a class called <code>diagonal</code>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"implementing-the-diagonal-itself\">Implementing the <code>diagonal</code> itself<a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#implementing-the-diagonal-itself\" class=\"hash-link\" aria-label=\"Direct link to implementing-the-diagonal-itself\" title=\"Direct link to implementing-the-diagonal-itself\" translate=\"no\">​</a></h2>\n<p>After implementing the iterator over diagonals, we know that all we need to describe\na diagonal is the matrix itself and the “start” of the diagonal (row and column).\nAnd we also know that the diagonal must provide some iterators for the <code>std::sort</code>\nfunction. We can start with the following skeleton:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">template</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">typename</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">diagonal</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">using</span><span class=\"token plain\"> matrix_t </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">vector</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    matrix_t</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">diagonal</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">matrix_t</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    diagonal_iter </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">begin</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> diagonal_iter </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    diagonal_iter </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">end</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">auto</span><span class=\"token plain\"> max_x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">size</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">auto</span><span class=\"token plain\"> max_y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">size</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// we need to find the distance in which we get out of bounds (either in</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// column or row)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">auto</span><span class=\"token plain\"> steps </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">min</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">max_x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> max_y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> diagonal_iter </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> steps</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> steps </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>Initialization is rather simple, we just “keep” the stuff we get, <code>begin</code> is the\nsimplest, we just delegate.</p>\n<p>In case of the <code>end</code>, it gets more complicated. We need to know where is the “end”\nof the diagonal. Since <code>end</code> should point to the first element “after” the iterable,\nwe know that it's the first position of the iterator where either <code>y</code> becomes\n<code>matrix.size()</code> or <code>x</code> becomes <code>matrix[y].size()</code>. Also we are moving along diagonal,\nduh, therefore we can deduce the first “position” afterwards by minimal amount of\nsteps to get out of the any column or row, hence <code>std::min(max_x - x, max_y - y)</code>.\nFinal position is then computed simply by adding the steps to the beginning of\nthe diagonal.</p>\n<p>Now we just need to finish the iterator for the diagonal itself and we're done.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"implementing-diagonal_iter\">Implementing <code>diagonal_iter</code><a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#implementing-diagonal_iter\" class=\"hash-link\" aria-label=\"Direct link to implementing-diagonal_iter\" title=\"Direct link to implementing-diagonal_iter\" translate=\"no\">​</a></h3>\n<p>This part is the hardest from all we need to do. It's because of the requirements\nof the <code>std::sort</code> that requires us to implement a <em>random access iterator</em>. I have\nbriefly described it above, and “in a nutshell” it means that we need to implement\nan iterator that can move in constant time along the diagonal in any amount of\nsteps.</p>\n<p>Let's go through all of the functionality that our iterator needs to support to\nbe used in <code>std::sort</code>. We need the usual operations like:</p>\n<ul>\n<li class=\"\">equality/inequality</li>\n<li class=\"\">incrementation</li>\n<li class=\"\">dereferencing</li>\n</ul>\n<p>We will also add all the types that our iterator uses with the category of the\niterator, i.e. what interface it supports:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">diagonal_iter</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// we need to keep reference to the matrix itself</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    matrix_t</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// we need to be able to tell our current position</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">using</span><span class=\"token plain\"> difference_type </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">ptrdiff_t</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">using</span><span class=\"token plain\"> value_type </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">using</span><span class=\"token plain\"> pointer </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">using</span><span class=\"token plain\"> reference </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">using</span><span class=\"token plain\"> iterator_category </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">random_access_iterator_tag</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">diagonal_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">matrix_t</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">bool</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"> diagonal_iter</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;&amp;</span><span class=\"token plain\"> y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;&amp;</span><span class=\"token plain\"> m </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    diagonal_iter</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">++</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// we are moving along the diagonal, so we increment both ‹x› and ‹y› at</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// the same time</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        x</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">++</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        y</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">++</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">this</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    reference </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>This is pretty similar to the previous iterator, but now we need to implement the\nremaining requirements of the <em>random access iterator</em>. Let's see what those are:</p>\n<ul>\n<li class=\"\">decrementation - cause we need to be able to move backwards too, since _random _\n<em>access iterator</em> extends the interface of <em>bidirectional iterator</em></li>\n<li class=\"\">moving the iterator in either direction by steps given as an integer</li>\n<li class=\"\">being able to tell the distance between two iterators</li>\n<li class=\"\">define an ordering on the iterators</li>\n</ul>\n<p>Let's fill them in:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">diagonal_iter</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// we need to keep reference to the matrix itself</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    matrix_t</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// we need to be able to tell our current position</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">public</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">using</span><span class=\"token plain\"> difference_type </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">ptrdiff_t</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">using</span><span class=\"token plain\"> value_type </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">using</span><span class=\"token plain\"> pointer </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">using</span><span class=\"token plain\"> reference </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">using</span><span class=\"token plain\"> iterator_category </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">random_access_iterator_tag</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">diagonal_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">matrix_t</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        std</span><span class=\"token double-colon punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">size_t y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">:</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">matrix</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">bool</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"> diagonal_iter</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;&amp;</span><span class=\"token plain\"> y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;&amp;</span><span class=\"token plain\"> m </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    diagonal_iter</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">++</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// we are moving along the diagonal, so we increment both ‹x› and ‹y› at</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// the same time</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        x</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">++</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        y</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">++</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">this</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    reference </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// exactly opposite to the incrementation</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    diagonal_iter </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">--</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        x</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">--</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        y</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">--</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">this</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// moving ‹n› steps back is same as calling decrementation ‹n›-times, so we</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// can just return a new iterator and subtract ‹n› from both coordinates in</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// the matrix</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    diagonal_iter </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">difference_type n</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> diagonal_iter </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"> n</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"> n </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// here we assume that we are given two iterators on the same diagonal</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    difference_type </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"> diagonal_iter</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">assert</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">m </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">-</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// counterpart of moving ‹n› steps backwards</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    diagonal_iter </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">difference_type n</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> diagonal_iter </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"> m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> n</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> n </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// we compare the coordinates, and also assume that those 2 iterators are</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// lying on the same diagonal</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">bool</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">operator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"> diagonal_iter</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">assert</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">m </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">m</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;&amp;</span><span class=\"token plain\"> y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\"> rhs</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>At this point we could probably try and compile it, right? If we do so, we will\nget yelled at by a compiler for the following reasons:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal&lt;int&gt;::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          __last = __next;</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                 ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization 'std::__unguarded_linear_insert&lt;diagonal&lt;int&gt;::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter&gt;' requested here</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            std::__unguarded_linear_insert(__i,</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                 ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization 'std::__insertion_sort&lt;diagonal&lt;int&gt;::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter&gt;' requested here</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          std::__insertion_sort(__first, __first + int(_S_threshold), __comp);</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">               ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort&lt;diagonal&lt;int&gt;::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter&gt;' requested here</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          std::__final_insertion_sort(__first, __last, __comp);</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">               ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort&lt;diagonal&lt;int&gt;::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter&gt;' requested here</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">           ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort&lt;diagonal&lt;int&gt;::diagonal_iter&gt;' requested here</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            std::sort(d.begin(), d.end());</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                 ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal&lt;int&gt;::matrix_t &amp;' (aka 'vector&lt;std::vector&lt;int&gt;&gt; &amp;')</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        matrix_t&amp; m;</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                  ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to '__unguarded_linear_insert' [clang-diagnostic-error]</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        std::__unguarded_linear_insert(__i,</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization 'std::__unguarded_insertion_sort&lt;diagonal&lt;int&gt;::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter&gt;' requested here</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">               ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort&lt;diagonal&lt;int&gt;::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter&gt;' requested here</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          std::__final_insertion_sort(__first, __last, __comp);</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">               ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort&lt;diagonal&lt;int&gt;::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter&gt;' requested here</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">           ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort&lt;diagonal&lt;int&gt;::diagonal_iter&gt;' requested here</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            std::sort(d.begin(), d.end());</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                 ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal&lt;int&gt;::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    __unguarded_linear_insert(_RandomAccessIterator __last,</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type 'diagonal&lt;int&gt;::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          __last = __cut;</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                 ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization 'std::__introsort_loop&lt;diagonal&lt;int&gt;::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter&gt;' requested here</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">          std::__introsort_loop(__first, __last,</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">               ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort&lt;diagonal&lt;int&gt;::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter&gt;' requested here</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">           ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort&lt;diagonal&lt;int&gt;::diagonal_iter&gt;' requested here</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            std::sort(d.begin(), d.end());</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                 ^</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal&lt;int&gt;::matrix_t &amp;' (aka 'vector&lt;std::vector&lt;int&gt;&gt; &amp;')</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        matrix_t&amp; m;</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                  ^</span><br></span></code></pre></div></div>\n<p>That's a lot of noise, isn't it? Let's focus on the important parts:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal&lt;int&gt;::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">…</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal&lt;int&gt;::matrix_t &amp;' (aka 'vector&lt;std::vector&lt;int&gt;&gt; &amp;')</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        matrix_t&amp; m;</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                  ^</span><br></span></code></pre></div></div>\n<p>Ah! We have a reference in our iterator, and this prevents us from having a copy\nassignment operator (that is used “somewhere” in the sorting algorithm). Well…\nLet's just wrap it!</p>\n<div class=\"language-diff codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-diff codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"># we need to keep a different type than reference</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">        matrix_t&amp; m;</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">        std::reference_wrapper&lt;matrix_t&gt; m;</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\"></span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"># in comparison we need to get the reference out of the wrapper first</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">            return x == rhs.x &amp;&amp; y == rhs.y &amp;&amp; m == rhs.m;</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">            return x == rhs.x &amp;&amp; y == rhs.y &amp;&amp; m.get() == rhs.m.get();</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\"></span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"># same when we return a reference to the “cell” in the matrix</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">        reference operator*() const { return m[y][x]; }</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">        reference operator*() const { return m.get()[y][x]; }</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\"></span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"># and finally in the assertions that we set for the “distance” and “less than”</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token deleted-sign deleted prefix deleted\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">-</span><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\">            assert(m == rhs.m);</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token deleted-sign deleted line\" style=\"color:hsl(5, 74%, 59%);text-decoration-line:line-through\"></span><span class=\"token inserted-sign inserted prefix inserted\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">+</span><span class=\"token inserted-sign inserted line\" style=\"color:hsl(119, 34%, 47%);text-decoration-line:underline\">            assert(m.get() == rhs.m.get());</span><br></span></code></pre></div></div>\n<p>We're done now! We have written an iterator over diagonals for a 2D <code>vector</code>. You can have a look at the final result <a href=\"https://blog.mfocko.dev/files/blog/leetcode/sort-matrix-diagonally/matrix-sort.cpp\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">here</a>.</p>\n<!-- -->\n<section data-footnotes=\"true\" class=\"footnotes\"><h2 class=\"anchor anchorTargetStickyNavbar_Vzrq sr-only\" id=\"footnote-label\">Footnotes<a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#footnote-label\" class=\"hash-link\" aria-label=\"Direct link to Footnotes\" title=\"Direct link to Footnotes\" translate=\"no\">​</a></h2>\n<ol>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-1-b611be\">\n<p>just because I'm used to it and don't care about your opinion ;) <a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#user-content-fnref-1-b611be\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-2-b611be\">\n<p>exercise at your own risk <a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#user-content-fnref-2-b611be\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-3-b611be\">\n<p>me in 5 minutes in fact, but don't make me scared <a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#user-content-fnref-3-b611be\" data-footnote-backref=\"\" aria-label=\"Back to reference 3\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-4-b611be\">\n<p>me in the next section… <a href=\"https://blog.mfocko.dev/blog/leetcode/sort-diagonally/#user-content-fnref-4-b611be\" data-footnote-backref=\"\" aria-label=\"Back to reference 4\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n</ol>\n</section>",
            "url": "https://blog.mfocko.dev/blog/leetcode/sort-diagonally/",
            "title": "Sort the matrix diagonally",
            "summary": "Compiler assisted development.",
            "date_modified": "2023-03-04T23:15:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "cpp",
                "leetcode",
                "iterators"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/aoc-2022/2nd-week/",
            "content_html": "<p>Let's go through the second week of <a href=\"https://adventofcode.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><em>Advent of Code</em></a> in Rust.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-8-treetop-tree-house\"><a href=\"https://adventofcode.com/2022/day/8\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 8: Treetop Tree House</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#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\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>We get a forest and we want to know how many trees are visible from the outside.\nApart from that we want to find the best view.</p></div></div>\n<p>Nothing interesting. We are moving around 2D map though. And indexing can get a\nbit painful when doing so, let's refactor it a bit ;) During the preparation for\nthe AoC, I have written <code>Vector2D</code> and now it's time to extend it with indexing\nof <code>Vec</code> of <code>Vec</code>s. In my solution I was manipulating with indices in the following\nway:</p>\n<ul>\n<li class=\"\">swapping them</li>\n<li class=\"\">checking whether they are correct indices for the <code>Vec&lt;Vec&lt;T&gt;&gt;</code></li>\n<li class=\"\">indexing <code>Vec&lt;Vec&lt;T&gt;&gt;</code> with them</li>\n</ul>\n<div class=\"theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>I'm getting familiar with Rust and starting to “abuse” it… While doing so, I'm\nalso uncovering some “features” that I don't really like. Therefore I will mark\nall of my rants with <em>thicc</em> <strong>«↯»</strong> mark and will try to “lock” them into their\nown “box of hell”.</p></div></div>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"swapping-indices\">Swapping indices<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#swapping-indices\" class=\"hash-link\" aria-label=\"Direct link to Swapping indices\" title=\"Direct link to Swapping indices\" translate=\"no\">​</a></h4>\n<p>Relatively simple implementation, just take the values, swap them and return new\nvector.</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Copy</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">swap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>Pretty straight-forward implementation, but let's talk about the <code>T: Copy</code>. We\nneed to use it, since we are returning a <strong>new</strong> vector, with swapped <strong>values</strong>.\nIf we had values that cannot be copied, the only thing we could do, would be a\nvector of references (and it would also introduce a lifetime, to which we'll get\nlater on). This is pretty similar with the operations on sets from the first week.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"indexing-vec\">Indexing <code>Vec</code><a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#indexing-vec\" class=\"hash-link\" aria-label=\"Direct link to indexing-vec\" title=\"Direct link to indexing-vec\" translate=\"no\">​</a></h4>\n<p>I will start with the indexing, cause bound-checking is a bit more… complicated\nthan I would like to.</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">index</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryFrom</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryFrom</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Error</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Debug</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Copy</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>Let's talk about this mess… Body of the function is probably the most easy part\nand should not be hard to understand, we just take the <code>x</code> and <code>y</code> and convert\nthem both to <code>usize</code> type that can be used later on for indexing.</p>\n<p>The type signature of the function is where the fun is at <!-- -->😉<!-- --> We are trying\nto convert unknown type to <code>usize</code>, so we must bound the <code>T</code> as a type that can\nbe converted to <code>usize</code>, that's how we got <code>usize: TryFrom&lt;T&gt;</code> which basically\nsays that <code>usize</code> must implement <code>TryFrom&lt;T&gt;</code> trait and therefore allows us to\nconvert the indices to actual <code>usize</code> indices. Using <code>.unwrap()</code> also forces us\nto bound the error that can occur when converting <code>T</code> into <code>usize</code>, that's how\nwe get <code>&lt;usize as TryFrom&lt;T&gt;&gt;::Error: Debug</code> which loosely means</p>\n<blockquote>\n<p>error during conversion of <code>T</code> into <code>usize</code> must implement <code>Debug</code>,\ni.e. can be printed in some way or other</p>\n</blockquote>\n<p><code>T: Copy</code> is required by <code>.try_into()</code> which takes <code>T</code> by-value.</p>\n<p>And now we are left only with the first line of the definition.</p>\n<div class=\"theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Skilled Rustaceans might notice that this implementation is rather flaky and can\nbreak in multiple places at once. I'll get back to it…</p></div></div>\n<p>Let's split it in multiple parts:</p>\n<ul>\n<li class=\"\"><code>v: &amp;'a [Vec&lt;U&gt;]</code> represents the 2D <code>Vec</code>, we are indexing, <code>Vec</code> implements\n<code>Slice</code> trait and <em>clippy</em> recommends using <code>&amp;[T]</code> to <code>&amp;Vec&lt;T&gt;</code>, exact details\nare unknown to me</li>\n<li class=\"\"><code>idx: &amp;Vector2D&lt;T&gt;</code> represents the <em>indices</em> which we use, we take them by\nreference to avoid an unnecessary copy</li>\n<li class=\"\"><code>-&gt; &amp;'a U</code> means that we are returning a <em>reference</em> to some value of type <code>U</code>.\nNow the question is what does the <code>'a</code> mean, we can also see it as a generic\ntype declared along <code>T</code> and <code>U</code>. And the answer is <em>relatively</em> simple, <code>'a</code>\nrepresents a <em>lifetime</em>. We take the <code>v</code> by a reference and return a reference,\nborrow checker validates all of the <em>borrows</em> (or references), so we need to\nspecify that our returned value has <em>the same lifetime</em> as the vector we have\ntaken by a reference, i.e. returned reference must live at least as long as the\n<code>v</code>. This way we can “be sure” that the returned reference is valid.</li>\n</ul>\n<h5 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"issues\">Issues<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#issues\" class=\"hash-link\" aria-label=\"Direct link to Issues\" title=\"Direct link to Issues\" translate=\"no\">​</a></h5>\n<p>First issue that our implementation has is the fact that we cannot get a mutable\nreference out of that function. This could be easily resolved by introducing new\nfunction, e.g. <code>index_mut</code>. Which I have actually done while writing this part:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">index_mut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryFrom</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryFrom</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Error</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Debug</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Copy</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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><strong>«↯»</strong> Why can't we use one function?</div><div class=\"admonitionContent_BuS1\"><p>When we consider a <code>Vec&lt;T&gt;</code>, we don't need to consider containers as <code>T</code>, Rust\nimplements indexing as traits <code>Index&lt;T&gt;</code> and <code>IndexMut&lt;T&gt;</code> that do the dirty work\nbehind syntactic sugar of <code>container[idx]</code>.</p><p>However, implementing of traits is not allowed for <em>external</em> types, i.e. types\nthat you haven't defined yourself. This means that you can implement indexing\nover containers that you have implemented yourself, but you cannot use your own\ntypes for indexing “built-in” types.</p><p>Another part of this rabbit hole is trait <code>SliceIndex&lt;T&gt;</code> that is of a relevance\nbecause of</p><div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Index</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">SliceIndex</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">A</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Index</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">A</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">SliceIndex</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">A</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Allocator</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">const</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">N</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Index</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">N</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Index</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><br></span></code></pre></div></div><p>In other words, if your type implements <code>SliceIndex&lt;T&gt;</code> trait, it can be used\nfor indexing. As of now, this trait has all of its required methods experimental\nand is marked as <code>unsafe</code>.</p></div></div>\n<p>Another problem is a requirement for indexing either <code>[Vec&lt;T&gt;]</code> or <code>Vec&lt;Vec&lt;T&gt;&gt;</code>.\nThis requirement could be countered by removing inner type <code>Vec&lt;T&gt;</code> and constraining\nit by a trait <code>Index</code> (or <code>IndexMut</code> respectively) in a following way</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">index</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryFrom</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryFrom</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Error</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Debug</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Copy</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Index</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>Given this, we can also give a more meaningful typename for indexing type, such\nas <code>I</code>.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"checking-bounds\">Checking bounds<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#checking-bounds\" class=\"hash-link\" aria-label=\"Direct link to Checking bounds\" title=\"Direct link to Checking bounds\" translate=\"no\">​</a></h4>\n<p>Now we can get to the boundary checks, it is very similar, but a more… dirty.\nFirst approach that came up was to convert the indices in <code>Vector2D</code> to <code>usize</code>,\nbut when you add the indices up, e.g. when checking the neighbors, you can end\nup with negative values which, unlike in C++, causes an error (instead of underflow\nthat you can use to your advantage; you can easily guess how).</p>\n<p>So how can we approach this then? Well… we will convert the bounds instead of\nthe indices and that lead us to:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">in_range</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">bool</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryInto</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryInto</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Error</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Debug</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">PartialOrd</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Copy</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;&amp;</span><span class=\"token plain\"> idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\"> v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">len</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;&amp;</span><span class=\"token plain\"> idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">0</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;&amp;</span><span class=\"token plain\"> idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\"> v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryInto</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">len</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>You can tell that it's definitely a shitty code. Let's improve it now! We will\nget back to the original idea, but do it better. We know that we cannot convert\nnegative values into <code>usize</code>, <strong>but</strong> we also know that conversion like that\nreturns a <code>Result&lt;T, E&gt;</code> which we can use to our advantage.</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">in_range</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">bool</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Copy</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryFrom</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">and_then</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params\">y</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">idx</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params\">x</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> y </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\"> v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">len</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;&amp;</span><span class=\"token plain\"> x </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\"> v</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">len</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap_or</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token boolean\" style=\"color:hsl(35, 99%, 36%)\">false</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p><code>Result&lt;T, E&gt;</code> is a type similar to <code>Either</code> in Haskell and it allows us to chain\nmultiple operations on correct results or propagate the original error without\ndoing anything. Let's dissect it one-by-one.</p>\n<p><code>try_from</code> is a method implemented in <code>TryFrom</code> trait, that allows you to convert\ntypes and either successfully convert them or fail (with a reasonable error). This\nmethod returns <code>Result&lt;T, E&gt;</code>.</p>\n<p>We call <code>and_then</code> on that <em>result</em>, let's have a look at the type signature of\n<code>and_then</code>, IMO it explains more than enough:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">and_then</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">F</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> op</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">F</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">E</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">F</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">FnOnce</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">E</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><br></span></code></pre></div></div>\n<p>OK… So it takes the result and a function and returns another result with\ndifferent value and different error. However we can see that the function, which\nrepresents an operation on a result, takes just the value, i.e. it doesn't care\nabout any previous error. To make it short:</p>\n<blockquote>\n<p><code>and_then</code> allows us to run an operation, which can fail, on the correct result</p>\n</blockquote>\n<p>We parsed a <code>y</code> index and now we try to convert the <code>x</code> index with <code>try_from</code>\nagain, but on that result we use <code>map</code> rather than <code>and_then</code>, why would that be?</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">map</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">F</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> op</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">F</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">E</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">F</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">FnOnce</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><br></span></code></pre></div></div>\n<p>Huh… <code>map</code> performs an operation that <strong>cannot</strong> fail. And finally we use\n<code>unwrap_or</code> which takes the value from result, or in case of an error returns the\ndefault that we define.</p>\n<p>How does this work then? If <code>y</code> is negative, the conversion fails and the error\npropagates all the way to <code>unwrap_or</code>, if <code>y</code> can be a correct <code>usize</code> value, then\nwe do the same with <code>x</code>. If <code>x</code> is negative, we propagate the error as with <code>y</code>,\nand if it's not, then we check whether it exceeds the higher bounds or not.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#solution\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>Relatively simple, you just need follow the rules and not get too smart, otherwise\nit will get back at you.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-9-rope-bridge\"><a href=\"https://adventofcode.com/2022/day/9\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 9: Rope Bridge</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#day-9-rope-bridge\" class=\"hash-link\" aria-label=\"Direct link to day-9-rope-bridge\" title=\"Direct link to day-9-rope-bridge\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>We get a rope with knots and we want to track how many different positions are\nvisited with the rope's tail.</p></div></div>\n<p>By this day, I have come to a conclusion that current skeleton for each day\ngenerates a lot of boilerplate. And even though it can be easily copied, it's\njust a waste of space and unnecessary code. Let's “simplify” this (on one end\nwhile creating monster on the other end). I've gone through what we need in the\npreparations for the AoC. Let's sum up our requirements:</p>\n<ul>\n<li class=\"\">parsing</li>\n<li class=\"\">part 1 &amp; 2</li>\n<li class=\"\">running on sample / input</li>\n<li class=\"\">tests</li>\n</ul>\n<p>Parsing and implementation of both parts is code that changes each day and we\ncannot do anything about it. However running and testing can be simplified!</p>\n<p>Let's introduce and export a new module <code>solution</code> that will take care of all of\nthis. We will start by introducing a trait for each day.</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">trait</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Solution</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Display</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">parse_input</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">AsRef</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Path</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">pathname</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>This does a lot of work for us already, we have defined a trait and for each day\nwe will create a structure representing a specific day. That structure will also\nimplement the <code>Solution</code> trait.</p>\n<p>Now we need to get rid of the boilerplate, we can't get rid of the <code>main</code> function,\nbut we can at least move out the functionality.</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">run</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">type_of_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">str</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Sized</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token namespace\">tracing_subscriber</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">fmt</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">with_env_filter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">EnvFilter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from_default_env</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">with_target</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token boolean\" style=\"color:hsl(35, 99%, 36%)\">false</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">with_file</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token boolean\" style=\"color:hsl(35, 99%, 36%)\">true</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">with_line_number</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token boolean\" style=\"color:hsl(35, 99%, 36%)\">true</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">without_time</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">compact</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">init</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token namespace\">color_eyre</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">install</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">?</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> input </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">parse_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">format!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"{}s/{}.txt\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> type_of_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">day</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">info!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Part 1: {}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">info!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Part 2: {}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Ok</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Sized</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">run</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"input\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>This is all part of the <code>Solution</code> trait, which can implement methods while being\ndependent on what is provided by the implementing types. In this case, we just\nneed to bound the <code>Output</code> type to implement <code>Display</code> that is necessary for the\n<code>info!</code> and format string there.</p>\n<p>Now we can get to first of the nasty things we are going to do… And it is the\n<code>day()</code> method that you can see being used when constructing path to the input\nfile. That method will generate a name of the file, e.g. <code>day01</code> and we know that\nwe can <em>somehow</em> deduce it from the structure name, given we name it reasonably.</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">day</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> day </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">type_name</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">split</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"::\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">next</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    day</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">make_ascii_lowercase</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    day</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">to_string</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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><code>type_name</code></div><div class=\"admonitionContent_BuS1\"><p>This feature is still experimental and considered to be internal, it is not\nadvised to use it any production code.</p></div></div>\n<p>And now we can get to the nastiest stuff <!-- -->😩<!-- --> We will <strong>generate</strong> the tests!</p>\n<p>We want to be able to generate tests for sample input in a following way:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">test_sample!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">day_01</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Day01</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">42</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">69</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>There's not much we can do, so we will write a macro to generate the tests for us.</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[macro_export]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">macro_rules!</span><span class=\"token plain\"> test_sample </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$mod_name</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token fragment-specifier punctuation\" style=\"color:hsl(119, 34%, 47%)\">ident</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$day_struct</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token fragment-specifier punctuation\" style=\"color:hsl(119, 34%, 47%)\">tt</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token fragment-specifier punctuation\" style=\"color:hsl(119, 34%, 47%)\">expr</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token fragment-specifier punctuation\" style=\"color:hsl(119, 34%, 47%)\">expr</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[cfg(test)]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mod</span><span class=\"token plain\"> </span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$mod_name</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">super</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[test]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">test_part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> sample </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                    </span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$day_struct</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">parse_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">format!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"samples/{}.txt\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$day_struct</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">day</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">assert_eq!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$day_struct</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">sample</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[test]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">test_part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> sample </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                    </span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$day_struct</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">parse_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">format!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"samples/{}.txt\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$day_struct</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">day</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">assert_eq!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$day_struct</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">sample</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>We have used it in a similar way as macros in C/C++, one of the things that we\ncan use to our advantage is defining “type” of the parameters for the macro. All\nparameters have their name prefixed with <code>$</code> sign and you can define various “forms”\nof your macro. Let's go through it!</p>\n<p>We have following parameters:</p>\n<ul>\n<li class=\"\"><code>$mod_name</code> which represents the name for the module with tests, it is typed\nwith <code>ident</code> which means that we want a valid identifier to be passed in.</li>\n<li class=\"\"><code>$day_struct</code> represents the structure that will be used for tests, it is typed\nwith <code>tt</code> which represents a <em>token tree</em>, in our case it is a type.</li>\n<li class=\"\"><code>$part_X</code> represents the expected output for the <code>X</code>th part and is of type <code>expr</code>\nwhich literally means an <em>expression</em>.</li>\n</ul>\n<p>Apart from that we need to use <code>#[macro_export]</code> to mark the macro as exported\nfor usage outside of the module. Now our skeleton looks like:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token namespace\">aoc_2022</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">struct</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">DayXX</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Solution</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">DayXX</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">parse_input</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">AsRef</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Path</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">pathname</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">file_to_string</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">pathname</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">todo!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">todo!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// DayXX::run(\"sample\")</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">DayXX</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// test_sample!(day_XX, DayXX, , );</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-1\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#solution-1\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>Not much to talk about, it is relatively easy to simulate.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-10-cathode-ray-tube\"><a href=\"https://adventofcode.com/2022/day/10\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 10: Cathode-Ray Tube</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#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\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Emulating basic arithmetic operations on a CPU and drawing on CRT based on the\nCPU's accumulator.</p></div></div>\n<p>In this day I have discovered an issue with my design of the <code>Solution</code> trait.\nAnd the issue is caused by different types of <code>Output</code> for the part 1 and part 2.</p>\n<p>Problem is relatively simple and consists of simulating a CPU, I have approached\nit in a following way:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">evaluate_instructions</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">instructions</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Instruction</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    instructions</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">fold</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">State</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">new</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params\">state</span><span class=\"token closure-params punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token closure-params\"> instruction</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            state</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">execute</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">instruction</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> out</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    out</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>We just take the instructions, we have some state of the CPU and we execute the\ninstructions one-by-one. Perfect usage of the <code>fold</code> (or <code>reduce</code> as you may know\nit from other languages).</p>\n<p>You can also see that we have an <code>Output</code> type, so the question is how can we fix\nthat problem. And the answer is very simple and <em>functional</em>. Rust allows you to\nhave an <code>enumeration</code> that can <em>bear</em> some other values apart from the type itself.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>We could've seen something like this with the <code>Result&lt;T, E&gt;</code> type that can be\ndefined as</p><div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">enum</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">E</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Ok</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Err</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">E</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div><h6 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-does-that-mean-though\">What does that mean though?<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#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?\" translate=\"no\">​</a></h6><p>When we have an <code>Ok</code> value, it has the result itself, and when we get an <code>Err</code>\nvalue, it has the error. This also allows us to handle <em>results</em> in a rather\npretty way:</p><div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">match</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">do_something</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Ok</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">println!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"SUCCESS: {}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Err</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">eprintln!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"ERROR: {}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div></div></div>\n<p>My solution has a following outline:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">execute</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> i</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Instruction</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> output</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">State</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// execute the instruction</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// collect results if necessary</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">match</span><span class=\"token plain\"> output </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Part1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">execute_part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">      </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Part2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">execute_part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// return the obtained state</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    new_state</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>You might think that it's a perfectly reasonable thing to do. Yes, <strong>but</strong> notice\nthat the <code>match</code> statement doesn't <em>collect</em> the changes in any way and also we\npass <code>output</code> by <code>&amp;mut</code>, so it is shared across each <em>iteration</em> of the <code>fold</code>.</p>\n<p>The dirty and ingenious thing is that <code>x</code>s are passed by <code>&amp;mut</code> too and therefore\nthey are directly modified by the helper functions. To sum it up and let it sit</p>\n<blockquote>\n<p>We are <strong>collecting</strong> the result <strong>into</strong> an <strong>enumeration</strong> that is <strong>shared</strong>\nacross <strong>all</strong> iterations of <code>fold</code>.</p>\n</blockquote>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-2\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#solution-2\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>Similar to <em>Day 9</em>, but there are some technical details that can get you.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-11-monkey-in-the-middle\"><a href=\"https://adventofcode.com/2022/day/11\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 11: Monkey in the Middle</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#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\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Simulation of monkeys throwing stuff around and measuring your stress levels\nwhile your stuff is being passed around.</p></div></div>\n<p>I think I decided to use regular expressions here for the first time, cause\nparsing the input was a pain.</p>\n<p>Also I didn't expect to implement Euclidean algorithm in Rust…</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-3\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#solution-3\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>Again, we're just running a simulation. Though I must admit it was very easy to\nmake a small technical mistakes that could affect the final results very late.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-12-hill-climbing-algorithm\"><a href=\"https://adventofcode.com/2022/day/12\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 12: Hill Climbing Algorithm</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#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\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Finding shortest path up the hill and also shortest path down to the ground while\nalso rolling down the hill…</p></div></div>\n<p>As I have said in the <em>tl;dr</em>, we are looking for the shortest path, but the start\nand goal differ for the part 1 and 2. So I have decided to refactor my solution\nto a BFS algorithm that takes necessary parameters via functions:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">bfs</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">F</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">G</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    graph</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> start</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Position</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> has_edge</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">F</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> is_target</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">G</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Option</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">F</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Fn</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Position</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Position</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">bool</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">G</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Fn</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Position</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">bool</span><br></span></code></pre></div></div>\n<p>We pass the initial vertex from the caller and everything else is left to the BFS\nalgorithm, based on the <code>has_edge</code> and <code>is_target</code> functions.</p>\n<p>This was easy! And that is not very usual in Rust once you want to pass around\nfunctions. <!-- -->👀</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-4\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#solution-4\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>Looking for the shortest path… Must be Dijkstra, right? <strong>Nope!</strong> Half of the\nReddit got jebaited though. In all fairness, nothing stops you from implementing\nthe Dijkstra's algorithm for finding the shortest path, <strong>but</strong> if you know that\nall connected vertices are in a unit (actually <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>) distance from each other,\nthen you know that running Dijkstra is equivalent to running BFS, only with worse\ntime complexity, because of the priority heap instead of the queue.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-13-distress-signal\"><a href=\"https://adventofcode.com/2022/day/13\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 13: Distress Signal</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#day-13-distress-signal\" class=\"hash-link\" aria-label=\"Direct link to day-13-distress-signal\" title=\"Direct link to day-13-distress-signal\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Processing packets with structured data from the distress signal.</p></div></div>\n<p>You can implement a lot of traits if you want to. It is <em>imperative</em> to implement\nordering on the packets. I had a typo, so I also proceeded to implement a <code>Display</code>\ntrait for debugging purposes:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Display</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Packet</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">fmt</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> f</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token namespace\">std</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token namespace\">fmt</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Formatter</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'_</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token namespace\">std</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token namespace\">fmt</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">match</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Packet</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Integer</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">write!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">f</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"{x}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Packet</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">List</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">lst</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">write!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">f</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"[{}]\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> lst</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">map</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token closure-params\">p</span><span class=\"token closure-params closure-punctuation punctuation\" style=\"color:hsl(119, 34%, 47%)\">|</span><span class=\"token plain\"> </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">format!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"{p}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">join</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\",\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-5\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#solution-5\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>A lot of technical details… Parsing is nasty too…</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-14-regolith-reservoir\"><a href=\"https://adventofcode.com/2022/day/14\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 14: Regolith Reservoir</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#day-14-regolith-reservoir\" class=\"hash-link\" aria-label=\"Direct link to day-14-regolith-reservoir\" title=\"Direct link to day-14-regolith-reservoir\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Let's simulate falling sand grain-by-grain.</p></div></div>\n<p>Again, both parts are relatively similar with minimal changes, so it is a good\nidea to refactor it a bit. Similar approach to the <a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#day-12-hill-climbing-algorithm\" class=\"\">BFS above</a>. Also this is the\nfirst day where I ran into efficiency issues and had to redo my solution to speed\nit up just a bit.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-6\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#solution-6\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>Tedious.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"post-mortem\">Post Mortem<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#post-mortem\" class=\"hash-link\" aria-label=\"Direct link to Post Mortem\" title=\"Direct link to Post Mortem\" translate=\"no\">​</a></h2>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"indexing\">Indexing<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#indexing\" class=\"hash-link\" aria-label=\"Direct link to Indexing\" title=\"Direct link to Indexing\" translate=\"no\">​</a></h3>\n<p>I was asked about the indexing after publishing the blog. And truly it is rather\ncomplicated topic, especially after releasing <code>SliceIndex&lt;I&gt;</code> trait. I couldn't\nleave it be, so I tried to implement the <code>Index</code> and <code>IndexMut</code> trait.</p>\n<div class=\"theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>I have also mentioned that the <code>SliceIndex</code> trait is <code>unsafe</code>, but truth be told,\nonly <em>unsafe</em> part are the 2 methods that are named <code>*unchecked*</code>. Anyways, I will\nbe implementing the <code>Index*</code> traits for now, rather than the <code>SliceIndex</code>.</p></div></div>\n<p>It's relatively straightforward…</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Index</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Copy</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryInto</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryInto</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Error</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Debug</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Index</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">IndexMut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Copy</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryInto</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryInto</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Error</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Debug</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">IndexMut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">index_mut</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>We can see a lot of similarities to the implementation of <code>index</code> and <code>index_mut</code>\nfunctions. In the end, they are 1:1, just wrapped in the trait that provides a\nsyntax sugar for <code>container[idx]</code>.</p>\n<div class=\"theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>I have also switched from using the <code>TryFrom</code> to <code>TryInto</code> trait, since it better\nmatches 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,\nsince it is relatively easy to implement. Just compare the following:</p><div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">trait</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">TryFrom</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Sized</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Error</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">try_from</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">value</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Error</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">trait</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">TryInto</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Sized</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Error</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Error</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div></div></div>\n<p>OK, so we have our trait implemented, we should be able to use <code>container[index]</code>,\nright? Yes… but actually no <!-- -->😦</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">error[E0277]: the type `[std::vec::Vec&lt;i8&gt;]` cannot be indexed by `aoc_2022::Vector2D&lt;usize&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  --&gt; src/bin/day08.rs:26:18</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">26 |         if trees[pos] &gt; tallest {</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |                  ^^^ slice indices are of type `usize` or ranges of `usize`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   = help: the trait `std::slice::SliceIndex&lt;[std::vec::Vec&lt;i8&gt;]&gt;` is not implemented for `aoc_2022::Vector2D&lt;usize&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   = note: required for `std::vec::Vec&lt;std::vec::Vec&lt;i8&gt;&gt;` to implement `std::ops::Index&lt;aoc_2022::Vector2D&lt;usize&gt;&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">error[E0277]: the type `[std::vec::Vec&lt;i8&gt;]` cannot be indexed by `aoc_2022::Vector2D&lt;usize&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  --&gt; src/bin/day08.rs:30:28</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">30 |         max(tallest, trees[pos])</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |                            ^^^ slice indices are of type `usize` or ranges of `usize`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   = help: the trait `std::slice::SliceIndex&lt;[std::vec::Vec&lt;i8&gt;]&gt;` is not implemented for `aoc_2022::Vector2D&lt;usize&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   = note: required for `std::vec::Vec&lt;std::vec::Vec&lt;i8&gt;&gt;` to implement `std::ops::Index&lt;aoc_2022::Vector2D&lt;usize&gt;&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">error[E0277]: the type `[std::vec::Vec&lt;i8&gt;]` cannot be indexed by `aoc_2022::Vector2D&lt;isize&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  --&gt; src/bin/day08.rs:52:28</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">52 |     let max_height = trees[position];</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |                            ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   = help: the trait `std::slice::SliceIndex&lt;[std::vec::Vec&lt;i8&gt;]&gt;` is not implemented for `aoc_2022::Vector2D&lt;isize&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   = note: required for `std::vec::Vec&lt;std::vec::Vec&lt;i8&gt;&gt;` to implement `std::ops::Index&lt;aoc_2022::Vector2D&lt;isize&gt;&gt;`</span><br></span></code></pre></div></div>\n<p>Why? We have it implemented for the slices (<code>[C]</code>), why doesn't it work? Well,\nthe fun part consists of the fact that in other place, where we were using it,\nwe were passing the <code>&amp;[Vec&lt;T&gt;]</code>, but this is coming from a helper functions that\ntake <code>&amp;Vec&lt;Vec&lt;T&gt;&gt;</code> instead. And… we don't implement <code>Index</code> and <code>IndexMut</code> for\nthose. Just for the slices. 🤯 <em>What are we going to do about it?</em></p>\n<p>We can either start copy-pasting or be smarter about it… I choose to be smarter,\nso let's implement a macro! The only difference across the implementations are\nthe types of the outer containers. Implementation doesn't differ <strong>at all</strong>!</p>\n<p>Implementing the macro can be done in a following way:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">macro_rules!</span><span class=\"token plain\"> generate_indices </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$container</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token fragment-specifier punctuation\" style=\"color:hsl(119, 34%, 47%)\">ty</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Index</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$container</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Copy</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryInto</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryInto</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Error</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Debug</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Index</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">IndexMut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">for</span><span class=\"token plain\"> </span><span class=\"token variable\" style=\"color:hsl(221, 87%, 60%)\">$container</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Copy</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">+</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryInto</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">TryInto</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Error</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Debug</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">IndexMut</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">index_mut</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vector2D</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">I</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">Self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">try_into</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">unwrap</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>And now we can simply do</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">generate_indices!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">VecDeque</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">generate_indices!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">generate_indices!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">C</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">// generate_indices!([C; N], const N: usize);</span><br></span></code></pre></div></div>\n<p>The last type (I took the inspiration from the implementations of the <code>Index</code> and\n<code>IndexMut</code> traits) is a bit problematic, because of the <code>const N: usize</code> part,\nwhich I haven't managed to be able to parse. And that's how I got rid of the error.</p>\n<div class=\"theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>If I were to use 2D-indexing over <code>[C; N]</code> slices, I'd probably just go with the\ncopy-paste, cause the cost of this “monstrosity” outweighs the benefits of no DRY.</p></div></div>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"cause-of-the-problem\">Cause of the problem<a href=\"https://blog.mfocko.dev/blog/aoc-2022/2nd-week/#cause-of-the-problem\" class=\"hash-link\" aria-label=\"Direct link to Cause of the problem\" title=\"Direct link to Cause of the problem\" translate=\"no\">​</a></h4>\n<p>This issue is relatively funny. If you don't use any type aliases, just the raw\ntypes, you'll get suggested certain changes by the <em>clippy</em>. For example if you\nconsider the following piece of code</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">get_sum</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">nums</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    nums</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">sum</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> nums </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">vec!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">println!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Sum: {}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">get_sum</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">nums</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>and you run <em>clippy</em> on it, you will get</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">Checking playground v0.0.1 (/playground)</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">warning: writing `&amp;Vec` instead of `&amp;[_]` involves a new object where a slice will do</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"> --&gt; src/main.rs:1:18</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">1 | fn get_sum(nums: &amp;Vec&lt;i32&gt;) -&gt; i32 {</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  |                  ^^^^^^^^^ help: change this to: `&amp;[i32]`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><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:hsl(230, 8%, 24%)\"><span class=\"token plain\">  = note: `#[warn(clippy::ptr_arg)]` on by default</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">warning: `playground` (bin \"playground\") generated 1 warning</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    Finished dev [unoptimized + debuginfo] target(s) in 0.61s</span><br></span></code></pre></div></div>\n<p>However, if you introduce a type alias, such as</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Numbers</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>Then <em>clippy</em> won't say anything, cause there is literally nothing to suggest.\nHowever the outcome is not the same…</p>",
            "url": "https://blog.mfocko.dev/blog/aoc-2022/2nd-week/",
            "title": "2nd week of Advent of Code '22 in Rust",
            "summary": "Surviving second week in Rust.",
            "date_modified": "2022-12-25T23:15:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "advent-of-code",
                "advent-of-code-2022",
                "rust"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/aoc-2022/1st-week/",
            "content_html": "<p>Let's go through the first week of <a href=\"https://adventofcode.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><em>Advent of Code</em></a> in Rust.</p>\n<div class=\"theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>If you wish to have a look at the solutions, you can follow them on my <a href=\"https://gitlab.com/mfocko/advent-of-code-2022\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">GitLab</a>.\nMore specifically in the <a href=\"https://gitlab.com/mfocko/advent-of-code-2022/-/tree/main/src/bin\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>/src/bin/</code></a>.</p></div></div>\n<p>I will try to summarize my experience with using Rust for the AoC. Trying it out\nages ago, I believe it will be <em>pain and suffering</em>, but we will see. For each\nday I will also try to give a tl;dr of the problem, so that you can better imagine\nthe relation to my woes or <!-- -->👍<!-- --> moments.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-1-calorie-counting\"><a href=\"https://adventofcode.com/2022/day/1\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 1: Calorie Counting</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#day-1-calorie-counting\" class=\"hash-link\" aria-label=\"Direct link to day-1-calorie-counting\" title=\"Direct link to day-1-calorie-counting\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>As the name suggests, we get the calories of the food contained in the elves\nbackpacks and we want to choose the elf that has the most food ;)</p></div></div>\n<blockquote>\n<p>Wakey wakey!</p>\n</blockquote>\n<p>Programming in Rust at 6am definitely hits. I've also forgotten to mention how I\nhandle samples. With each puzzle you usually get a sample input and expected\noutput. You can use them to verify that your solution works, or usually doesn't.</p>\n<p>At first I've decided to put asserts into my <code>main</code>, something like</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">assert_eq!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">sample</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">24000</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">info!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Part 1: {}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">assert_eq!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">sample</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">45000</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">info!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Part 2: {}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>However, once you get further, the sample input may take some time to run itself.\nSo in the end, I have decided to turn them into unit tests:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[cfg(test)]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mod</span><span class=\"token plain\"> </span><span class=\"token module-declaration namespace\">tests</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">super</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[test]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">test_part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> sample </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">parse_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"samples/day01.txt\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">assert_eq!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">sample</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">24000</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[test]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">test_part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> sample </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">parse_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"samples/day01.txt\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">assert_eq!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">sample</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">45000</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>And later on I have noticed, it's hard to tell the difference between the days,\nso I further renamed the <code>mod</code> from generic <code>tests</code> to reflect the days.</p>\n<p>Also after finishing the first day puzzle, I have installed an <a href=\"https://github.com/mozilla/sccache\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>sccache</code></a> to\ncache the builds, so that the build time is lower, cause it was kinda unbearable.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#solution\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>Well, it's a pretty simple problem. You just take the input, sum the calories and\nfind the biggest one. However, if we try to generalize to more than the biggest\none, the fun appears. We have few options:</p>\n<ul>\n<li class=\"\">keep all the calories, sort them, take what we need</li>\n<li class=\"\">keep all the calories and use max heap</li>\n<li class=\"\">use min heap and maintain at most N calories that we need</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-2-rock-paper-scissors\"><a href=\"https://adventofcode.com/2022/day/2\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 2: Rock Paper Scissors</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#day-2-rock-paper-scissors\" class=\"hash-link\" aria-label=\"Direct link to day-2-rock-paper-scissors\" title=\"Direct link to day-2-rock-paper-scissors\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>You want to know what score did you achieve while playing <em>Rock Paper Scissors</em>.\nAnd then you want to be strategic about it.</p></div></div>\n<p>Apart from the technical details of the puzzle, it went relatively smooth.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-1\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#solution-1\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>I took relatively naïve approach and then tried to simplify it.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-3-rucksack-reorganization\"><a href=\"https://adventofcode.com/2022/day/3\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 3: Rucksack Reorganization</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#day-3-rucksack-reorganization\" class=\"hash-link\" aria-label=\"Direct link to day-3-rucksack-reorganization\" title=\"Direct link to day-3-rucksack-reorganization\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Let's go reorganize elves' backpacks! Each backpacks has 2 compartments and you\nwant to find the common item among those compartments. Each of them has priority,\nyou care only about the sum.</p></div></div>\n<p>This is the day where I started to fight the compiler and neither of us decided\nto give up. Let's dive into it \\o/</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>Fun fact</div><div class=\"admonitionContent_BuS1\"><p>Fighting the compiler took me 30 minutes.</p></div></div>\n<p>We need to find a common item among 2 collections, that's an easy task, right?\nWe can construct 2 sets and find an intersection:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> top</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> bottom</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">5</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>Now, the first issue that we encounter is caused by the fact that we are using\na slice (the <code>[…]</code>), iterator of that returns <strong>references</strong> to the numbers.\nAnd we get immediately yelled at by the compiler, because the numbers are discarded\nafter running the <code>.collect</code>. To fix this, we can use <code>.into_iter</code>:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> top</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> bottom</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">5</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>This way the numbers will get copied instead of referenced. OK, let's find the\nintersection of those 2 collections:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">println!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Common elements: {:?}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> top</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">bottom</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">Common elements: [3]</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Notice that we need to do <code>&amp;bottom</code>. It explicitly specifies that <code>.intersection</code>\n<strong>borrows</strong> the <code>bottom</code>, i.e. takes an immutable reference to it.</p></div></div>\n<p>That's what we want, right? Looks like it! \\o/</p>\n<p>Next part wants us to find the common element among all of the backpacks. OK, so\nthat should be fairly easy, we have an intersection and we want to find intersection\nover all of them.</p>\n<p>Let's have a look at the type of the <code>.intersection</code></p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">intersection</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">self</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">&nbsp;&nbsp;&nbsp;&nbsp;other</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">S</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Intersection</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token lifetime-annotation symbol\" style=\"color:hsl(5, 74%, 59%)\">'a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">S</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><br></span></code></pre></div></div>\n<p>OK… Huh… But we have an example there!</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">_</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> a</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">b</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>Cool, that's all we need.</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> top</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> bottom</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">5</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">6</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> top_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">5</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">6</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> bottom_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">5</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">6</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">_</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> top</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">bottom</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">println!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Intersection: {:?}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">Intersection: {3, 4}</span><br></span></code></pre></div></div>\n<p>Cool, so let's do the intersection with the <code>top_2</code>:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> top</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> bottom</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">5</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">6</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> top_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">5</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">6</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> bottom_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">5</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">6</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">_</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> top</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">bottom</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">_</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">top_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">println!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Intersection: {:?}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>And we get yelled at by the compiler:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">error[E0308]: mismatched types</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  --&gt; src/main.rs:10:58</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">10 | let intersection: HashSet&lt;_&gt; = intersection.intersection(&amp;top_2).collect();</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |                                             ------------ ^^^^^^ expected `&amp;i32`, found `i32`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |                                             |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |                                             arguments to this function are incorrect</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   |</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">   = note: expected reference `&amp;HashSet&lt;&amp;i32&gt;`</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">              found reference `&amp;HashSet&lt;i32&gt;`</span><br></span></code></pre></div></div>\n<p>/o\\ What the hell is going on here? Well, the funny thing is, that this operation\ndoesn't return the elements themselves, but the references to them and when we pass\nthe third set, it has just the values themselves, without any references.</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>It may seem as a very weird decision, but in fact it makes some sense… It allows\nyou to do intersection of items that may not be possible to copy. Overall this is\na “tax” for having a borrow checker <del>drilling your ass</del> having your back and\nmaking sure you're not doing something naughty that may cause an <strong>undefined</strong>\n<strong>behavior</strong>.</p></div></div>\n<p>To resolve this we need to get an iterator that <strong>clones</strong> the elements:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> top</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> bottom</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">5</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">6</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> top_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">5</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">6</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> bottom_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">4</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">5</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">6</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">into_iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">_</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> top</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">bottom</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">cloned</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">_</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">top_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">cloned</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">HashSet</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token plain\">_</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">bottom_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">cloned</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">collect</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">println!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Intersection: {:?}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> intersection</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">Intersection: {4}</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-2\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#solution-2\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>The approach is pretty simple, if you omit the <em>1on1 with the compiler</em>. You just\nhave some fun with the set operations :)</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-4-camp-cleanup\"><a href=\"https://adventofcode.com/2022/day/4\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 4: Camp Cleanup</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#day-4-camp-cleanup\" class=\"hash-link\" aria-label=\"Direct link to day-4-camp-cleanup\" title=\"Direct link to day-4-camp-cleanup\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Elves are cleaning up the camp and they got overlapping sections to clean up.\nFind how many overlap and can take the day off.</p></div></div>\n<p><a href=\"https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>RangeInclusive</code></a> is your friend not an enemy :)</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-3\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#solution-3\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>Relatively easy, you just need to parse the input and know what you want. Rust's\n<code>RangeInclusive</code> type helped a lot, cause it took care of all abstractions.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-5-supply-stacks\"><a href=\"https://adventofcode.com/2022/day/5\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 5: Supply Stacks</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#day-5-supply-stacks\" class=\"hash-link\" aria-label=\"Direct link to day-5-supply-stacks\" title=\"Direct link to day-5-supply-stacks\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Let's play with stacks of crates.</p></div></div>\n<p>Very easy problem with very annoying input. You can judge yourself:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    [D]</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">[N] [C]</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">[Z] [M] [P]</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"> 1   2   3</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">move 1 from 2 to 1</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">move 3 from 1 to 3</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">move 2 from 2 to 1</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">move 1 from 1 to 2</span><br></span></code></pre></div></div>\n<p>Good luck transforming that into something reasonable :)</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><svg viewBox=\"0 0 12 16\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg></span>Fun fact</div><div class=\"admonitionContent_BuS1\"><p>Took me 40 minutes to parse this reasonably, including fighting the compiler.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-4\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#solution-4\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>For the initial solution I went with a manual solution (as in <em>I have done all</em>\n<em>the work</em>. Later on I have decided to explore the <code>std</code> and interface of the\n<code>std::vec::Vec</code> and found <a href=\"https://doc.rust-lang.org/std/vec/struct.Vec.html#method.split_off\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>split_off</code></a> which takes an index and splits (duh)\nthe vector:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">mut</span><span class=\"token plain\"> vec </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">vec!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> vec2 </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> vec</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">split_off</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">assert_eq!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">vec</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">assert_eq!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">vec2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">3</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>This helped me simplify my solution a lot and also get rid of some <em>edge cases</em>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-6-tuning-trouble\"><a href=\"https://adventofcode.com/2022/day/6\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 6: Tuning Trouble</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#day-6-tuning-trouble\" class=\"hash-link\" aria-label=\"Direct link to day-6-tuning-trouble\" title=\"Direct link to day-6-tuning-trouble\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Finding start of the message in a very weird protocol. Start of the message is\ndenoted by <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>N</mi></mrow><annotation encoding=\"application/x-tex\">N</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.10903em\">N</span></span></span></span> unique consecutive characters.</p></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-5\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#solution-5\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>A lot of different approaches, knowing that we are dealing with input consisting\nsolely of ASCII letters, I bit the bullet and went with sliding window and\nconstructing sets from that window, checking if the set is as big as the window.</p>\n<p>One possible optimization could consist of keeping a bit-vector (i.e. <code>usize</code>\nvariable) of encountered characters and updating it as we go. However this has\na different issue and that is removal of the characters from the left side of the\nwindow. We don't know if the same character is not included later on.</p>\n<p>Other option is to do similar thing, but keeping the frequencies of the letters,\nand again knowing we have only ASCII letters we can optimize by having a vector\nof 26 elements that keeps count for each lowercase letter.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"day-7-no-space-left-on-device\"><a href=\"https://adventofcode.com/2022/day/7\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Day 7: No Space Left On Device</a><a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#day-7-no-space-left-on-device\" class=\"hash-link\" aria-label=\"Direct link to day-7-no-space-left-on-device\" title=\"Direct link to day-7-no-space-left-on-device\" translate=\"no\">​</a></h2>\n<div class=\"theme-admonition theme-admonition-info admonition_xJq3 alert alert--info\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Let's simulate <a href=\"https://www.man7.org/linux/man-pages/man1/du.1.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>du</code></a> to get some stats about our file system and then pinpoint\ndirectories that take a lot of space and should be deleted.</p></div></div>\n<blockquote>\n<p>I was waiting for this moment, and yet it got me!\n<em>imagine me swearing for hours</em></p>\n</blockquote>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"solution-6\">Solution<a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#solution-6\" class=\"hash-link\" aria-label=\"Direct link to Solution\" title=\"Direct link to Solution\" translate=\"no\">​</a></h3>\n<p>We need to “<em>build</em>” a file system from the input that is given in a following form:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">$ cd /</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">$ ls</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">dir a</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">14848514 b.txt</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">8504156 c.dat</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">dir d</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">$ cd a</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">$ ls</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">dir e</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">29116 f</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">2557 g</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">62596 h.lst</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">$ cd e</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">$ ls</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">584 i</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">$ cd ..</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">$ cd ..</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">$ cd d</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">$ ls</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">4060174 j</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">8033020 d.log</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">5626152 d.ext</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">7214296 k</span><br></span></code></pre></div></div>\n<p>There are few ways in which you can achieve this and also you can assume some\npreconditions, but why would we do that, right? :)</p>\n<p>You can “slap” this in either <a href=\"https://doc.rust-lang.org/std/collections/struct.HashMap.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>HashMap</code></a> or <a href=\"https://doc.rust-lang.org/std/collections/struct.BTreeMap.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>BTreeMap</code></a> and call it a day.\nAnd that would be boring…</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p><code>BTreeMap</code> is quite fitting for this, don't you think?</p></div></div>\n<p>I always wanted to try allocation on heap in Rust, so I chose to implement a tree.\nI fought with the <code>Box&lt;T&gt;</code> for some time and was losing…</p>\n<p>Then I looked up some implementations of trees or linked lists and decided to try\n<code>Rc&lt;Cell&lt;T&gt;&gt;</code>. And I got my <em>ass whopped</em> by the compiler once again. /o\\</p>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p><code>Box&lt;T&gt;</code> represents a dynamically allocated memory on heap. It is a single pointer,\nyou can imagine this as <code>std::unique_ptr&lt;T&gt;</code> in C++.</p><p><code>Rc&lt;T&gt;</code> represents a dynamically allocated memory on heap. On top of that it is\n<em>reference counted</em> (that's what the <code>Rc</code> stands for). You can imagine this as\n<code>std::shared_ptr&lt;T&gt;</code> in C++.</p><p>Now the fun stuff. Neither of them lets you <strong>mutate</strong> the contents of the memory.</p><p><code>Cell&lt;T&gt;</code> allows you to mutate the memory. Can be used reasonably with types that\ncan be copied, because the memory safety is guaranteed by copying the contents\nwhen there is more than one <strong>mutable</strong> reference to the memory.</p><p><code>RefCell&lt;T&gt;</code> is similar to the <code>Cell&lt;T&gt;</code>, but the borrowing rules (how many mutable\nreferences are present) are checked dynamically.</p><p>So in the end, if you want something like <code>std::shared_ptr&lt;T&gt;</code> in Rust, you want\nto have <code>Rc&lt;RefCell&lt;T&gt;&gt;</code>.</p></div></div>\n<p>So, how are we going to represent the file system then? We will use an enumeration,\nhehe, which is an algebraic data type that can store some stuff in itself <!-- -->😩</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">FileHandle</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Rc</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">RefCell</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">AocFile</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token attribute attr-name\" style=\"color:hsl(35, 99%, 36%)\">#[derive(Debug)]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">enum</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">AocFile</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">File</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">usize</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Directory</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">BTreeMap</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">FileHandle</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>Let's go over it! <code>FileHandle</code> represents dynamically allocated <code>AocFile</code>, not\nmuch to discuss. What does the <code>#[derive(Debug)]</code> do though? It lets us to print\nout the value of that enumeration, it's derived, so it's not as good as if we had\nimplemented it ourselves, but it's good enough for debugging, hence the name.</p>\n<p>Now to the fun part! <code>AocFile</code> value can be represented in two ways:</p>\n<ul>\n<li class=\"\"><code>File(usize)</code>, e.g. <code>AocFile::File(123)</code> and we can pattern match it, if we\nneed to</li>\n<li class=\"\"><code>Directory(BTreeMap&lt;String, FileHandle&gt;)</code> will represent the directory and will\ncontain map matching the name of the files (or directories) within to their\nrespective file handles</li>\n</ul>\n<p>I will omit the details about constructing this file system, cause there are a lot\nof technicalities introduced by the nature of the input. However if you are\ninterested, you can have a look at my solution.</p>\n<p>We need to find small enough directories and also find the smallest directory that\nwill free enough space. Now the question is, how could we do that. And there are\nmultiple ways I will describe.</p>\n<p>I have chosen to implement <a href=\"https://en.wikipedia.org/wiki/Catamorphism#Tree_fold\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><em>tree catamorphism</em></a> <!-- -->😩<!-- -->. It is basically a fold\nover a tree data structure. We descent down into the leaves and propagate computed\nresults all the way to the root. You can also notice that this approach is very\nsimilar to <em>dynamic programming</em>, we find overlapping sections of the computation\nand try to minimize the additional work (in this case: we need to know sizes of\nour descendants, but we have already been there).</p>\n<p>Another approach that has been suggested to me few days later is running DFS on\nthe graph. And, funnily enough, we would still need to combine what we found in\nthe branches where we descent. So in the end, it would work very similarly to my\nsolution.</p>\n<p>One of the more exotic options would be precomputing the required information at\nthe same time as parsing. That could be done by adding additional fields to the\nnodes which would allow storing such information and updating it as we construct\nthe file system.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"post-mortem\">Post Mortem<a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#post-mortem\" class=\"hash-link\" aria-label=\"Direct link to Post Mortem\" title=\"Direct link to Post Mortem\" translate=\"no\">​</a></h2>\n<p>Things that have been brought up in the discussion later on.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"rct-vs-rcrefcellt\"><code>Rc&lt;T&gt;</code> vs <code>Rc&lt;RefCell&lt;T&gt;&gt;</code><a href=\"https://blog.mfocko.dev/blog/aoc-2022/1st-week/#rct-vs-rcrefcellt\" class=\"hash-link\" aria-label=\"Direct link to rct-vs-rcrefcellt\" title=\"Direct link to rct-vs-rcrefcellt\" translate=\"no\">​</a></h3>\n<p>It has been brought up that I have a contradicting statement regarding the\ndynamically allocated memory. Specifically:</p>\n<ul>\n<li class=\"\">You can imagine <code>Rc&lt;T&gt;</code> as an <code>std::shared_ptr&lt;T&gt;</code> (in C++)</li>\n<li class=\"\">When you want an equivalent of <code>std::shared_ptr&lt;T&gt;</code>, you want to use\n<code>Rc&lt;RefCell&lt;T&gt;&gt;</code></li>\n</ul>\n<p>Now, in Rust it is a bit more complicated, because the type that represents the\n“shared pointer” is <code>Rc&lt;T&gt;</code>. What <code>RefCell&lt;T&gt;</code> does is making sure that there is\nonly one “owner” of a mutable reference at a time (and dynamically, as opposed\nto the <code>Cell&lt;T&gt;</code>).</p>\n<p>Therefore to be precise and correct about the equivalents of <code>std::shared_ptr&lt;T&gt;</code>\nin Rust, we can say that</p>\n<ul>\n<li class=\"\"><code>Rc&lt;T&gt;</code> is an equivalent of a <code>const std::shared_ptr&lt;T&gt;</code>,</li>\n<li class=\"\">and <code>Rc&lt;RefCell&lt;T&gt;&gt;</code> is an equivalent of a <code>std::shared_ptr&lt;T&gt;</code>.</li>\n</ul>\n<p>You can easily see that they only differ in the mutability. (And even that is not\nas simple as it seems, because there is also <code>Cell&lt;T&gt;</code>)</p>",
            "url": "https://blog.mfocko.dev/blog/aoc-2022/1st-week/",
            "title": "1st week of Advent of Code '22 in Rust",
            "summary": "Surviving first week in Rust.",
            "date_modified": "2022-12-15T01:15:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "advent-of-code",
                "advent-of-code-2022",
                "rust"
            ]
        },
        {
            "id": "https://blog.mfocko.dev/blog/aoc-2022/intro/",
            "content_html": "<p>Let's talk about the preparations for this year's <a href=\"https://adventofcode.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><em>Advent of Code</em></a>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"choosing-a-language\">Choosing a language<a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#choosing-a-language\" class=\"hash-link\" aria-label=\"Direct link to Choosing a language\" title=\"Direct link to Choosing a language\" translate=\"no\">​</a></h2>\n<p>When choosing a language for AoC, you usually want a language that gives you a\nquick feedback which allows you to iterate quickly to the solution of the puzzle.\nOne of the most common choices is Python, many people also use JavaScript or Ruby.</p>\n<p>Given the competitive nature of the AoC and popularity among competitive programming,\nC++ might be also a very good choice. Only if you are familiar with it, I guess…</p>\n<p>If you want a challenge, you might also choose to rotate the languages each day.\nThough I prefer to use only one language.</p>\n<p>For this year I have been deciding between <em>Rust</em>, <em>C++</em> and <em>Pascal</em> or <em>Ada</em>.</p>\n<p>I have tried Rust last year and have survived with it for 3 days and then gave\nup and switched to <em>Kotlin</em>, which was pretty good given it is “Java undercover”.\nI pretty much like the ideas behind Rust, I am not sure about the whole cult and\nimplementation of those ideas though. After some years with C/C++, I would say\nthat Rust feels <em>too safe</em> for my taste and tries to “<em>punish me</em>” even for the\nmost trivial things.</p>\n<p>C++ is a very robust, but also comes with a wide variety of options providing you\nthe ability to shoot yourself in the leg. I have tried to solve few days of previous\nAdvent of Code events, it was <em>relatively easy</em> to solve the problems in C++, given\nthat I do not admit writing my own iterator for <code>enumerate</code>…</p>\n<p>Pascal or Ada were meme choices :) Ada is heavily inspired by Pascal and has a\npretty nice standard library that offers enough to be able to quickly solve some\nproblems in it. However the toolkit is questionable :/</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"choosing-libraries\">Choosing libraries<a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#choosing-libraries\" class=\"hash-link\" aria-label=\"Direct link to Choosing libraries\" title=\"Direct link to Choosing libraries\" translate=\"no\">​</a></h2>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"preparations-for-rust\">Preparations for Rust<a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#preparations-for-rust\" class=\"hash-link\" aria-label=\"Direct link to Preparations for Rust\" title=\"Direct link to Preparations for Rust\" translate=\"no\">​</a></h2>\n<p>All of the sources, later on including solutions, can be found at my\n<a href=\"https://gitlab.com/mfocko/advent-of-code-2022\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">GitLab</a>.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"toolkit\">Toolkit<a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#toolkit\" class=\"hash-link\" aria-label=\"Direct link to Toolkit\" title=\"Direct link to Toolkit\" translate=\"no\">​</a></h3>\n<p>Since we are using Rust, we are going to use a <a href=\"https://doc.rust-lang.org/cargo/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Cargo</a> and more than likely VSCode\nwith <a href=\"https://rust-analyzer.github.io/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>rust-analyzer</code></a>. Because of my choice of libraries, we will also introduce\na <code>.envrc</code> file that can be used by <a href=\"https://direnv.net/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>direnv</code></a>, which allows you to set specific\nenvironment variables when you enter a directory. In our case, we will use</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"># to show nice backtrace when using the color-eyre</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token builtin class-name\" style=\"color:hsl(35, 99%, 36%)\">export</span><span class=\"token plain\"> </span><span class=\"token assign-left variable\" style=\"color:hsl(221, 87%, 60%)\">RUST_BACKTRACE</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"># to catch logs generated by tracing</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token builtin class-name\" style=\"color:hsl(35, 99%, 36%)\">export</span><span class=\"token plain\"> </span><span class=\"token assign-left variable\" style=\"color:hsl(221, 87%, 60%)\">RUST_LOG</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\">trace</span><br></span></code></pre></div></div>\n<p>And for the one of the most obnoxious things ever, we will use a script to download\nthe inputs instead of “<em>clicking, opening and copying to a file</em>”<sup><a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#user-content-fn-1-793a30\" id=\"user-content-fnref-1-793a30\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">1</a></sup>. There is\nno need to be <em>fancy</em>, so we will adjust Python script by Martin<sup><a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#user-content-fn-2-793a30\" id=\"user-content-fnref-2-793a30\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">2</a></sup>.</p>\n<div class=\"language-py codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-py codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">#!/usr/bin/env python3</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">import</span><span class=\"token plain\"> datetime</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">import</span><span class=\"token plain\"> yaml</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">import</span><span class=\"token plain\"> requests</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">import</span><span class=\"token plain\"> sys</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">load_config</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">with</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:hsl(119, 34%, 47%)\">open</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"env.yaml\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"r\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> f</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        js </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> yaml</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">load</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">f</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> Loader</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\">yaml</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">Loader</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> js</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"session\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> js</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"year\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">get_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">session</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> year</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> day</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">return</span><span class=\"token plain\"> requests</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">get</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token string-interpolation string\" style=\"color:hsl(119, 34%, 47%)\">f\"https://adventofcode.com/</span><span class=\"token string-interpolation interpolation punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token string-interpolation interpolation\">year</span><span class=\"token string-interpolation interpolation punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token string-interpolation string\" style=\"color:hsl(119, 34%, 47%)\">/day/</span><span class=\"token string-interpolation interpolation punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token string-interpolation interpolation\">day</span><span class=\"token string-interpolation interpolation punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token string-interpolation string\" style=\"color:hsl(119, 34%, 47%)\">/input\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        cookies</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"session\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> session</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        headers</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"User-Agent\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"{repo} by {mail}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token builtin\" style=\"color:hsl(119, 34%, 47%)\">format</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                repo</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"gitlab.com/mfocko/advent-of-code-2022\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">                mail</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"me@mfocko.xyz\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">content</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">decode</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"utf-8\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    day </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> datetime</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">datetime</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">now</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">day</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:hsl(119, 34%, 47%)\">len</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">sys</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">argv</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        day </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> sys</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">argv</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">[</span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">]</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    session</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> year </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> load_config</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    problem_input </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> get_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">session</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> year</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> day</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">with</span><span class=\"token plain\"> </span><span class=\"token builtin\" style=\"color:hsl(119, 34%, 47%)\">open</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string-interpolation string\" style=\"color:hsl(119, 34%, 47%)\">f\"./inputs/day</span><span class=\"token string-interpolation interpolation punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token string-interpolation interpolation\">day</span><span class=\"token string-interpolation interpolation punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token string-interpolation interpolation format-spec\">&gt;02</span><span class=\"token string-interpolation interpolation punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token string-interpolation string\" style=\"color:hsl(119, 34%, 47%)\">.txt\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"w\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> f</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        f</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token plain\">write</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">problem_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">if</span><span class=\"token plain\"> __name__ </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">==</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"__main__\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><br></span></code></pre></div></div>\n<p>If the script is called without any arguments, it will deduce the day from the\nsystem, so we do not need to change the day every morning. It also requires a\nconfiguration file:</p>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\"># env.yaml</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:hsl(35, 99%, 36%)\">session</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> ‹your session cookie›</span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:hsl(35, 99%, 36%)\">year</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:hsl(35, 99%, 36%)\">2022</span><br></span></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"libraries\">Libraries<a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#libraries\" class=\"hash-link\" aria-label=\"Direct link to Libraries\" title=\"Direct link to Libraries\" translate=\"no\">​</a></h3>\n<p>Looking at the list of the libraries, I have chosen “a lot” of them. Let's walk\nthrough each of them.</p>\n<p><a href=\"https://crates.io/crates/tracing\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>tracing</code></a> and <a href=\"https://crates.io/crates/tracing-subscriber\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>tracing-subscriber</code></a> are the crates that can be used for tracing\nand logging of your Rust programs, there are also other crates that can help you\nwith providing backtrace to the Sentry in case you have deployed your application\nsomewhere and you want to watch over it. In our use case we will just utilize the\nmacros for debugging in the terminal.</p>\n<p><a href=\"https://crates.io/crates/thiserror\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>thiserror</code></a>, <a href=\"https://crates.io/crates/anyhow\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>anyhow</code></a> and <a href=\"https://crates.io/crates/color-eyre\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>color-eyre</code></a> are used for error reporting.\n<code>thiserror</code> is a very good choice for libraries, cause it extends the <code>Error</code>\nfrom the <code>std</code> and allows you to create more convenient error types. Next is\n<code>anyhow</code> which kinda builds on top of the <code>thiserror</code> and provides you with simpler\nerror handling in binaries<sup><a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#user-content-fn-3-793a30\" id=\"user-content-fnref-3-793a30\" data-footnote-ref=\"true\" aria-describedby=\"footnote-label\" class=\"anchorTargetStickyNavbar_Vzrq\">3</a></sup>. And finally we have <code>color-eyre</code> which, as I found\nout later, is a colorful (<em>wink wink</em>) extension of <code>eyre</code> which is fork of <code>anyhow</code>\nwhile supporting customized reports.</p>\n<p>In the end I have decided to remove <code>thiserror</code> and <code>anyhow</code>, since first one is\nsuitable for libraries and the latter was basically fully replaced by <code>{color-,}eyre</code>.</p>\n<p><a href=\"https://crates.io/crates/regex\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>regex</code></a> and <a href=\"https://crates.io/crates/lazy_static\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>lazy_static</code></a> are a very good and also, I hope, self-explanatory\ncombination. <code>lazy_static</code> allows you to have static variables that must be initialized\nduring runtime.</p>\n<p><a href=\"https://crates.io/crates/itertools\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>itertools</code></a> provides some nice extensions to the iterators from the <code>std</code>.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"my-own-library\">My own “library”<a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#my-own-library\" class=\"hash-link\" aria-label=\"Direct link to My own “library”\" title=\"Direct link to My own “library”\" translate=\"no\">​</a></h3>\n<p>When creating the crate for this year's Advent of Code, I have chosen a library\ntype. Even though standard library is huge, some things might not be included and\nalso we can follow <em>KISS</em>. I have 2 modules that my “library” exports, one for\nparsing and one for 2D vector (that gets used quite often during Advent of Code).</p>\n<p>Key part is, of course, processing the input and my library exports following\nfunctions that get used a lot:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">/// Reads file to the string.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">file_to_string</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">AsRef</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Path</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">pathname</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">/// Reads file and returns it as a vector of characters.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">file_to_chars</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">AsRef</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Path</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">pathname</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">char</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">/// Reads file and returns a vector of parsed structures. Expects each structure</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">/// on its own line in the file. And `T` needs to implement `FromStr` trait.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">file_to_structs</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">AsRef</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Path</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">FromStr</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">pathname</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">FromStr</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Err</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Debug</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">/// Converts iterator over strings to a vector of parsed structures. `T` needs</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">/// to implement `FromStr` trait and its error must derive `Debug` trait.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">strings_to_structs</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">FromStr</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">  iter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">impl</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Iterator</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Item</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">where</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">T</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">as</span><span class=\"token plain\"> </span><span class=\"token namespace\">std</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">str</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">FromStr</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Err</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token namespace\">std</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token namespace\">fmt</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Debug</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">U</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Deref</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Target</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">str</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:hsl(230, 4%, 64%)\">/// Reads file and returns it as a vector of its lines.</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">pub</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">file_to_lines</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">AsRef</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Path</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">pathname</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">P</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Vec</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<p>As for the vector, I went with a rather simple implementation that allows only\naddition of the vectors for now and accessing the elements via functions <code>x()</code>\nand <code>y()</code>. Also the vector is generic, so we can use it with any numeric type we\nneed.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"skeleton\">Skeleton<a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#skeleton\" class=\"hash-link\" aria-label=\"Direct link to Skeleton\" title=\"Direct link to Skeleton\" translate=\"no\">​</a></h3>\n<p>We can also prepare a template to quickly bootstrap each of the days. We know\nthat each puzzle has 2 parts, which means that we can start with 2 functions that\nwill solve them.</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">part1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">todo!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">part2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">todo!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>Both functions take reference to the input and return some output (in majority\nof puzzles, it is the same type). <code>todo!()</code> can be used as a nice placeholder,\nit also causes a panic when reached and we could also provide some string with\nan explanation, e.g. <code>todo!(\"part 1\")</code>. We have not given functions a specific\ntype and to avoid as much copy-paste as possible, we will introduce type aliases.</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><br></span></code></pre></div></div>\n<div class=\"theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>This allows us to quickly adjust the types only in one place without the need to\ndo <em>regex-replace</em> or replace them manually.</p></div></div>\n<p>For each day we get a personalized input that is provided as a text file. Almost\nall the time, we would like to get some structured type out of that input, and\ntherefore it makes sense to introduce a new function that will provide the parsing\nof the input.</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">parse_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">path</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">str</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">todo!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>This “parser” will take a path to the file, just in case we would like to run the\nsample instead of input.</p>\n<p>OK, so now we can write a <code>main</code> function that will take all of the pieces and\nrun them.</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> input </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">parse_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"inputs/dayXX.txt\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">println!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Part 1: {}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">println!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Part 2: {}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>This would definitely do :) But we have installed a few libraries and we want to\nuse them. In this part we are going to utilize <em><a href=\"https://crates.io/crates/tracing\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>tracing</code></a></em> (for tracing, duh…)\nand <em><a href=\"https://crates.io/crates/color-eyre\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>color-eyre</code></a></em> (for better error reporting, e.g. from parsing).</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token namespace\">tracing_subscriber</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">fmt</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">with_env_filter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">EnvFilter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from_default_env</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">with_target</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token boolean\" style=\"color:hsl(35, 99%, 36%)\">false</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">with_file</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token boolean\" style=\"color:hsl(35, 99%, 36%)\">true</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">with_line_number</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token boolean\" style=\"color:hsl(35, 99%, 36%)\">true</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">without_time</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">compact</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">init</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token namespace\">color_eyre</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">install</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">?</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> input </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">parse_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"inputs/dayXX.txt\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">info!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Part 1: {}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">info!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Part 2: {}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Ok</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<p>The first statement will set up tracing and configure it to print out the logs to\nterminal, based on the environment variable. We also change the formatting a bit,\nsince we do not need all the <em>fancy</em> features of the logger. Pure initialization\nwould get us logs like this:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">2022-12-11T19:53:19.975343Z  INFO day01: Part 1: 0</span><br></span></code></pre></div></div>\n<p>However after running that command, we will get the following:</p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"> INFO src/bin/day01.rs:35: Part 1: 0</span><br></span></code></pre></div></div>\n<p>And the <code>color_eyre::install()?</code> is quite straightforward. We just initialize the\nerror reporting by <em>color eyre</em>.</p>\n<div class=\"theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning\"><div class=\"admonitionHeading_Gvgb\"><span class=\"admonitionIcon_Rf37\"><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_BuS1\"><p>Notice that we had to add <code>Ok(())</code> to the end of the function and adjust the\nreturn type of the <code>main</code> to <code>Result&lt;()&gt;</code>. It is caused by the <em>color eyre</em> that\ncan be installed only once and therefore it can fail, that is how we got the <code>?</code>\nat the end of the <code>::install</code> which <em>unwraps</em> the <strong>»result«</strong> of the installation.</p></div></div>\n<p>Overall we will get to a template like this:</p>\n<div class=\"language-rust codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-rust codeBlock_bY9V thin-scrollbar\" style=\"background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)\"><code class=\"codeBlockLines_e6Vv\"><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token namespace\">aoc_2022</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">*</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token namespace\">color_eyre</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token namespace\">eyre</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token namespace\">tracing</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token plain\">info</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">use</span><span class=\"token plain\"> </span><span class=\"token namespace\">tracing_subscriber</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">EnvFilter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">String</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">type</span><span class=\"token plain\"> </span><span class=\"token type-definition class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">i32</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">parse_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">path</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">str</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">todo!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">part1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">todo!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">part2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">:</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Output</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">todo!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">fn</span><span class=\"token plain\"> </span><span class=\"token function-definition function\" style=\"color:hsl(221, 87%, 60%)\">main</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">-&gt;</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Result</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&lt;</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">{</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token namespace\">tracing_subscriber</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">fmt</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">with_env_filter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">EnvFilter</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">from_default_env</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">with_target</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token boolean\" style=\"color:hsl(35, 99%, 36%)\">false</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">with_file</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token boolean\" style=\"color:hsl(35, 99%, 36%)\">true</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">with_line_number</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token boolean\" style=\"color:hsl(35, 99%, 36%)\">true</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">without_time</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">compact</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">.</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">init</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token namespace\">color_eyre</span><span class=\"token namespace punctuation\" style=\"color:hsl(119, 34%, 47%)\">::</span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">install</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">?</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:hsl(301, 63%, 40%)\">let</span><span class=\"token plain\"> input </span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">parse_input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"inputs/dayXX.txt\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">info!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Part 1: {}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_1</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token macro property\" style=\"color:hsl(5, 74%, 59%)\">info!</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token string\" style=\"color:hsl(119, 34%, 47%)\">\"Part 2: {}\"</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">,</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:hsl(221, 87%, 60%)\">part_2</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token operator\" style=\"color:hsl(221, 87%, 60%)\">&amp;</span><span class=\"token plain\">input</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">;</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\">    </span><span class=\"token class-name\" style=\"color:hsl(35, 99%, 36%)\">Ok</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">(</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">)</span><span class=\"token plain\"></span><br></span><span class=\"token-line\" style=\"color:hsl(230, 8%, 24%)\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:hsl(119, 34%, 47%)\">}</span><br></span></code></pre></div></div>\n<!-- -->\n<section data-footnotes=\"true\" class=\"footnotes\"><h2 class=\"anchor anchorTargetStickyNavbar_Vzrq sr-only\" id=\"footnote-label\">Footnotes<a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#footnote-label\" class=\"hash-link\" aria-label=\"Direct link to Footnotes\" title=\"Direct link to Footnotes\" translate=\"no\">​</a></h2>\n<ol>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-1-793a30\">\n<p>Copy-pasting might be a relaxing thing to do, but you can also discover\nnasty stuff about your PC. See <a href=\"https://www.reddit.com/r/adventofcode/comments/zb98pn/comment/iyq0ono\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">this Reddit post and the comment</a>. <a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#user-content-fnref-1-793a30\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-2-793a30\">\n<p><a href=\"https://github.com/martinjonas\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">GitHub profile</a> <a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#user-content-fnref-2-793a30\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n<li class=\"anchorTargetStickyNavbar_Vzrq\" id=\"user-content-fn-3-793a30\">\n<p>Even though you can use it even for libraries, but handling errors from\nlibraries using <code>anyhow</code> is nasty… You will be the stinky one ;) <a href=\"https://blog.mfocko.dev/blog/aoc-2022/intro/#user-content-fnref-3-793a30\" data-footnote-backref=\"\" aria-label=\"Back to reference 3\" class=\"data-footnote-backref\">↩</a></p>\n</li>\n</ol>\n</section>",
            "url": "https://blog.mfocko.dev/blog/aoc-2022/intro/",
            "title": "Advent of Code '22 in Rust",
            "summary": "Preparing for Advent of Code '22.",
            "date_modified": "2022-12-14T21:45:00.000Z",
            "author": {
                "name": "Matej Focko",
                "url": "https://gitlab.com/mfocko"
            },
            "tags": [
                "advent-of-code",
                "advent-of-code-2022",
                "rust"
            ]
        }
    ]
}