jverkamp.comhttps://blog.jverkamp.com/Recent content on jverkamp.comHugo -- gohugo.ioen-usWed, 12 Feb 2025 00:00:00 +0000A kitchen calendar display running on an Orange Pi Zero 2Whttps://blog.jverkamp.com/home-automation/2025-02-12-kitchen-calendar-display/Wed, 12 Feb 2025 00:00:00 +0000https://blog.jverkamp.com/home-automation/2025-02-12-kitchen-calendar-display/<p><img src="final-display.jpg" alt="The final display on the wall"></p> <p>I&rsquo;ve been on a home automation kick for the last little while, so what better time than to dust off an old project and put up a home / family dashboard in the kitchen/dining room!</p> <p>Previously, I had this running off a FireTV and <a href="https://magicmirror.builders/" target="_blank" rel="noopener">MagicMirror</a>. This worked well enough&hellip; but oh man is the FireTV browser terrible. Plus I had to do some crazy things to get it to stay on and never could get it to launch right back into the display on a power outage. So now we have version 2!</p> <p>In the end, I ended up with:</p> <ul> <li>An <a href="http://www.orangepi.org/" target="_blank" rel="noopener">Orange Pi</a> Zero 2W for the brains</li> <li><a href="https://www.armbian.com/" target="_blank" rel="noopener">Armbian</a> for the operating system</li> <li><a href="https://www.chromium.org/Home/" target="_blank" rel="noopener">Chromium</a> as the browser (I did try Firefox first&hellip;)</li> <li><a href="https://www.home-assistant.io/" target="_blank" rel="noopener">Home Assistant</a> for the data, remote control, and UI <ul> <li><a href="https://github.com/j-a-n/lovelace-wallpanel" target="_blank" rel="noopener">WallPanel</a> to hide the side/top bar</li> <li><a href="#home-assistant-browser-mod">Browser Mod</a> for remote control</li> </ul> </li> </ul> <p>Not too bad.</p>The Southern Book Club's Guide to Slaying Vampireshttps://blog.jverkamp.com/2025/02/11/the-southern-book-clubs-guide-to-slaying-vampires/Tue, 11 Feb 2025 00:00:00 +0000https://blog.jverkamp.com/2025/02/11/the-southern-book-clubs-guide-to-slaying-vampires/<p>If I had a nickel for every book I&rsquo;d read recently where I went into it not really knowing much more than the cover and title and suddenly <em>horror novel</em>, I&rsquo;d have two nickels. Which isn&rsquo;t a lot, but it&rsquo;s weird that it happened twice.</p> <blockquote> <p><em>Fried Green Tomatoes</em> and <em>Steel Magnolias</em> meet <em>Dracula</em> in this Southern-flavored supernatural thriller set in the &rsquo;90s about a women&rsquo;s book club that must protect its suburban community from a mysterious and handsome stranger who turns out to be a blood-sucking fiend.</p> </blockquote> <p>Which probably should have clued me in.</p> <p>It&rsquo;s a fascinating story that starts out fairly tame. A southern woman settled into a life of housewife&ndash;a life of long days, unthanked by her family.</p> <blockquote> <p>“Why do you pretend what we do is nothing?” she asked. “Every day, all the chaos and messiness of life happens and every day we clean it all up. Without us, they would just wallow in filth and disorder and nothing of any consequence would ever get done. Who taught you to sneer at that? I’ll tell you who. Someone who took their mother for granted.”</p> </blockquote> <p>And to brighten her days&hellip;</p> <blockquote> <p>Sometimes she craved a little danger. And that was why she had book club.</p> </blockquote> <p>That is, until a strange man moves in next door. With a mysterious aversion to sunlight.</p> <p>Uh huh.</p> <p>At some point, the book really gets into that &lsquo;runaway freight train&rsquo; feeling. There are some serious body horror scenes in this book and it gets increasingly dark. I mean, it started with biting an ear off, but it goes quite a bit further than that&hellip;</p> <p>Yeah, definitely a horror novel.</p> <p>Overall, I enjoyed it. The American South housewife theme isn&rsquo;t something I read overly much and it it&rsquo;s interesting counterpoint to the vampiric horror. They&rsquo;re both great examples of &lsquo;pretty and polite on the surface&ndash;and absolutely <em>not</em> underneath&rsquo;.</p> <p>Worth a read, I&rsquo;d say.</p>Foxglove Summerhttps://blog.jverkamp.com/2025/02/09/foxglove-summer/Sun, 09 Feb 2025 00:00:00 +0000https://blog.jverkamp.com/2025/02/09/foxglove-summer/<blockquote> <p>We trooped off behind her into waist high bracken, down something that was not so much a path as a statistical variation in the density of the undergrowth.</p> </blockquote> <p>Tne one where Peter goes to the country.</p> <blockquote> <p>I wondered just when I’d become “the starling” and why everyone who was anyone in the supernatural community had such a problem with proper nouns.</p> </blockquote> <p>And he&rsquo;s so out of his element.</p> <p>There are two children missing and it just so happens that one of Nightingale&rsquo;s former colleagues is in the area. So of course Peter has to go check in on him&hellip; and gets entirely too involved in what does (of course) end up being something in the Folly&rsquo;s department.</p> <blockquote> <p>“What the hell is that?” he asked.</p> <p>“It’s a magic spell,” I said, and Beverley snorted.</p> <p>“Show off,” she said.</p> <p>“I said I was going to do magic,” I said.</p> <p>“But . . .” Dominic floundered around for a bit before pointing at me accusingly. “You said that there’s weird shit, but it normally turns out to have a rational explanation.”</p> <p>“It does,” said Beverley. “The explanation is a wizard did it.”</p> <p>“That’s my line,” I said.</p> </blockquote> <p>I do like the &lsquo;half in the open&rsquo; stance that this series takes to magic. Most people don&rsquo;t know or care that magic is real, but that doesn&rsquo;t mean that Peter can&rsquo;t occasionally show off and actually use his tools for what they are&hellip;</p> <blockquote> <p>There’s nothing quite like Latin for disguising the fact that you’re making it up as you go along.</p> </blockquote> <p>Such as they are.</p> <p>Characterwise, I really do like seeing Beverly again. She totally has a point that Peter basically ignored her for a book&hellip; well, not this time around. And there are going to be reprecussions of that, just you wait.</p> <p>But not for the moment.</p> <p>What we do get is a mystery wrapped up in even more slowly extending worldbuilding. Now we know a bit more about the Rivers and more than the very little we knew about the Fae. And of all the things&hellip;</p> <blockquote> <p>“Mind you,” said Dominic, “when it comes to finding new ways to get themselves killed, sheep are bloody geniuses.”</p> </blockquote> <p>Didn&rsquo;t <a href="https://blog.jverkamp.com/reviews/authors/charles-stross/">Charles Stross</a> go a similar route in <a href="https://blog.jverkamp.com/2015/07/05/equoid/">Equoid</a> (spoilers)? There&rsquo;s about a year between the two.</p> <p>Overall, I enjoyed the story, it was a neat way to expand the setting. The ending was &hellip; weak. It felt like things just suddenly wrapped up right when they were getting interesting, which is a bit annoying. Onward!</p>Spider-Gwen, Vol. 6: The Life of Gwen Stacyhttps://blog.jverkamp.com/2025/02/09/spider-gwen-vol.-6-the-life-of-gwen-stacy/Sun, 09 Feb 2025 00:00:00 +0000https://blog.jverkamp.com/2025/02/09/spider-gwen-vol.-6-the-life-of-gwen-stacy/<p><img src="https://blog.jverkamp.com/embeds/books/attachments/spider-gwen-2015-v6-textbundle-77a37a.jpeg" alt=""></p> <p>Gwens.</p> <p><img src="https://blog.jverkamp.com/embeds/books/attachments/spider-gwen-2015-v6-textbundle-252f67.jpeg" alt=""></p> <p>Looking for help.</p> <p><img src="https://blog.jverkamp.com/embeds/books/attachments/spider-gwen-2015-v6-textbundle-26f3d8.jpeg" alt=""></p> <p>And all for a secret (even to the Watchers…) cabal of Gwens.</p> <p>Man comics sometimes. This is a hit more cosmic than I want right now.</p> <p>And the next issue is… Spider-Geddon. I’ll come back to it.</p> <p>The last with her father though was cute. Just a lot for a single issue.</p> <p>Side note: the art dramatically shifted halfway through #33. Always jarring, that.</p>Spider-Gwen, Vol. 5: Gwenomhttps://blog.jverkamp.com/2025/02/08/spider-gwen-vol.-5-gwenom/Sat, 08 Feb 2025 00:00:00 +0000https://blog.jverkamp.com/2025/02/08/spider-gwen-vol.-5-gwenom/<p>And do we have Gwenom. Great name. Interesting new power set. Less interaction with the symbiote than you get sometimes.</p> <p><img src="https://blog.jverkamp.com/embeds/books/attachments/spider-gwen-2015-v5-textbundle-b0c691.jpeg" alt=""></p> <p>… if that Venom Wolverine? That’s a terrifying idea.</p> <p>Anyways, Gwenom. Great name, going to be a terrible idea for her. But she’s sort of stuck without many good ones…</p> <p><img src="https://blog.jverkamp.com/embeds/books/attachments/spider-gwen-2015-v5-textbundle-ba9ca6.jpeg" alt=""></p> <p>Yeah. It’s dark.</p> <p><img src="https://blog.jverkamp.com/embeds/books/attachments/spider-gwen-2015-v5-textbundle-310d3e.jpeg" alt=""></p> <p>And weird.</p> <p>But what else is new?</p> <p>We’re definitely heading to a conclusion here. Onward!</p>Setting up a Zigbee Tuya IR Blasterhttps://blog.jverkamp.com/home-automation/2025-02-07-home-automation-tuya-ir-zigbee/Fri, 07 Feb 2025 00:00:00 +0000https://blog.jverkamp.com/home-automation/2025-02-07-home-automation-tuya-ir-zigbee/<p>I spent long than I would have liked setting up a touch of automation for our home media center setup. Specifically, we have a projector, an HDMI switch, and multiple input devices connected to it (Apple TV, Steam Deck, Switch at the moment).</p> <p>There are a few things that are suboptimal with this setup, but so it goes. One thing that&rsquo;s been bothering me for a while is that there&rsquo;s no great way for the switch I have to easily switch devices. It has a remote&hellip; but where&rsquo;s the fun in that? (Plus we lost it for a few months).</p> <p>So I took this as a chance to finally set up an IR transmitter with <a href="https://www.home-assistant.io/" target="_blank" rel="noopener">Home Assistant</a>, using <a href="https://www.home-assistant.io/integrations/zha/" target="_blank" rel="noopener">Zigbee Home Automation</a>!</p> <p>It was a bit confusing to get it all working, so I&rsquo;m sharing it half so I can reproduce what I did if I ever need to or so that anyone trying the same can get it working.</p> <p>A lot of what I did was based first on <a href="https://smarthomescene.com/reviews/tuya-zigbee-infrared-ir-remote-zs06-review/" target="_blank" rel="noopener">this blog post</a>.</p>A Man on the Insidehttps://blog.jverkamp.com/2025/02/05/a-man-on-the-inside/Wed, 05 Feb 2025 00:00:00 +0000https://blog.jverkamp.com/2025/02/05/a-man-on-the-inside/<p>Well that was a fun show. Created by the Michael Schur (who also did the Good Place, check it out!) and with many overlapping cast members from the Good Place, I had high hopes.</p> <p>When I learned that it was about a man learning to live in an assisted living center, I &hellip; wasn&rsquo;t sure. Was there a supernatural element?</p> <p>And then when it dropped (in the first episode and all the promotional materials, so I don&rsquo;t see it as a spoiler) that he&rsquo;s going in to assisted living as a SPY! Well, I&rsquo;m intriuged.</p> <p>It&rsquo;s a fun show, hilarious at times (especially with just how <em>bad</em> Charles is at all this) and sad at others (it&rsquo;s about old folks. Death, loneliness, and memory loss are just part of it). But it&rsquo;s quite the ride all the way through.</p> <p>I do love the cast, Ted Danson as Charles is amazing. I enjoyed Mary Elizabeth Ellis as his daughter Emily, even if her family troubles were a weird B plot. Lilah Richcreek Estrada as Julie did &lsquo;I&rsquo;m going to solve this problem whatever it takes&rsquo; wonderfully, and it was fascinating to see Stephanie Beatriz as head of staff Didi. I really need to watch Brooklyn Nine-Nine at some point&hellip;</p> <p>And then all of the old folks inhabiting those halls&hellip; Man those were some performances. I honestly didn&rsquo;t recognize any of them from other roles but I expect there are some well known names in there.</p> <p>Overall, it&rsquo;s a wonderful show and goes by quick. Well worth the watch!</p>Exposurehttps://blog.jverkamp.com/2025/02/05/exposure/Wed, 05 Feb 2025 00:00:00 +0000https://blog.jverkamp.com/2025/02/05/exposure/<p>Of course I had to read the sequel!</p> <p>It&rsquo;s another story of Rita Todacheene, but this time getting into the absolute <em>trauma</em> of the first book.</p> <p>It&rsquo;s hard enough (I imagine) being a crime scene photography. Constantly exposed to all that fairly grisly death. But add to that ghosts only you can see screaming at you about solving their murders, but when few enough of your coworkers and bosses believe you&ndash;to the point of thinking you&rsquo;ve lost your mind?</p> <p>Oy.</p> <p>So Rita is done. Heading back home.</p> <p>Except this time&hellip; the ghosts are coming with her.</p> <p>This time, rather than backstory the second plot being Rita&rsquo;s past, we have another point of view&ndash;who we quicly learn is a serial killer caught up in his own paranoid worldview and bringing it violently to those around him. It&rsquo;s a fascinating contrast to the first book and I really liked it. It reminded me a lot of various thrillers I read years and years ago, mostly by <a href="https://blog.jverkamp.com/reviews/authors/dean-koontz/">Dean Koontz</a>.</p> <p>Overall, it&rsquo;s a solid sequel and I so wish the best and better for Rita. Oh I&rsquo;m curious to see if there will be another! Where do you go from here?</p>WebCrypto SHA-256 HMAChttps://blog.jverkamp.com/2025/02/05/webcrypto-sha-256-hmac/Wed, 05 Feb 2025 00:00:00 +0000https://blog.jverkamp.com/2025/02/05/webcrypto-sha-256-hmac/<p>A quick random thing I learned that I found helpful (and you might too!):</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">async</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">hmac</span>(<span style="color:#a6e22e">text</span>, <span style="color:#a6e22e">secret</span>) { </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">enc</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">TextEncoder</span>(<span style="color:#e6db74">&#34;utf-8&#34;</span>); </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">algorithm</span> <span style="color:#f92672">=</span> { <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;HMAC&#34;</span>, <span style="color:#a6e22e">hash</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;SHA-256&#34;</span> }; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">key</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">await</span> <span style="color:#a6e22e">crypto</span>.<span style="color:#a6e22e">subtle</span>.<span style="color:#a6e22e">importKey</span>(<span style="color:#e6db74">&#34;raw&#34;</span>, <span style="color:#a6e22e">enc</span>.<span style="color:#a6e22e">encode</span>(<span style="color:#a6e22e">secret</span>), <span style="color:#a6e22e">algorithm</span>, <span style="color:#66d9ef">false</span>, [<span style="color:#e6db74">&#34;sign&#34;</span>, <span style="color:#e6db74">&#34;verify&#34;</span>]); </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">signature</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">await</span> <span style="color:#a6e22e">crypto</span>.<span style="color:#a6e22e">subtle</span>.<span style="color:#a6e22e">sign</span>(<span style="color:#a6e22e">algorithm</span>.<span style="color:#a6e22e">name</span>, <span style="color:#a6e22e">key</span>, <span style="color:#a6e22e">enc</span>.<span style="color:#a6e22e">encode</span>(<span style="color:#a6e22e">text</span>)); </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">digest</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">btoa</span>(String.<span style="color:#a6e22e">fromCharCode</span>(...<span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Uint8Array</span>(<span style="color:#a6e22e">signature</span>))); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">digest</span>; </span></span><span style="display:flex;"><span>} </span></span></code></pre></div><p>This is a function that uses the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API" target="_blank" rel="noopener">Web Crypto API</a> to calculate a <a href="https://en.wikipedia.org/wiki/SHA-256">SHA-256</a> <a href="https://en.wikipedia.org/wiki/HMAC">HMAC</a> of a string given a secret value.</p> <p>I mostly worked this out so that I could figure out how <em>exactly</em> <code>TextEncoder</code> worked, along with <code>importKey</code> (to turn a secret into proper key material) and also how to convert that back into a hex digest.</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#f92672">&gt;&gt;</span> <span style="color:#66d9ef">await</span> <span style="color:#a6e22e">hmac</span>(<span style="color:#e6db74">&#34;lorem ipsum&#34;</span>, <span style="color:#e6db74">&#34;super secret&#34;</span>) </span></span><span style="display:flex;"><span><span style="color:#e6db74">&#34;qArFX93Zi83ccIayhYnuFDpd4pk3eB4rZYDvNteobSU=&#34;</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">&gt;&gt;</span> <span style="color:#66d9ef">await</span> <span style="color:#a6e22e">hmac</span>(<span style="color:#e6db74">&#34;lorem ipsum doler sit amet&#34;</span>, <span style="color:#e6db74">&#34;super secret&#34;</span>) </span></span><span style="display:flex;"><span><span style="color:#e6db74">&#34;klTAioH5nNkguNhU2YcJshaZZtJW9DEb+MTqz4NWq8E=&#34;</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">&gt;&gt;</span> <span style="color:#66d9ef">await</span> <span style="color:#a6e22e">hmac</span>(<span style="color:#e6db74">&#34;lorem ipsum&#34;</span>, <span style="color:#e6db74">&#34;even more super secret!&#34;</span>) </span></span><span style="display:flex;"><span><span style="color:#e6db74">&#34;RoQLg2uz5KWLMJM72VExH5gZOls5bdZZyzHi678eDWs=&#34;</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">&gt;&gt;</span> <span style="color:#66d9ef">await</span> <span style="color:#a6e22e">hmac</span>(<span style="color:#e6db74">&#34;lorem ipsum&#34;</span>, <span style="color:#e6db74">&#34;super secret&#34;</span>) </span></span><span style="display:flex;"><span><span style="color:#e6db74">&#34;qArFX93Zi83ccIayhYnuFDpd4pk3eB4rZYDvNteobSU=&#34;</span> </span></span></code></pre></div><p>Disclaimer: This totally counts as rolling your own crypto. Don&rsquo;t do this unless you know what you&rsquo;re doing. 😄</p> <p>Disclaimer disclaimer: I only rarely know what I&rsquo;m doing. 😄 😄</p> <p>Also, for what it&rsquo;s worth, this is equivalent to the Python standard libraries&rsquo; <code><a href="https://docs.python.org/3/search.html?q=hmac">hmac</a></code> + <code><a href="https://docs.python.org/3/search.html?q=base64">base64</a></code> :</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">&gt;&gt;&gt;</span> base64<span style="color:#f92672">.</span>b64encode(hmac<span style="color:#f92672">.</span>digest(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;super secret&#39;</span>, <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;lorem ipsum&#39;</span>, <span style="color:#e6db74">&#39;SHA256&#39;</span>))<span style="color:#f92672">.</span>decode() </span></span><span style="display:flex;"><span><span style="color:#e6db74">&#39;qArFX93Zi83ccIayhYnuFDpd4pk3eB4rZYDvNteobSU=&#39;</span> </span></span></code></pre></div>Shutterhttps://blog.jverkamp.com/2025/02/02/shutter/Sun, 02 Feb 2025 00:00:00 +0000https://blog.jverkamp.com/2025/02/02/shutter/<blockquote> <p>Grandma always said to me that you never do things for people to get something in return. That is the white man’s way of living. You do it because they need you. You do it because if you don’t, no one else will.</p> </blockquote> <p>Well that&rsquo;s quite a book!</p> <p>In a word, it&rsquo;s an urban fantasy about a Diné (Navajo) forensic photographer that can see ghosts. But it&rsquo;s so much more than that.</p> <p>First, I love the main character: Rita Todacheene. Someone that can see ghosts and a cop (or cop adjacent) is something I&rsquo;ve seen before, but it being a forensic photographer gave a particular poignancy to the whole thing. And the Diné angle was fascinating&ndash;I&rsquo;ve seen a bit of it in other urban fantasy books, but they have a particular way of looking at death which really plays interestingly against someone that can see ghosts!</p> <p>As a bit of setting, the attention to detail on the cameras and the craft of photography was a really interesting touch. Rita, growing up poor but from a whole line of photographers. You really get the feeling she knows and loves everything about it which really gives a certain feel to the story.</p> <p>Content warning though: We do get a number of descriptions of what exactly she&rsquo;s photographing. And some of those are <em>grisly</em>. At least we don&rsquo;t get the pictures? (I don&rsquo;t actually know for sure, I listened to this on audiobook&hellip;)</p> <p>Structurally, the book alternates between the present day&ndash;Rita trying to solve crimes and stay mostly sane with ghosts hounding here&ndash;and the past: Rita&rsquo;s time growing up with her grandmother on a reservation, first coming to terms with life, death, and all it means to her specifically. It&rsquo;s a really nice contrast, pulling the two stories together.</p> <p>Plotwise, it&rsquo;s not the most complicated of mysteries. You mostly have enough clues to figure out where this is going, but oh the ride to get there. It&rsquo;s still well worth it.</p> <blockquote> <p>I learned early that no amount of prayer or smoke or love was ever going to change the fact that these lights wanted to talk to me. Even at three years old, I knew it was something that deeply terrified my grandma and our medicine man. It was something that I was going to have to hide from them. As I got older, I taught myself how to look beyond the ghosts and mute their voices.</p> </blockquote>Furysonghttps://blog.jverkamp.com/2025/01/31/furysong/Fri, 31 Jan 2025 00:00:00 +0000https://blog.jverkamp.com/2025/01/31/furysong/<blockquote> <p>When a government ceases to protect its people, it becomes necessary to overthrow it.</p> </blockquote> <p>Oy.</p> <p>That&rsquo;s how you end a trilogy.</p> <p>Revolution on revolution, coup on coup. Love and hate, betrayal and double/triple/who even knows crossing. And death. Oh the deaths.</p> <p>Finally, we get a conclusion (for now) of the revolution we were first introduced to in <a href="https://blog.jverkamp.com/2024/10/30/fireborne/">Fireborne</a>. And the government in exile of <a href="https://blog.jverkamp.com/2025/01/12/flamefall/">Flamefall</a>.</p> <p>The characters are still a large driving factor here, especially (but not only!) Annie and Lee. We finally get an answer to the whole &lsquo;will they / won&rsquo;t they&rsquo; which I expect we all saw coming, but it&rsquo;s all in <em>how</em> it happened&hellip; and what came next. There&rsquo;s a lot of sweet here&ndash;and more than a helpful of bittersweet as well.</p> <p>On top of that Griff is a fascinating point here. He got everything he wanted in <a href="https://blog.jverkamp.com/2025/01/12/flamefall/">Flamefall</a> and a few things that he couldn&rsquo;t bear. So for half the book, he&rsquo;s the hero&ndash;and drowning himself in his sorrows. But add in Delo as an actual point of view this time around? A plot well worth it.</p> <p>On the antagonists side, we have Ixion. Oh we love to hate them. Being the last book, they have to fall, but it&rsquo;s going to be a long painful trip to get there. The (re)introduction of the Bassileans, their princess, and their gargantuan dragon. I think that&rsquo;s a sort of difference in dragon breeds and hints at a larger world that I could do with more of. It&rsquo;s interesting to realize that for all the chaos we&rsquo;ve been through with these books, they&rsquo;re only a tiny part of the larger world.</p> <p>And then there&rsquo;s Power. He is very much the most complicated character in these books, thoroughly in the morally gray category. Oh Power.</p> <p>Overall, I loved these books. I&rsquo;m going to have to see what else <a href="https://blog.jverkamp.com/reviews/authors/rosaria-munda/">Rosaria Munda</a> has done! Onward!</p> <blockquote> <p>I just wanted it to be in writing, somewhere. I wanted it to be in writing that it was you. For me. It&rsquo;s always been you.</p> </blockquote>Alcatraz Versus the Knights of Crystalliahttps://blog.jverkamp.com/2025/01/25/alcatraz-versus-the-knights-of-crystallia/Sat, 25 Jan 2025 00:00:00 +0000https://blog.jverkamp.com/2025/01/25/alcatraz-versus-the-knights-of-crystallia/<blockquote> <p>Books are not fish sticks.</p> </blockquote> <p>Now, we&rsquo;re <em>really</em> in the Free Kingdoms. We spent a book learning that there&rsquo;s a hidden world and another mostly underground (in the Library of Alexandria!), so it&rsquo;s nice to get something really &lsquo;hidden world&rsquo;.</p> <p>And man, the Free Kingdoms are strange. But that&rsquo;s probably just the Librarian brainwashing coming through. Castles. Glass pigs. More castles. Kings. Councils. And even more Smedrys!</p> <blockquote> <p>“Farting barf-faced poop!” a voice exclaimed from inside the pig’s butt.<br> (Sigh. Sorry. At least that’s another great paragraph to try working into a random conversation.)</p> </blockquote> <p>Exactly.</p> <p>One of the hilarious (from our point of view) issues that comes up this book is Alcatraz coming to his &lsquo;Harry Potter&rsquo; moment. A world where he knows next to nothing, but everyone knows who he is. Apparently via the in-universe Alcatraz books, which is an extra level of weirdly meta.</p> <blockquote> <p>Fame is like a cheeseburger. It might not be the best or most healthy thing to have, but it will still fill you up. You don’t really care how healthy something is when you’ve been without for so long. Like a cheeseburger, fame fills a need, and it tastes so good going down. It isn’t until years later that you realize what it has done to your heart.</p> </blockquote> <p>There are just so many book/other geeky media references. I love them.</p> <blockquote> <p>For example, take this story: “Once there was a furry-footed British guy who had to go throw his uncle’s ring into a hole in the ground.” Sounds dumb, doesn’t it?</p> </blockquote> <p>Nothing is sacred!</p> <blockquote> <p>“That’s bad,” Folsom said.<br> “She Who Cannot Be Named?” I asked. “Why can’t we say her name? Because it might draw the attention of evil powers? Because we’re afraid of her? Because her name has become a curse upon the world?”<br> “Don’t be silly,” Himalaya said. “We don’t say her name because nobody can pronounce it.”</p> </blockquote> <p>Exactly.</p> <p>Overall, it&rsquo;s more Alcatraz. You have a fun plot, wacky characters, and <em>just</em> on the edge of too much meta commentary on writing/being a work of &lsquo;fiction&rsquo;. I&rsquo;m still quite enjoying it.</p> <p>And this is only halfway.</p> <blockquote> <p>If a train left Nalhalla traveling at 3.14 miles an hour and a train left Bermuda at 45 MHz, what time does the soup have pancakes?</p> </blockquote> <p>Where in the world (literally) can they go from here?</p>Broken Homeshttps://blog.jverkamp.com/2025/01/25/broken-homes/Sat, 25 Jan 2025 00:00:00 +0000https://blog.jverkamp.com/2025/01/25/broken-homes/<blockquote> <p>It’s a police mantra that all members of the public are guilty of something, but some members of the public are more guilty than others.</p> </blockquote> <p>The more things change&hellip;</p> <p>This time around, we have both Peter and Leslie as apprentices at the Folly, learning how to do magic things&ndash;</p> <blockquote> <p>&ldquo;I’d love to stick some high vestigia material into a mass spectrometer, but first I’d have to get myself a mass spectrometer and then I’d have to learn enough physics to interpret the bloody results.&rdquo;</p> </blockquote> <p>&ndash;and use those abilities to investigate those <em>stranger</em> cases in London.</p> <blockquote> <p>The key is unlikely juxtapositions. Lots of people read books about the occult, but if you find them alongside books by or about Isaac Newton, especially the long boring ones, then hackles are raised, flags hoisted and, more importantly, notes made in my notebook.</p> </blockquote> <hr> <p>&hellip;the more they remain the same&hellip;</p> <p>And then they find a body sans face.</p> <p>Attend a peace summit between Rivers/Fae. (I actually really do enjoy how fuzzy and ill defined Fae apparently are in this world. It&rsquo;s interesting and feels somehow more &lsquo;Fae&rsquo; than you often see.)</p> <p>Move into an estate (British for project housing).</p> <blockquote> <p>“Peter,” she said. “When you threaten people it’s usually more effective if they don’t have to spend five minutes working out what you just said first.”</p> </blockquote> <p>It&rsquo;s a strange book.</p> <hr> <p>&hellip;until quite suddenly things <em>aren&rsquo;t</em> the same anymore.</p> <p>Oof.</p> <p>That&rsquo;s a brutal ending.</p> <p>I&rsquo;ll just leave it at that.</p> <p>And immediately go start the next book.</p>Doctor Who: Season 2https://blog.jverkamp.com/2025/01/25/doctor-who-season-2/Sat, 25 Jan 2025 00:00:00 +0000https://blog.jverkamp.com/2025/01/25/doctor-who-season-2/<p>Yeah, I&rsquo;m still re-watching Doctor Who in fits and starts.</p> <p>Well, after all that was great with Eccleston/Nine in <a href="https://blog.jverkamp.com/2024/08/02/doctor-who-season-1/">season 1</a>, how we get Tennant/Ten. Oh, I do enjoy his take on the doctor. It&rsquo;s a perfect mix of a whimsical seeing what he can get away with&ndash;with the absolute feel of sadness and age that a being like the Doctor really should be feeling&hellip;</p> <p>And all with Rose along for the ride. Rose gets a lot of hate at times, but I really think she was a pretty good first nu-Who companion.</p> <p>In this season, we a fair few two parters, a bunch of great episodes. <a href="#4-the-girl-in-the-fireplace">The Girl in the Fireplace</a> is a great take on &rsquo;the Time Travelers wife&rsquo; sort of thing. <a href="#5-rise-of-the-cybermen">Rise of the Cybermen</a>/<a href="#6-age-of-steel">Age of Steel</a> introduces us to some old foes. <a href="#8-the-impossible-planet">The Impossible Planet</a>/<a href="#9-satan-pit">Satan Pit</a> <em>really</em> start getting into Doctor Who as sci-fi/horror (and I love it).</p> <p>And then&hellip; there&rsquo;s <a href="#10-love--monsters">Love &amp; Monsters</a>. That&rsquo;s&hellip; actually not that bad? It&rsquo;s definitely one of the &lsquo;Doctor-lite&rsquo; episodes, which are always something interesting to try. The ending is crass and kind of terrifying to really think about&ndash;rather than the laughs you might think they were going for.</p> <p>Overall, a solid season!</p> <p>And <a href="#special-the-runaway-bride">the special</a> introduces Donna! Even if she won&rsquo;t be back for a bit, she&rsquo;s certainly a contender for my favorite companion.</p> <p>Onward!</p>Freshly (Frosted) Solvedhttps://blog.jverkamp.com/2025/01/23/freshly-frosted-solved/Thu, 23 Jan 2025 00:00:00 +0000https://blog.jverkamp.com/2025/01/23/freshly-frosted-solved/And so it begins. Freshly Frosted It&rsquo;s a cute little puzzle game about making a donut factory. It&rsquo;s a lot like Solving Cosmic Express in that it&rsquo;s a &lsquo;puzzle on rails&rsquo;, you are basically routing around the grid from source to target. In the way, we have to go to certain tiles in a certain order (in this case, to apply toppings to our donuts). Let&rsquo;s do it! The first section (starting with Basic layout) is the final state of the solution.Arcane: Season 2https://blog.jverkamp.com/2025/01/21/arcane-season-2/Tue, 21 Jan 2025 00:00:00 +0000https://blog.jverkamp.com/2025/01/21/arcane-season-2/<p>Well then. I absolutely loved [[Arcane: Season 1]]. I still loved Season 2&hellip; but I think they may have reached just a <em>bit</em> too far.</p> <p>The art style is still amazing. We still have the same main steampunk/magitech/brightly colored visuals (Jink&rsquo;s chaotic spraypunk style in particular), but there are also more scenes this time, with different styles matching the feel. Chaotic black slashes when a monster hunts, childhood crayon feeling drawings for memories, and SPACE for&hellip; well, spoilers. And oh, the glitching. Weird, but quite the style.</p> <p>The characters&hellip; I think at it&rsquo;s heart, this show is about Vi and Jinx and man do they go through a lot in this season. I already felt for Jinx&ndash;even if I wasn&rsquo;t sure she could ever be redeemed in season 1&ndash;and they just turn it up. On top of that, you have Jayce/Viktor, which&hellip; man that one hurt this season. Plus Vi/Cait (go them!), and Mel/her mother (this one didn&rsquo;t get nearly as much time as it needed), and Ekko (this could have been a whole season&hellip; or left out entirely).</p> <p>Mostly, I think this was the biggest problem with this season. It&rsquo;s only 9 episodes, mostly short of 45 minutes. That is <em>not</em> enough time to fit everything that they tried to put in this show. I could have easily watched an entire season focussing on any one of those plots above&hellip; and they tried to fit it all in. We get some resolutions&hellip; but so much is left undone.</p> <p>Apparently there won&rsquo;t be an Arcane Season 3; instead, we&rsquo;ll get one or more spinoff shows in the same universe but with other stories/settings/characters. This is absolutely for the best.</p> <p>Speaking of feel, the first season did a good job of feeling real/grounded. It was a story of class warfare and the introduction of magic into a steampunk world. It all &lsquo;fit&rsquo;. Here, we get quite a bit more of the more &lsquo;cosmic&rsquo; side of what&rsquo;s apparently also kicking around in this world. I liked it, don&rsquo;t get me wrong, but it felt so much bigger and weirder than the first season that they didn&rsquo;t quite fit together&hellip;</p> <p>Overall? I still quite enjoyed Season 2. It is absolutely worth watching Season 1 and once you have&hellip; well, you have to go on, right? I&rsquo;ll totally check out any spin-offs that we get.</p> <p>Onward!</p>Taskmaster: Series 18https://blog.jverkamp.com/2025/01/20/taskmaster-series-18/Mon, 20 Jan 2025 00:00:00 +0000https://blog.jverkamp.com/2025/01/20/taskmaster-series-18/<p>I &hellip; managed to miss [[todo:Taskmaster: Series 17]] somehow. Anyways!</p> <p>Another delightful season. This was a fun cast. Baba was full of chaos, Rosie got away with so much crap (sometimes literally) and her team tasks with Jack were such chaos. Andy has serious mad professor vibes (mostly the hair I suppose). Emma&hellip; Emma was my favorite.</p> <p>Rosie having cerebral palsy certainly started out with a different flavor to the season. But man she has a sense of humor about the whole thing. I think it took Greg and the other contestants a minute to feel out how far to go (&ldquo;Is it too early in the series to mention I DON&rsquo;T have cerebral palsy?&rdquo; - Emma)&hellip; but once they did, that was a lot of fun.</p> <blockquote> <p>As you can tell by the way I talk, I suffer from being Northern. &ndash; Rosie</p> </blockquote> <p>Overall, what do you want? I love this show. Another great season. Time to go back to 17!</p>Flamefallhttps://blog.jverkamp.com/2025/01/12/flamefall/Sun, 12 Jan 2025 00:00:00 +0000https://blog.jverkamp.com/2025/01/12/flamefall/<blockquote> <p>Revenge doesn&rsquo;t need to begin with a knife. It can begin with a well-delivered speech.</p> </blockquote> <p>The cracks were already showing in <a href="https://blog.jverkamp.com/2024/10/30/fireborne/">Fireborne</a>. There may have been a Revolution, dealing away with the Dragonlords of old&hellip; but that doesn&rsquo;t necessarily mean that whatever comes next is going to be any better. So much so that you start to see those with the feeling that &lsquo;maybe things weren&rsquo;t so bad under the Dragonlords after all&rsquo;. And it just so happens that there&rsquo;s more than one cousin in exile&hellip;</p> <p>I really enjoy seeing Annie come into her own in this book, taking her place in charge of the dragon riders after Lee stepped down. And then dealing with all that comes from having to make all those hard decisions at the top. Dealing with Lee and the government and the other riders and her own past. It&rsquo;s a lot.</p> <p>And Lee, actually coming out into the open&ndash;while dealing with the trauma at the end of <a href="https://blog.jverkamp.com/2024/10/30/fireborne/">Fireborne</a>. Complicated that. I kept expecting him to snap&ndash;and hoping that he won&rsquo;t, that he <em>will actually be better</em>. I&rsquo;m rooting for you!</p> <p>And then we have newcomer Griff. Another peasant dragon rider from a <em>very</em> different set of circumstances. It&rsquo;s hard to introduce a new main character in the second book, but I really do think it was done well. Man, the New Pythians are <em>twisted</em>, almost comically evil. But that doesn&rsquo;t make them any less dangerous to those in teh story.</p> <p>Oy there&rsquo;s just so much in this book.</p> <blockquote> <p>Tonight I&rsquo;m full of confidence, like a dragon riding a gale. I am done letting these tendrils of shame tie me to the ground. No shadow is so great that it doesn&rsquo;t shrink when viewed from the air.</p> </blockquote> <p>I can&rsquo;t wait to see how it ends from here.</p>Oppenheimerhttps://blog.jverkamp.com/2025/01/12/oppenheimer/Sun, 12 Jan 2025 00:00:00 +0000https://blog.jverkamp.com/2025/01/12/oppenheimer/<p><a href="https://blog.jverkamp.com/2025/01/11/barbie/">Barbenheimer</a>!<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p> <blockquote> <p>Oppenheimer: Albert? When I came to you with those calculations, we thought we might start a chain reaction that would destroy the entire world&hellip;<br> Einstein: I remember it well. What of it?<br> Oppenheimer: I believe we did.</p> </blockquote> <p>That is a long, dense film.</p> <p>It&rsquo;s complicated and there are <em>long</em> stretches with little going on by talking and setting. But&hellip; man, is it thematic talking and setting?</p> <p>It&rsquo;s all about the story of <a href="https://en.wikipedia.org/wiki/J.%20Robert%20Oppenheimer">J. Robert Oppenheimer</a>, the so called &lsquo;father of the atomic bomb&rsquo; and&hellip; well, how he earned that title. I knew bits and pieces of the story, but having watched this, bits and pieces were apparently all I knew. It&rsquo;s kind of amazing how many of the names I recognize from physics classes were involved in either the project or Oppenheimer&rsquo;s life.</p> <p>It was at times difficult to follow, there are a ton of jumps (mostly stylistically) and it makes me wander just how much of that was actually problems in Oppenheimer&rsquo;s mind and how much was style. That&rsquo;s not really clear, even by the end of the movie. I certainly wouldn&rsquo;t be surprised though if he was having issues like that.</p> <blockquote> <p>Einstein: When they&rsquo;ve punished you enough, they&rsquo;ll serve you salmon and potato salad, make speeches, give you a medal, and pat you in the back telling all is forgiven. Just remember, it won&rsquo;t be for you&hellip; it would be for them.</p> </blockquote> <p>I think the cast was another impressive part of this film. I couldn&rsquo;t speak to just how perfectly accurate it was, but I think Cillian Murphy was an excellent casting for Oppenheimer. He&rsquo;s got just the right amount of strange charisma to really pull you into the film.</p> <p>Matt Damon and Robert Downey Jr. were solid roles, enough to actually remind me why they&rsquo;re considered solid actors&ndash;and not just playing themselves as some do. Alden Ehrenreich I thought looked familiar, but had to look up where I&rsquo;d seen him recently (Solo and <a href="https://blog.jverkamp.com/2013/02/17/beautiful-creatures/">Beautiful Creatures</a> (that&rsquo;s been a while)). There are just a bunch of people I&rsquo;ve seen in other things before&hellip;</p> <p>Overall, quite the solid movie. I think I learned something and enjoyed the process of doing something, which is something always worth saying. It&rsquo;s long, but I think it&rsquo;s worth a watch!</p> <p>(Personally, I don&rsquo;t think there&rsquo;s any reason to <a href="https://blog.jverkamp.com/2025/01/11/barbie/">Barbenheimer</a> it though, although it is amusing.)</p> <p>Last note:</p> <blockquote> <p>Oppenheimer: Now I am become Death, the destroyer of worlds.</p> </blockquote> <p>The first time he says it&hellip; was surprising and kind of weird. I expect they were going with &rsquo;everyone is waiting for him to say the line&hellip; psyche!&rsquo; I&rsquo;ll just leave it at that.</p>Barbiehttps://blog.jverkamp.com/2025/01/11/barbie/Sat, 11 Jan 2025 00:00:00 +0000https://blog.jverkamp.com/2025/01/11/barbie/<p><a href="https://blog.jverkamp.com/2025/01/12/oppenheimer/">Barbenheimer</a>!<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p> <p>Barbie is quite a movie.</p> <p>An entire world populated entirely by every single variant of Barbie and Ken<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>. All named Barbie and Ken, all living their lives in the most &lsquo;we&rsquo;re sort of toys and sort of real&rsquo; way possible. Drinking your morning coffee? Tip the empty cup to your mouth. Need to get out of the second floor? Just jump down! And of course&hellip;</p> <blockquote> <p>Ken: I thought I might stay over tonight.<br> Barbie: Why?<br> Ken: Because we&rsquo;re girfriend and boyfriend.<br> Barbie: To do what?<br> [pause]<br> Ken: I&rsquo;m actually not sure.</p> </blockquote> <p>Oh this movie is weirdly(ly on point) at times.</p> <p>Then we get the &rsquo;toy in the real world and DOESN&rsquo;T UNDERSTAND THINGS&rsquo; scenes. I feel like a lot of those were dialed up <em>just</em> to the edge of over-parody, but really, it somehow just works? Barbie is so out of sorts and just doesn&rsquo;t realize it&hellip; until she does.</p> <p>Things go wrong&hellip; and suddenly the movie isn&rsquo;t just the Barbie movie anymore. Now, it&rsquo;s all about Ken. And the PATRIARCHY.</p> <blockquote> <p>Ken: To be honest, when I found out the patriarchy wasn&rsquo;t just about horses, I lost interest.</p> </blockquote> <p>I knew that we were going to have some major conflict there, in a world (almost) entirely populated by Barbies and Kens&hellip; who else is there? But it&rsquo;s kind of weird. I feel like Ken honestly has more of a story arc for a lot of the movie does than Barbie. Which&hellip; feels kind of against the entire point of the movie?</p> <p>It works though.</p> <p>And of course, we have the big Mattel in the room. Of <em>course</em> we have to have a dig about companies making toys for girls run by powerful men. But man, did they dial that one up to 11 on a rediculous scale. A bicycle built for&hellip; a boardroom. That is all. Will Ferrell is a delight as the CEO. After Lord Business in <a href="https://blog.jverkamp.com/2014/02/15/the-lego-movie/">The Lego Movie</a>&hellip; this is a weird role to be typecast as, but it really works.</p> <p>Speaking of casting, I did love Margot Robbie as Barbie<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup>.</p> <blockquote> <p>Barbie: [in tears] I&rsquo;m not pretty anymore!<br> Gloria: What? You&rsquo;re so pretty!<br> Barbie: I&rsquo;m not stereotypical Barbie pretty!<br> Narrator: Note to the filmmakers: Margot Robbie is the wrong person to cast if you want to make this point.</p> </blockquote> <p>She just &hellip; epitomizes Barbieness in the movie? I don&rsquo;t know who esle could possibly have carried that role quite as well. Kate McKinnon as Weird Barbie was great as well.</p> <p>And Ryan Gosling as Ken<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup>. This one I think could have been differently cast with less issue, but he still did a wonderful job.</p> <p>One thing that stood out was how at times uncomfortably on point Barbie managed to be on various social commentary issues.</p> <blockquote> <p>Sasha: You&rsquo;re a fascist!<br> Barbie: How can I be a fascist?<br> [through tears]<br> Barbie: I don&rsquo;t control the railways or the flow of commerce&hellip;<br> [cries]</p> </blockquote> <p>Oh this movie.</p> <p>Overall, it was a movie better than it had any right to be and far better than I expected, even with generally positive reviews going on. Worth watching. Not sure it&rsquo;s necessary to <a href="https://blog.jverkamp.com/2025/01/12/oppenheimer/">Barbenheimer</a> it though&hellip;</p>Toasting Marshmallows: Camping Poemshttps://blog.jverkamp.com/2025/01/10/toasting-marshmallows-camping-poems/Fri, 10 Jan 2025 00:00:00 +0000https://blog.jverkamp.com/2025/01/10/toasting-marshmallows-camping-poems/<p>One of those &lsquo;read to the children over a few evenings, so I should count it&rsquo; sort of books.</p> <blockquote> <p>Warm front. Cold back.<br>     I turn around.<br> Warm back. Cold front.<br>     I turn around.</p> <p>I lean against Mom,<br> my head on her shoulder.<br>     Warm all over.</p> </blockquote> <p>And it&rsquo;s actually a really fun book. The feeling of camping&hellip; in poetry form!</p>Frankenstein: The 1818 Texthttps://blog.jverkamp.com/2025/01/06/frankenstein-the-1818-text/Mon, 06 Jan 2025 00:00:00 +0000https://blog.jverkamp.com/2025/01/06/frankenstein-the-1818-text/<p>I&rsquo;m really going for that &rsquo;earliest published book&rsquo; for this coming Year in Reviews aren&rsquo;t I?</p> <blockquote> <p>It is true, we shall be monsters, cut off from all the world; but on that account we shall be more attached to one another.</p> </blockquote> <p>Overall, it&rsquo;s one of those stories you expect to know what happens even before you read it. Frankenstein<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> creates LIFE in a form stitched together from dead bodies. But it&rsquo;s super ugly, so he drives his creation off. Said creation isn&rsquo;t a huge fan of this and goes on a murderous rampage. The end.</p> <p>And yet, that&rsquo;s not <em>entirely</em> right?</p> <p>It&rsquo;s an oddly formatted story to a much more modern reader. It&rsquo;s epistolary (told in letters and journals), which reminds me a lot of <a href="https://blog.jverkamp.com/2021/01/29/dracula/">Dracula</a> and nested. We have letters from a sea captain, the account of Victor Frankenstein, and then finally <span class="spoiler">the monster himself</span> .</p> <p>It&rsquo;s a neat style, but I think a bit more could have been done with it. And it&rsquo;s never really a great sign when one of the main viewpoints (Frankenstein himself) is just hard to read. He&rsquo;s not likeable and depressed a lot of the time.</p> <blockquote> <p>Even broken in spirit as he is, no one can feel more deeply than he does the beauties of nature. The starry sky, the sea, and every sight afforded by these wonderful regions, seems still to have the power of elevating his soul from earth. Such a man has a double existence: he may suffer misery, and be overwhelmed by disappointments; yet, when he has retired into himself, he will be like a celestial spirit that has a halo around him, within whose circle no grief or folly ventures.</p> </blockquote> <p>Which again, I get it. But it doesn&rsquo;t make for a thrilling read.</p> <p>It&rsquo;s billed as one of the earlier examples of science fiction, but it&rsquo;s not <em>really</em> science fiction. It does deal with the idea of bringing life&ndash;but never really gets into it. It&rsquo;s setting as much as anything, something to set the story in motion.</p> <p>Alternatively, it&rsquo;s also called early modern Horror, but &hellip; it&rsquo;s not really horror in either the jump scare or thriller or cosmic senses of the word. There&rsquo;s some sense of inevitability&ndash;the creation is coming!&ndash;but it never really amounts to much.</p> <p>Overall, I think it&rsquo;s worth having read mostly in a completionist sense. And really, I&rsquo;m glad I listened to this one on audiobook&ndash;they have a way of just keeping you going when you might otherwise get stuck and put the book down.</p> <p>Onward!</p>2024 Year in Reviewshttps://blog.jverkamp.com/2024/12/31/2024-year-in-reviews/Tue, 31 Dec 2024 23:59:59 +0000https://blog.jverkamp.com/2024/12/31/2024-year-in-reviews/<p>11 years. 1300 book reviews. 170 movies. 100 seasons of TV shows.</p> <p>That&rsquo;s so ridiculous when you write it out. It&rsquo;s kind of neat how something builds up if you just keep doing it over time.</p> <div class="ranking"> <h3 class="title">Posts in <a href="https://blog.jverkamp.com/series/year-in-reviews/">Year in Reviews</a>:</h3> <div class="content"> <ul><li> <a href="https://blog.jverkamp.com/2015/12/31/2015-reading-list-retrospective/"> 2015 Reading List Retrospective </a></li><li> <a href="https://blog.jverkamp.com/2016/12/31/2016-reading-list-retrospective/"> 2016 Reading List Retrospective </a></li><li> <a href="https://blog.jverkamp.com/2017/12/31/2017-reading-list-retrospective/"> 2017 Reading List Retrospective </a></li><li> <a href="https://blog.jverkamp.com/2018/12/31/2018-reading-list-retrospective/"> 2018 Reading List Retrospective </a></li><li> <a href="https://blog.jverkamp.com/2019/12/31/2019-reading-list-retrospective/"> 2019 Reading List Retrospective </a></li><li> <a href="https://blog.jverkamp.com/2020/12/31/2020-reading-retrospective/"> 2020 Reading Retrospective </a></li><li> <a href="https://blog.jverkamp.com/2021/12/31/2021-reading-retrospective/"> 2021 Reading Retrospective </a></li><li> <a href="https://blog.jverkamp.com/2021/12/31/2021-tv-movies-retrospective/"> 2021 TV &amp; Movies Retrospective </a></li><li> <a href="https://blog.jverkamp.com/2022/12/31/2022-year-in-reviews/"> 2022 Year in Reviews </a></li><li> <a href="https://blog.jverkamp.com/2023/12/31/2023-year-in-reviews/"> 2023 Year in Reviews </a></li><li> <a href="https://blog.jverkamp.com/2024/12/31/2024-year-in-reviews/"> 2024 Year in Reviews </a></li></ul> </div> </div> <p>In any case, I enjoy collecting stats on various things and sharing them out. Both as a way to look back and remember for myself and in the hope that someone else finds it interesting and/or shares anything new/interesting I haven&rsquo;t seen!</p> <p>Overall this year:</p> <ul> <li><a href="#books">Read 298 books</a></li> <li><a href="#tv">Watch 17 seasons of TV</a></li> <li><a href="#movies">Watched 11 movies</a></li> <li><a href="#board-games">Played 227 different (85 new) board games a total of 1313 times</a></li> <li><a href="#steam-games">Played 37 games on steam (24 new) and made it to 100% Achievements on 10<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> of them</a></li> </ul> <h2 id="table-of-contents">Table of Contents</h2> <nav id="TableOfContents"> <ul> <li><a href="#table-of-contents">Table of Contents</a></li> <li><a href="#books">Books</a> <ul> <li><a href="#statistics">Statistics</a></li> <li><a href="#personal-favorites">Personal Favorites</a></li> <li><a href="#full-list">Full list</a></li> </ul> </li> <li><a href="#tv">TV</a> <ul> <li><a href="#full-list-1">Full list</a></li> </ul> </li> <li><a href="#movies">Movies</a></li> <li><a href="#board-games">Board Games</a></li> <li><a href="#steam-games">Steam Games</a></li> </ul> </nav>The Empire of Goldhttps://blog.jverkamp.com/2024/12/31/the-empire-of-gold/Tue, 31 Dec 2024 00:00:00 +0000https://blog.jverkamp.com/2024/12/31/the-empire-of-gold/<blockquote> <p>Luck is a fairy tale we use to make people feel better about the world being unfair as shit.</p> </blockquote> <p>Man this book has come a ways since <a href="https://blog.jverkamp.com/2024/07/05/the-city-of-brass/">The City of Brass</a>. At first we had a fairly straight forward portal fantasy: normal human girl goes through a portal (ish) to another world, discovers magic, and has adventures (again; ish). Then things escalate. Political intrigue. Old enemies. Revolution. War.</p> <p>And now&hellip; Daevabad has fallen. Nahri and Ali are on the run, trying desperately first to survive and then&hellip; maybe, to come back and save the day. And perhaps learn all those dirty little secrets those (formerly) in power tried hard to hide all these years.</p> <blockquote> <p>I do not believe ambitious men who say the only route to peace and prosperity lies in giving them more power—particularly when they do it with lands and people who are not theirs.</p> </blockquote> <p>I love the characters. Especially Dara, but the whole Nahri and Ali journey was great to read. And I even foundmyself rooting for Muntadhir, which after the previous books&hellip; I did not expect). Manizheh&hellip; I think Ghassan was a better villain overall, and it&rsquo;s interesting that she made it as far as she did, but so it goes.</p> <p>And I still love the worldbuilding&ndash;even if I&rsquo;m <em>still after 3 books</em> not 100% sure what is a subset of what and who is a when. But I suppose that&rsquo;s the point. Reality is messy. But it&rsquo;s a fascinating world and I&rsquo;m sad to be leaving it.</p> <p>Overall it&rsquo;s a solid conclusion to a great series. I&rsquo;d be happy to read more in this world, but I&rsquo;m always glad to see a series actually get it&rsquo;s own small end, rather than just fading out as many do.</p> <blockquote> <p>Find your happiness, little thief. Steal it and do not ever let it go.</p> </blockquote> <p>Onward!</p>Iron Councilhttps://blog.jverkamp.com/2024/12/30/iron-council/Mon, 30 Dec 2024 00:00:00 +0000https://blog.jverkamp.com/2024/12/30/iron-council/<p>[[Perdido Street Station|One in a city]], [[The Scar|one on a boat]]&hellip; and now one based around an entire civilization built around a &lsquo;perpetual train&rsquo;, putting down rails as it goes (and at times, tearing them up behind it).</p> <p>Man <a href="https://blog.jverkamp.com/reviews/authors/china-mi%C3%A9ville/">China Miéville</a> has some bonkers worldbuilding ideas.</p> <blockquote> <p>I mean course you want a change, we want a change, but if a change ain’t godsdamn coming, then the next thing I wish is that I didn’t care.</p> </blockquote> <p>Beyond that, we have a whole book about political oppression and xenophobia (the Iron Council is initially founded by the remade working on the train). It&rsquo;s about the tension of a revolution that feels inevitable. We have a story about gender differences (in a world where sexual dimorphism is a huge deal for some species) and love and longing. And a story about future history. The messy way of how one ends up getting history books written about them.</p> <blockquote> <p>“History&hellip;” Jacobs spoke with terse authority. Brought Ori to a hush. “Is all full. And dripping. With the corpses. Of them who trusted the incorruptible.”</p> </blockquote> <p>It&rsquo;s also interesting to see the fallout of the &lsquo;Contruct Uprising&rsquo;. A direct consequence of <a href="https://blog.jverkamp.com/2024/10/04/perdido-street-station/">Perdido Street Station</a>. And now instead, we have <a href="https://en.wikipedia.org/wiki/golems">golems</a>&ndash;which in this world can be made by animating any sorts of bits of innanimate matter and giving them life/instructions. It&rsquo;s cool!</p> <p>Unfortunately, I think this may be the weakest of the three. Despite how cool an idea a &lsquo;perpetual train&rsquo; is, I think the story spends too much time on other people/places/things. It&rsquo;s all building up, but when one of the things I love the most (and always start by describing) is left wanting? That&rsquo;s a bit of a bummer. It&rsquo;s still fascinating and there&rsquo;s a bunch of it&hellip; but I wanted more!</p>Whispers Under Groundhttps://blog.jverkamp.com/2024/12/29/whispers-under-ground/Sun, 29 Dec 2024 00:00:00 +0000https://blog.jverkamp.com/2024/12/29/whispers-under-ground/<p>Ghosts! Goblins! Murder! The FBI (in London)! The LONDON UNDERGROUND!</p> <p>I do continue to really love the feel of these books. It <em>feels</em> like a British cop show with a combination of magical elements and the science of magic, which are all delightful things.</p> <p>Characterwise, it&rsquo;s mostly the same, although this time around, we get a lot more of Lesley stepping up to learn magic again, which is something I was hoping would happen. I&rsquo;m looking forward to seeing how those two grow together.</p> <blockquote> <p>&ldquo;That was Seawoll,&rdquo; she said. &ldquo;Stephanopoulos is on her way down and you’re not to do anything stupid until she gets here.&rdquo;</p> <p>You burn down one central London tourist attraction, I thought, and they never let you forget it.</p> </blockquote> <p>It&rsquo;s also interesting seeing the bits of London as a city built on people from all manners, histories, and walks of life.</p> <blockquote> <p>My mum translated this in her head to &ldquo;witchfinder,&rdquo; which was good because like most West Africans, she considered witchfinding a more respectable profession than policeman.</p> </blockquote> <p>😄</p> <p>Worldbuildingwise, I like seeing ever more of teh magical world of London. There really is a feel of &rsquo;this <em>could</em> be&rsquo; that urban fantasy doesn&rsquo;t always get right. And I enjoy finding out that even the magical folks don&rsquo;t know how a lot of what they do works, but our main character is <em>not</em> going to let that stand.</p> <blockquote> <p>This is why magic is worse even than quantum physics. Because, while both spit in the eye of common sense, I&rsquo;ve never yet had a Higgs bosun turn up and try to have a conversation with me.</p> </blockquote> <p>It&rsquo;s fun to see even more of the magical underground (literally). It&rsquo;s neat to see how different authors play with old stories (and make up their own!)</p> <blockquote> <p>“My dad was a fairy,&quot; said Zach. &ldquo;And by that I don&rsquo;t mean he dressed well and enjoyed musical theatre.”</p> </blockquote> <p>One oddity: There are a ton of Lord of the Rings references throughout this book, some blatent and some more subtle. I was really fully expecting that to <a href="https://en.wikipedia.org/wiki/Chekhov%27s%20gun">Chekhov&#39;s gun</a>&hellip; but they were just references all along? That seems weird to me and I can&rsquo;t quite my finger on why.</p> <p>Overall, I loved it and am looking forward to the next one! Onward!</p>AoC 2024 Day 25: Christmas Lockpickinatorhttps://blog.jverkamp.com/2024/12/25/aoc-2024-day-25-christmas-lockpickinator/Wed, 25 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/25/aoc-2024-day-25-christmas-lockpickinator/<h2 id="source-day-25-code-chroniclehttpsadventofcodecom2024day25">Source: <a href="https://adventofcode.com/2024/day/25" target="_blank" rel="noopener">Day 25: Code Chronicle</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day25.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-25-code-chroniclehttpsadventofcodecom2024day25">Source: <a href="https://adventofcode.com/2024/day/25">Day 25: Code Chronicle</a></a></li> <li><a href="#part-1">Part 1</a></li> <li><a href="#part-2">Part 2</a></li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>You are given a series of locks and keys (see below). How many unique <code>(lock, key)</code> are there that do not overlap (they do not have to fit perfectly).</p> <p>A lock starts from the top. The entire top row is <code>#</code> and the entire bottom row is <code>.</code>.</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>##### </span></span><span style="display:flex;"><span>.#### </span></span><span style="display:flex;"><span>.#### </span></span><span style="display:flex;"><span>.#### </span></span><span style="display:flex;"><span>.#.#. </span></span><span style="display:flex;"><span>.#... </span></span><span style="display:flex;"><span>..... </span></span></code></pre></div><p>A key is the opposite:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>..... </span></span><span style="display:flex;"><span>..... </span></span><span style="display:flex;"><span>..... </span></span><span style="display:flex;"><span>#.... </span></span><span style="display:flex;"><span>#.#.. </span></span><span style="display:flex;"><span>#.#.# </span></span><span style="display:flex;"><span>##### </span></span></code></pre></div></blockquote>AoC 2024 Day 24: Ripple Carrinatorhttps://blog.jverkamp.com/2024/12/24/aoc-2024-day-24-ripple-carrinator/Tue, 24 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/24/aoc-2024-day-24-ripple-carrinator/<h2 id="source-day-24-crossed-wireshttpsadventofcodecom2024day24">Source: <a href="https://adventofcode.com/2024/day/24" target="_blank" rel="noopener">Day 24: Crossed Wires</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day24.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-24-crossed-wireshttpsadventofcodecom2024day24">Source: <a href="https://adventofcode.com/2024/day/24">Day 24: Crossed Wires</a></a></li> <li><a href="#part-1">Part 1</a></li> <li><a href="#part-2">Part 2</a> <ul> <li><a href="#brute-force">Brute force</a></li> <li><a href="#visualizing-the-problem">Visualizing the problem</a></li> <li><a href="#actually-solving-it">Actually solving it</a></li> </ul> </li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Given a collection of gates of the form <code>arg0 (AND|OR|XOR) arg2 -&gt; out</code> and input values of form <code>x**</code> and <code>y**</code>, what is the value of <code>z**</code> interpreted as a binary number?</p> </blockquote>AoC 2024 Day 23: LAN Partinatorhttps://blog.jverkamp.com/2024/12/23/aoc-2024-day-23-lan-partinator/Mon, 23 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/23/aoc-2024-day-23-lan-partinator/<h2 id="source-day-23-lan-partyhttpsadventofcodecom2024day23">Source: <a href="https://adventofcode.com/2024/day/23" target="_blank" rel="noopener">Day 23: LAN Party</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day23.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-23-lan-partyhttpsadventofcodecom2024day23">Source: <a href="https://adventofcode.com/2024/day/23">Day 23: LAN Party</a></a></li> <li><a href="#part-1">Part 1</a></li> <li><a href="#part-2">Part 2</a> <ul> <li><a href="#corrected-version-1-largest-completely-connected">Corrected version 1: Largest completely connected</a></li> <li><a href="#corrected-version-2-recursion--memoization">Corrected version 2: Recursion + memoization</a></li> <li><a href="#corrected-version-3-ordering-by-most-connected-nodes">Corrected version 3: Ordering by most connected nodes</a></li> <li><a href="#this-is-stupid">This is stupid&hellip;</a></li> <li><a href="#and-complicated">&hellip;and complicated</a></li> </ul> </li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>You are given the edges of an <a href="https://en.wikipedia.org/wiki/undirected%20graph">undirected graph</a>. Count how many <a href="https://en.wikipedia.org/wiki/complete%20graph">complete</a> <a href="https://en.wikipedia.org/wiki/subgraphs">subgraphs</a> of size three exist that contain one or more starting with the letter <code>t</code>.</p> </blockquote> <p>Aside: Games with local (but not hotseat) multiplayer have gotten rather rarer over the years&hellip; how many people still know what a <a href="https://en.wikipedia.org/wiki/LAN%20party">LAN party</a> is/was?</p>AoC 2024 Day 22: Xorshiftinatorhttps://blog.jverkamp.com/2024/12/22/aoc-2024-day-22-xorshiftinator/Sun, 22 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/22/aoc-2024-day-22-xorshiftinator/<h2 id="source-day-22-monkey-markethttpsadventofcodecom2024day22">Source: <a href="https://adventofcode.com/2024/day/22" target="_blank" rel="noopener">Day 22: Monkey Market</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day22.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-22-monkey-markethttpsadventofcodecom2024day22">Source: <a href="https://adventofcode.com/2024/day/22">Day 22: Monkey Market</a></a></li> <li><a href="#part-1">Part 1</a></li> <li><a href="#part-2">Part 2</a> <ul> <li><a href="#brute-force">Brute force</a></li> <li><a href="#scan-for-sequence-scores">Scan for sequence scores</a></li> <li><a href="#packing-a-single-u32-instead-of-a-vecdeque">Packing a single <code>u32</code> instead of a <code>VecDeque</code></a></li> <li><a href="#visualizations">Visualizations</a></li> <li><a href="#ones-stats">Ones stats</a></li> </ul> </li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Implement a <a href="https://en.wikipedia.org/wiki/PRNG">PRNG</a> with the following update function:</p> <ol> <li>Multiply by 64, xor with the previous value, <a href="https://en.wikipedia.org/wiki/modulo">modulo</a> 16777216</li> <li>Divide by 32, xor with the previous value (from step 1), modulo 16777216</li> <li>Multiply by 2048, xor with the previous value (from step 2), module 16777216</li> </ol> <p>For each of a series of seeds, sum the 2000th generated number.</p> </blockquote>AoC 2024 Day 21: Busy Workinatorhttps://blog.jverkamp.com/2024/12/21/aoc-2024-day-21-busy-workinator/Sat, 21 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/21/aoc-2024-day-21-busy-workinator/<h2 id="source-day-21-keypad-conundrumhttpsadventofcodecom2024day21">Source: <a href="https://adventofcode.com/2024/day/21" target="_blank" rel="noopener">Day 21: Keypad Conundrum</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day21.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-21-keypad-conundrumhttpsadventofcodecom2024day21">Source: <a href="https://adventofcode.com/2024/day/21">Day 21: Keypad Conundrum</a></a></li> <li><a href="#part-1">Part 1</a> <ul> <li><a href="#failed-version-1-way-over-engineered">(Failed) Version 1: Way over engineered</a></li> <li><a href="#version-2-direct-simulation">Version 2: Direct simulation</a></li> </ul> </li> <li><a href="#part-2">Part 2</a> <ul> <li><a href="#memoization">Memoization</a></li> </ul> </li> <li><a href="#benchmarks">Benchmarks</a> <ul> <li><a href="#tracing">Tracing</a></li> </ul> </li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>You are trying to type a code on a keypad:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>+---+---+---+ </span></span><span style="display:flex;"><span>| 7 | 8 | 9 | </span></span><span style="display:flex;"><span>+---+---+---+ </span></span><span style="display:flex;"><span>| 4 | 5 | 6 | </span></span><span style="display:flex;"><span>+---+---+---+ </span></span><span style="display:flex;"><span>| 1 | 2 | 3 | </span></span><span style="display:flex;"><span>+---+---+---+ </span></span><span style="display:flex;"><span> | 0 | A | </span></span><span style="display:flex;"><span> +---+---+ </span></span></code></pre></div><p>But you cannot type directly. Instead, you can control a pointer on the keypad with arrow keys:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span> +---+---+ </span></span><span style="display:flex;"><span> | ^ | A | </span></span><span style="display:flex;"><span>+---+---+---+ </span></span><span style="display:flex;"><span>| &lt; | v | &gt; | </span></span><span style="display:flex;"><span>+---+---+---+ </span></span></code></pre></div><p>Whenever you type a <code>^</code> on the arrow keys, the pointer on the keypad will move up one, etc. When you type <code>A</code>, then the pointer on the keypad will type whatever it is pointing at.</p> <p>But that&rsquo;s not enough either. Add a second keypad. And then a third, that is the one you are actually controlling.</p> <p>For each output sequence multiple the length of the minimum input sequence needed to generate it by the numeric value of the input sequence (ignoring any <code>A</code>); sum these.</p> <p>Note: Moving off any keypad or into the blank spaces is an error.</p> </blockquote>AoC 2024 Day 20: Shadow Catinatorhttps://blog.jverkamp.com/2024/12/20/aoc-2024-day-20-shadow-catinator/Fri, 20 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/20/aoc-2024-day-20-shadow-catinator/<h2 id="source-day-20-race-conditionhttpsadventofcodecom2024day20">Source: <a href="https://adventofcode.com/2024/day/20" target="_blank" rel="noopener">Day 20: Race Condition</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day20.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-20-race-conditionhttpsadventofcodecom2024day20">Source: <a href="https://adventofcode.com/2024/day/20">Day 20: Race Condition</a></a></li> <li><a href="#part-1">Part 1</a> <ul> <li><a href="#version-1-entirely-over-complicated">Version 1: Entirely over complicated&hellip;</a></li> <li><a href="#version-2-floodfill">Version 2: Floodfill</a></li> <li><a href="#version-3-directly-scan-along-the-path">Version 3: Directly scan along the path</a></li> <li><a href="#optimization-1-calculate-distances-once-dijkstras-algorithm">Optimization 1: Calculate distances once (Dijkstra&rsquo;s algorithm)</a></li> <li><a href="#optimization-2-store-distances-in-a-grid">Optimization 2: Store distances in a <code>Grid</code></a></li> <li><a href="#pretty-pictures">Pretty pictures</a></li> </ul> </li> <li><a href="#part-2">Part 2</a> <ul> <li><a href="#optimization-3-store-distances-in-a-grid">Optimization 3: Store distances in a <code>Grid</code></a></li> <li><a href="#optimization-4-inverting-the-loop">Optimization 4: Inverting the loop</a></li> <li><a href="#prettier-pictures">Prettier pictures</a></li> </ul> </li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Given a maze with exactly one path, find how many single walls you can walk through (remove) that shorten the best path by at least 100 units.</p> </blockquote>Alcatraz Versus the Scrivener's Boneshttps://blog.jverkamp.com/2024/12/20/alcatraz-versus-the-scriveners-bones/Fri, 20 Dec 2024 00:00:00 +0000https://blog.jverkamp.com/2024/12/20/alcatraz-versus-the-scriveners-bones/<blockquote> <p>Once there was a bunny. This bunny had a birthday party. It was the bestest birthday party ever. Because that was the day the bunny got a bazooka.</p> <p>The bunny loved his bazooka. He blew up all sorts of things on the farm. He blew up the stable of Henrietta the Horse. He blew up the pen of Pugsly the Pig. He blew up the coop of Chuck the Chicken.</p> <p>&ldquo;I have the bestest bazooka ever,&rdquo; the bunny said. Then the farm friends proceeded to beat him senseless and steal his bazooka. It was the happiest day of his life.</p> <p>The end.</p> <p>Epilogue: Pugsly the Pig, now without a pen, was quite annoyed. When none of the others were looking, he stole the bazooka. He tied a bandana on his head and swore vengeance for what had been done to him.</p> <p>&ldquo;From this day on,&rdquo; he whispered, raising the bazooka, &ldquo;I shall be known as Hambo.</p> </blockquote> <p><a href="https://blog.jverkamp.com/2024/11/10/alcatraz-versus-the-evil-librarians/">Alcatraz Versus the Evil Librarians</a> introduced us to the world, now in Alcatraz Versus the Scrivener&rsquo;s Bones we actually get to live in it! A bit. Sort of.</p> <blockquote> <p>(Hushlanders, it might be noted, aren’t very imaginative with their idioms. Personally, I say, “Out of the frying pan and into the deadly pit filled with sharks who are wielding chainsaws with killer kittens stapled to them.” However, that one’s having a rough time catching on.)</p> </blockquote> <p>Essentially, the entire book is an adventure where Alcatraz and co (Bastille, but also newcomers Australia<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> and Kaz) are on a mission to mention a recently missing Grandpa Smedry. One thing leads to another, they end up in the <a href="https://en.wikipedia.org/wiki/Library%20of%20Alexandria">Library of Alexandria</a>&ndash;which got totally Tardis&rsquo;ed&ndash;and discover all sorts of spooky ghosts, ancient scrolls, hidden messages, &hellip; and more.</p> <blockquote> <p>Not all librarians are evil cultists. Some librarians are instead vengeful undead who want to suck your soul.</p> </blockquote>Ready Player Onehttps://blog.jverkamp.com/2024/12/19/ready-player-one/Thu, 19 Dec 2024 22:00:00 +0000https://blog.jverkamp.com/2024/12/19/ready-player-one/<p>Oh hey, that&rsquo;s a DeLorean! I should go re-watch Back to the Future.</p> <p>Ready Player One is a very pretty movie (I seem to be saying that [a lot]) recently) and absolutely chock full of pop culture references&hellip; which honestly felt rather overdone. The plot is thin and the world doesn&rsquo;t <em>really</em> make sense, although I did enjoy the characters well enough.</p>AoC 2024 Day 19: Regexinatorhttps://blog.jverkamp.com/2024/12/19/aoc-2024-day-19-regexinator/Thu, 19 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/19/aoc-2024-day-19-regexinator/<h2 id="source-day-19-linen-layouthttpsadventofcodecom2024day19">Source: <a href="https://adventofcode.com/2024/day/19" target="_blank" rel="noopener">Day 19: Linen Layout</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day19.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-19-linen-layouthttpsadventofcodecom2024day19">Source: <a href="https://adventofcode.com/2024/day/19">Day 19: Linen Layout</a></a></li> <li><a href="#part-1">Part 1</a> <ul> <li><a href="#lets-write-it-ourselves-backtracking">Let&rsquo;s write it ourselves: Backtracking</a></li> <li><a href="#optimization-1-simplified-backtracking">Optimization 1: Simplified backtracking</a></li> <li><a href="#optimization-2-memoization">Optimization 2: Memoization</a></li> </ul> </li> <li><a href="#part-2">Part 2</a></li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Given a comma delimited list of substrings and a list of strings, count how many of the latter strings can be made up of any (repeating) combination of the former.</p> </blockquote>AoC 2024 Day 18: Last Chancinatorhttps://blog.jverkamp.com/2024/12/18/aoc-2024-day-18-last-chancinator/Wed, 18 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/18/aoc-2024-day-18-last-chancinator/<h2 id="source-day-18-ram-runhttpsadventofcodecom2024day18">Source: <a href="https://adventofcode.com/2024/day/18" target="_blank" rel="noopener">Day 18: RAM Run</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day18.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-18-ram-runhttpsadventofcodecom2024day18">Source: <a href="https://adventofcode.com/2024/day/18">Day 18: RAM Run</a></a></li> <li><a href="#part-1">Part 1</a> <ul> <li><a href="#optimization-1-using-grid">Optimization 1: Using <code>Grid</code></a></li> </ul> </li> <li><a href="#part-2">Part 2</a> <ul> <li><a href="#optimization-2-two-neighbors">Optimization 2: Two neighbors</a></li> <li><a href="#optimization-3-using-grid">Optimization 3: Using <code>Grid</code></a></li> <li><a href="#optimization-4-on-the-best-path">Optimization 4: On the best path</a></li> <li><a href="#optimization-5-binary-search">Optimization 5: Binary search</a></li> </ul> </li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>You are given a series of points on a <code>71x71</code> grid. Taking only the first 1024 points, how long is the shortest path from <code>(0, 0)</code> to <code>(70, 70)</code>?</p> </blockquote>AoC 2024 Day 17: Virtual Machininatorhttps://blog.jverkamp.com/2024/12/17/aoc-2024-day-17-virtual-machininator/Tue, 17 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/17/aoc-2024-day-17-virtual-machininator/<h2 id="source-day-17-chronospatial-computerhttpsadventofcodecom2024day17">Source: <a href="https://adventofcode.com/2024/day/17" target="_blank" rel="noopener">Day 17: Chronospatial Computer</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day17.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-17-chronospatial-computerhttpsadventofcodecom2024day17">Source: <a href="https://adventofcode.com/2024/day/17">Day 17: Chronospatial Computer</a></a></li> <li><a href="#part-1">Part 1</a> <ul> <li><a href="#instructions">Instructions</a></li> <li><a href="#parameter-specification">Parameter specification</a></li> <li><a href="#unit-tests">Unit tests</a></li> </ul> </li> <li><a href="#part-2">Part 2</a> <ul> <li><a href="#so-what-is-our-program-actually-doing">So what is our program actually doing?</a></li> <li><a href="#psuedo-code-hash">Psuedo-code hash</a></li> <li><a href="#whats-actually-changing">What&rsquo;s actually changing?</a></li> <li><a href="#zero-guarantees">Zero guarantees</a></li> <li><a href="#the-actual-answer">The actual answer</a></li> </ul> </li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Implement a virtual machine. The machine will have 3 unbounded signed registers, 8 opcodes (see below), a variable parameter scheme (see below that). You will be given the initial values of the 3 registers and a program. Find the final output.</p> </blockquote> <h3 id="instructions">Instructions</h3> <table> <thead> <tr> <th>Opcode</th> <th>Instruction</th> <th>Description</th> <th>Notes</th> </tr> </thead> <tbody> <tr> <td>0</td> <td><code>adv reg/val</code></td> <td><code>A = A &gt;&gt; OP</code></td> <td></td> </tr> <tr> <td>1</td> <td><code>bxl val</code></td> <td><code>B = B ^ OP</code></td> <td></td> </tr> <tr> <td>2</td> <td><code>bst reg/val</code></td> <td><code>B = OP &amp; 0b111</code></td> <td></td> </tr> <tr> <td>3</td> <td><code>jnz val</code></td> <td>If <code>a =/= 0</code>, jump to <code>LIT</code></td> <td></td> </tr> <tr> <td>4</td> <td><code>bxc ignore</code></td> <td><code>B = B ^ C</code></td> <td>Still takes param, but ignores it</td> </tr> <tr> <td>5</td> <td><code>out reg/val</code></td> <td>Output <code>b</code></td> <td>Only outputs lowest 3 bits</td> </tr> <tr> <td>6</td> <td><code>bdv reg/val</code></td> <td><code>B = A &gt;&gt; OP</code></td> <td>Same as <code>adv</code> but writes to <code>b</code></td> </tr> <tr> <td>7</td> <td><code>cdv reg/val</code></td> <td><code>C = A &gt;&gt; OP</code></td> <td>Same as <code>adv</code> but writes to <code>c</code></td> </tr> </tbody> </table> <h3 id="parameter-specification">Parameter specification</h3> <p>For instructions that can take <code>reg/val</code>, <code>0</code> to <code>3</code> (inclusive) are treated as literal values, <code>4</code> is register <code>A</code>, <code>5</code> is <code>B</code>, <code>6</code>, is <code>C</code>, and <code>7</code> is an error (should never happen).</p> <p>For instructions that only take <code>val</code>, it&rsquo;s always a literal value in the range <code>0</code> to <code>7</code> (inclusive).</p>AoC 2024 Day 16: Astarinatorhttps://blog.jverkamp.com/2024/12/16/aoc-2024-day-16-astarinator/Mon, 16 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/16/aoc-2024-day-16-astarinator/<h2 id="source-day-16-reindeer-mazehttpsadventofcodecom2024day16">Source: <a href="https://adventofcode.com/2024/day/16" target="_blank" rel="noopener">Day 16: Reindeer Maze</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day16.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-16-reindeer-mazehttpsadventofcodecom2024day16">Source: <a href="https://adventofcode.com/2024/day/16">Day 16: Reindeer Maze</a></a></li> <li><a href="#part-1">Part 1</a> <ul> <li><a href="#optimization-1-a">Optimization 1: A*</a></li> </ul> </li> <li><a href="#part-2">Part 2</a></li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Given a maze, what is the shortest path between <code>S</code> and <code>E</code> where walking straight costs one and turning costs 1000.</p> </blockquote>AoC 2024 Day 15: Sokobaninatorhttps://blog.jverkamp.com/2024/12/15/aoc-2024-day-15-sokobaninator/Sun, 15 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/15/aoc-2024-day-15-sokobaninator/<h2 id="source-day-15-warehouse-woeshttpsadventofcodecom2024day15">Source: <a href="https://adventofcode.com/2024/day/15" target="_blank" rel="noopener">Day 15: Warehouse Woes</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day15.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-15-warehouse-woeshttpsadventofcodecom2024day15">Source: <a href="https://adventofcode.com/2024/day/15">Day 15: Warehouse Woes</a></a></li> <li><a href="#part-1">Part 1</a></li> <li><a href="#part-2">Part 2</a></li> <li><a href="#wiiiiiiiider">WIIIIIIIIDER</a></li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Given a warehouse containing floors (<code>.</code>), walls (<code>#</code>), boxes (<code>O</code>), and the player (<code>@</code>) plus a series of instructions <code>^V&lt;&gt;</code>, move the player according to the instructions, pushing boxes (which in turn can push more boxes).</p> <p>Calculate the sum of <code>y * 100 + x</code> for each box&rsquo;s final position.</p> </blockquote>The Rings of Power: Season 2https://blog.jverkamp.com/2024/12/14/the-rings-of-power-season-2/Sat, 14 Dec 2024 23:55:00 +0000https://blog.jverkamp.com/2024/12/14/the-rings-of-power-season-2/<p>There are <em>way</em> too many storylines in this show. For episodes at a time, we may not see elves. Or dwarves. Or Gandalf-but-still-not-Gandalf. I keep getting to the start of an episode and thinking &lsquo;oh hey, we haven&rsquo;t seen them in a while&rsquo;. But the interesting thing is that I got to the end of the episodes!</p> <p>Overall, it&rsquo;s what we saw in the first season, but even more so. There are so many different threads and events&ndash;things separated by decades if not centuries in the original works all crammed together.</p> <p>But on the other hand, we get more rings! (Up from zero 😄) We get bigger battles! (Not quite Helm&rsquo;s Deep, but close) More Tom Bombadil! (You&rsquo;ll just have to watch to see if you think I&rsquo;m making that one up) And we get more &hellip; humanized orcs with families and children? I&rsquo;m &hellip; not entirely sure what to think about it.</p> <p>Overall&hellip; it mostly reminds me just <em>good</em> the Peter Jackson movies were. But it&rsquo;s certainly watchable and I&rsquo;ll catch whatever season(s) come next. Onward!</p>AoC 2024 Day 14: Chaosinatorhttps://blog.jverkamp.com/2024/12/14/aoc-2024-day-14-chaosinator/Sat, 14 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/14/aoc-2024-day-14-chaosinator/<h2 id="source-day-14-restroom-redoubthttpsadventofcodecom2024day14">Source: <a href="https://adventofcode.com/2024/day/14" target="_blank" rel="noopener">Day 14: Restroom Redoubt</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day14.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-14-restroom-redoubthttpsadventofcodecom2024day14">Source: <a href="https://adventofcode.com/2024/day/14">Day 14: Restroom Redoubt</a></a></li> <li><a href="#part-1">Part 1</a></li> <li><a href="#part-2">Part 2</a> <ul> <li><a href="#optimization-1-weird-shape-detection">Optimization 1: Weird shape detection</a></li> <li><a href="#correction-for-optimization-1-chinese-remainder-theorem">Correction for Optimization 1: Chinese Remainder Theorem</a></li> </ul> </li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Given a series of robots defined with initial <code>position</code> and <code>velocity</code> on a 101x103 <a href="https://en.wikipedia.org/wiki/toroidal">toroidal</a> grid, calculate where the robots will be after 100 iterations. Return the product of the number of robots in each <a href="https://en.wikipedia.org/wiki/quadrant">quadrant</a> of the final grid, ignoring the middle lines (since they&rsquo;re odd).</p> </blockquote>Alita: Battle Angelhttps://blog.jverkamp.com/2024/12/13/alita-battle-angel/Fri, 13 Dec 2024 20:00:00 +0000https://blog.jverkamp.com/2024/12/13/alita-battle-angel/<p>That is a very pretty movie. The city had a great aesthetic. I loved the variety of cyborgs, many just trying to live their lives (in the background) or&hellip; becoming ridiculously overdone weapons platforms. And I especially loved Motorball!</p> <p>Characterwise, Rosa Salazar as Alita really carried the show. I actually really enjoyed the oversized eyes (true to the manga apparently?) and her whole way of interacting with the world, the way she fights, the way she <em>moves</em>. It&rsquo;s a fascinating combination of innocence and excellence.</p> <p>Other than that&hellip; I wanted to like Christoph Walz&rsquo;s Dr. Ido more than I did&ndash;he&rsquo;s generally a wonderful actor, but I feel he just didn&rsquo;t have much to do. Likwise, Jennifer Connelly&rsquo;s Chiren. I did enjoy Mahershala Alis&rsquo; Vector and most of the evil cyborgs. They did a good job of evil/menacing!</p> <p>Plotwise? Straight forward. And the ending&hellip; really is asking for a sequel that so far as I know isn&rsquo;t coming. It&rsquo;d be neat! But you can&rsquo;t just end a movie like that! Really leaves a poor taste on an otherwise quiet enjoyable movie.</p> <p>So it goes.</p> <p>Onward!</p>AoC 2024 Day 13: Cramerinatorhttps://blog.jverkamp.com/2024/12/13/aoc-2024-day-13-cramerinator/Fri, 13 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/13/aoc-2024-day-13-cramerinator/<h2 id="source-day-13-claw-contraptionhttpsadventofcodecom2024day13">Source: <a href="https://adventofcode.com/2024/day/13" target="_blank" rel="noopener">Day 13: Claw Contraption</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day13.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-13-claw-contraptionhttpsadventofcodecom2024day13">Source: <a href="https://adventofcode.com/2024/day/13">Day 13: Claw Contraption</a></a></li> <li><a href="#part-1">Part 1</a> <ul> <li><a href="#optimization-1-cramers-rule">Optimization 1: Cramer&rsquo;s Rule</a></li> </ul> </li> <li><a href="#part-2">Part 2</a></li> <li><a href="#benchmarks">Benchmarks</a></li> <li><a href="#optimization-2-really-going-off-the-deep-end">Optimization 2: Really going off the deep end</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Given Button A <code>(ax, ay)</code>, Button B <code>(bx, by)</code>, and Prize <code>(px, py)</code>; how many times must you press Button A (<code>a</code>) and Button B (<code>b</code>) to reach the Prize? Sum <code>3a + b</code> for each machine that has a solution.</p> </blockquote>AoC 2024 Day 12: Edginatorhttps://blog.jverkamp.com/2024/12/12/aoc-2024-day-12-edginator/Thu, 12 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/12/aoc-2024-day-12-edginator/<h2 id="source-day-12-garden-groupshttpsadventofcodecom2024day12">Source: <a href="https://adventofcode.com/2024/day/12" target="_blank" rel="noopener">Day 12: Garden Groups</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day12.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-12-garden-groupshttpsadventofcodecom2024day12">Source: <a href="https://adventofcode.com/2024/day/12">Day 12: Garden Groups</a></a></li> <li><a href="#part-1">Part 1</a></li> <li><a href="#part-2">Part 2</a> <ul> <li><a href="#optimization-1-detect-corners-instead-of-edges">Optimization 1: Detect corners instead of edges</a></li> </ul> </li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Given a <code>Grid</code> of regions, calculate the sum of the product <code>perimeter * area</code> for each region.</p> </blockquote>AoC 2024 Day 11: Exponential Growthinatorhttps://blog.jverkamp.com/2024/12/11/aoc-2024-day-11-exponential-growthinator/Wed, 11 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/11/aoc-2024-day-11-exponential-growthinator/<h2 id="source-day-11-plutonian-pebbleshttpsadventofcodecom2024day11">Source: <a href="https://adventofcode.com/2024/day/11" target="_blank" rel="noopener">Day 11: Plutonian Pebbles</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day11.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-11-plutonian-pebbleshttpsadventofcodecom2024day11">Source: <a href="https://adventofcode.com/2024/day/11">Day 11: Plutonian Pebbles</a></a></li> <li><a href="#part-1">Part 1</a> <ul> <li><a href="#optimization-1-recursion">Optimization 1: Recursion</a></li> <li><a href="#optimization-2-memoization">Optimization 2: Memoization</a></li> </ul> </li> <li><a href="#part-2">Part 2</a> <ul> <li><a href="#optimization-attempt-3-association-list-cache">Optimization (attempt) 3: Association list cache</a></li> <li><a href="#optimization-attempt-4-btree-cache">Optimization (attempt) 4: <code>BTree</code> cache</a></li> <li><a href="#optimization-5-iterate-over-hashmapvalue-count">Optimization 5: Iterate over <code>HashMap&lt;value, count&gt;</code></a></li> </ul> </li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Given a sequence of values <code>v_n</code>, replace each value with the first matching rule:</p> <ul> <li><code>if v = 0 -&gt; 1</code></li> <li>If <code>v</code> has an even number of digits, split it (so <code>v = 8675</code> becomes <code>[86, 75]</code>)</li> <li>Otherwise, <code>v -&gt; v * 2024</code></li> </ul> <p>Calculate how many elements are in the sequence after 25 iterations.</p> </blockquote>AoC 2024 Day 10: Take-a-Hikinatorhttps://blog.jverkamp.com/2024/12/10/aoc-2024-day-10-take-a-hikinator/Tue, 10 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/10/aoc-2024-day-10-take-a-hikinator/<h2 id="source-day-10-hoof-ithttpsadventofcodecom2024day10">Source: <a href="https://adventofcode.com/2024/day/10" target="_blank" rel="noopener">Day 10: Hoof It</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day10.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-10-hoof-ithttpsadventofcodecom2024day10">Source: <a href="https://adventofcode.com/2024/day/10">Day 10: Hoof It</a></a></li> <li><a href="#part-1">Part 1</a> <ul> <li><a href="#optimization-1-using-dynamic-programming">Optimization 1: Using dynamic programming</a></li> <li><a href="#optimization-2-smarter-bitmasks">Optimization 2: Smarter bitmasks</a></li> </ul> </li> <li><a href="#part-2">Part 2</a></li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Given a heightmap (<code>0</code> to <code>9</code>), for each <code>0</code> count how many <code>9</code> you can reach on paths that only ever increase height by exactly 1 at a time. Sum these values.</p> </blockquote>AoC 2024 Day 9: Defraginatorhttps://blog.jverkamp.com/2024/12/09/aoc-2024-day-9-defraginator/Mon, 09 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/09/aoc-2024-day-9-defraginator/<h2 id="source-day-9-disk-fragmenterhttpsadventofcodecom2024day9">Source: <a href="https://adventofcode.com/2024/day/9" target="_blank" rel="noopener">Day 9: Disk Fragmenter</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day9.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-9-disk-fragmenterhttpsadventofcodecom2024day9">Source: <a href="https://adventofcode.com/2024/day/9">Day 9: Disk Fragmenter</a></a></li> <li><a href="#part-1">Part 1</a></li> <li><a href="#part-2">Part 2</a> <ul> <li><a href="#optimization-attempt-1-btree-representation">Optimization (attempt) 1: BTree representation</a></li> </ul> </li> <li><a href="#optimization-2-track-the-leftmost-empty-space">Optimization 2: Track the leftmost empty space</a></li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Given a disk layout alternating between files and empty spaces, move all files as early on the disk is possible, splitting into multiple blocks. Return a checksum on the disk.</p> <p>Alternating means: <code>23331</code> would mean a 2 block file, 3 empty, a 3 block file, 3 empty, and a 1 block file.</p> <p>The checksum is the sum of <code>file_id * block_index</code> for all occupied blocks. File IDs are assigned sequentially on initial generation.</p> </blockquote>AoC 2024 Day 8: Vectorinatorhttps://blog.jverkamp.com/2024/12/08/aoc-2024-day-8-vectorinator/Sun, 08 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/08/aoc-2024-day-8-vectorinator/<h2 id="source-day-8-resonant-collinearityhttpsadventofcodecom2024day8">Source: <a href="https://adventofcode.com/2024/day/8" target="_blank" rel="noopener">Day 8: Resonant Collinearity</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day8.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-8-resonant-collinearityhttpsadventofcodecom2024day8">Source: <a href="https://adventofcode.com/2024/day/8">Day 8: Resonant Collinearity</a></a></li> <li><a href="#part-1">Part 1</a></li> <li><a href="#part-2">Part 2</a></li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Given a grid with either open tiles (<code>.</code>) or towers (anything else), for each pair of towers, there is an antinode at each of the points that is 2x as far from one tower as the other. How many antinodes are there still within the bounds of the map?</p> </blockquote>AoC 2024 Day 7: Mathinatorhttps://blog.jverkamp.com/2024/12/07/aoc-2024-day-7-mathinator/Sat, 07 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/07/aoc-2024-day-7-mathinator/<h2 id="source-day-7-bridge-repairhttpsadventofcodecom2024day7">Source: <a href="https://adventofcode.com/2024/day/7" target="_blank" rel="noopener">Day 7: Bridge Repair</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day7.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-7-bridge-repairhttpsadventofcodecom2024day7">Source: <a href="https://adventofcode.com/2024/day/7">Day 7: Bridge Repair</a></a></li> <li><a href="#part-1">Part 1</a> <ul> <li><a href="#optimization-attempt-1-queue">Optimization (attempt) 1: Queue</a></li> </ul> </li> <li><a href="#part-2">Part 2</a></li> <li><a href="#a-cleaner-way-of-looking-at-it-opset">A &lsquo;cleaner&rsquo; way of looking at it: <code>OpSet</code></a></li> <li><a href="#benchmarks">Benchmarks</a></li> <li><a href="#future-work">Future work</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>Given a result and a list of numbers, determine if any combination of addition (<code>+</code>) and/or multiplication (<code>*</code>) using all the given numbers in order can return the result. Ignore order of operations.</p> </blockquote>AoC 2024 Day 6: Wanderinatorhttps://blog.jverkamp.com/2024/12/06/aoc-2024-day-6-wanderinator/Fri, 06 Dec 2024 00:00:03 +0000https://blog.jverkamp.com/2024/12/06/aoc-2024-day-6-wanderinator/<h2 id="source-day-6-guard-gallivanthttpsadventofcodecom2024day6">Source: <a href="https://adventofcode.com/2024/day/6" target="_blank" rel="noopener">Day 6: Guard Gallivant</a></h2> <p><a href="https://github.com/jpverkamp/advent-of-code/blob/master/2024/src/day6.rs" target="_blank" rel="noopener">Full solution</a> for today (spoilers!).</p> <nav id="TableOfContents"> <ul> <li><a href="#source-day-6-guard-gallivanthttpsadventofcodecom2024day6">Source: <a href="https://adventofcode.com/2024/day/6">Day 6: Guard Gallivant</a></a></li> <li><a href="#part-1">Part 1</a> <ul> <li><a href="#direction"><code>Direction</code></a></li> <li><a href="#point"><code>Point</code></a></li> <li><a href="#actually-solving-the-problem">Actually solving the problem</a></li> </ul> </li> <li><a href="#part-2">Part 2</a> <ul> <li><a href="#optimization-1-only-checking-the-path">Optimization 1: Only checking the path</a></li> <li><a href="#optimization-2-rayon-parallelization">Optimization 2: Rayon parallelization</a></li> <li><a href="#optimization-3-avoiding-clone">Optimization 3: Avoiding clone</a></li> <li><a href="#optimization-4-no-hash">Optimization 4: No hash</a></li> </ul> </li> <li><a href="#benchmarks">Benchmarks</a></li> </ul> </nav> <h2 id="part-1">Part 1</h2> <blockquote> <p>You are given a grid of walls (<code>#</code>), floors (<code>.</code>), and a guard (<code>^</code>, initially facing up/north). The guard walks forward until they run into a wall at which point they turn right. How many tiles does the guard reach before leaving the map.</p> </blockquote>