<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Programming on jverkamp.com</title><link>https://blog.jverkamp.com/programming/</link><description>Recent content in Programming on jverkamp.com</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 04 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.jverkamp.com/programming/atom.xml" rel="self" type="application/rss+xml"/><item><title>Rescuing Gentoos with a Rust Solver (Part 3)</title><link>https://blog.jverkamp.com/2026/04/04/rescuing-gentoos-with-a-rust-solver-part-3/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/04/04/rescuing-gentoos-with-a-rust-solver-part-3/</guid><description>&lt;p&gt;Part 3! Wherein we learn about rockets, recursion, and ricocheting items (oh my). And make it to &amp;hellip; the end?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/rust-solvers/compare/0f50b8f298b5a13bd9d8ea0ad6222fbb5eed5a93...080330ab8b19dcb8f73e648a92c878162a0e30fc" target="_blank" rel="noopener"&gt;Here are all of the commits&lt;/a&gt; from part 1 up through part 3.&lt;/p&gt;
&lt;p&gt;And here are all of the parts in this series so far:&lt;/p&gt;
&lt;div class="ranking"&gt;
 &lt;h3 class="title"&gt;Posts in &lt;a href="https://blog.jverkamp.com/series/solving-gentoo-rescue/"&gt;Solving Gentoo Rescue&lt;/a&gt;:&lt;/h3&gt;
 &lt;div class="content"&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://blog.jverkamp.com/2026/03/25/rescuing-gentoos-with-a-rust-solver-part-1/"&gt;
 Rescuing Gentoos with a Rust Solver (Part 1)
 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://blog.jverkamp.com/2026/03/31/rescuing-gentoos-with-a-rust-solver-part-2/"&gt;
 Rescuing Gentoos with a Rust Solver (Part 2)
 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://blog.jverkamp.com/2026/04/04/rescuing-gentoos-with-a-rust-solver-part-3/"&gt;
 Rescuing Gentoos with a Rust Solver (Part 3)
 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Rescuing Gentoos with a Rust Solver (Part 2)</title><link>https://blog.jverkamp.com/2026/03/31/rescuing-gentoos-with-a-rust-solver-part-2/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/03/31/rescuing-gentoos-with-a-rust-solver-part-2/</guid><description>&lt;p&gt;And here we have Part 2! It&amp;rsquo;s not been that long for you, but since the first part took six months for me to actually get around to writing it&amp;hellip; well, this is much better!&lt;/p&gt;
&lt;p&gt;Things get a bit more complicated this time, with buttons that can open/close doors and even holes in the floor and BOMBS. But what&amp;rsquo;s really crazy is how we actually get around to solving how to get to new sublevels this time&amp;hellip; and how to take penguins back out of them. Things are getting complicated!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/rust-solvers/compare/915df5e61c8bd2167d4306a589e10166394d24b4...0f50b8f298b5a13bd9d8ea0ad6222fbb5eed5a93" target="_blank" rel="noopener"&gt;Here are all of the commits&lt;/a&gt; from part 1 up through part 2.&lt;/p&gt;
&lt;p&gt;And here are all of the parts in this series so far:&lt;/p&gt;
&lt;div class="ranking"&gt;
 &lt;h3 class="title"&gt;Posts in &lt;a href="https://blog.jverkamp.com/series/solving-gentoo-rescue/"&gt;Solving Gentoo Rescue&lt;/a&gt;:&lt;/h3&gt;
 &lt;div class="content"&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://blog.jverkamp.com/2026/03/25/rescuing-gentoos-with-a-rust-solver-part-1/"&gt;
 Rescuing Gentoos with a Rust Solver (Part 1)
 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://blog.jverkamp.com/2026/03/31/rescuing-gentoos-with-a-rust-solver-part-2/"&gt;
 Rescuing Gentoos with a Rust Solver (Part 2)
 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://blog.jverkamp.com/2026/04/04/rescuing-gentoos-with-a-rust-solver-part-3/"&gt;
 Rescuing Gentoos with a Rust Solver (Part 3)
 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Rescuing Gentoos with a Rust Solver (Part 1)</title><link>https://blog.jverkamp.com/2026/03/25/rescuing-gentoos-with-a-rust-solver-part-1/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/03/25/rescuing-gentoos-with-a-rust-solver-part-1/</guid><description>&lt;p&gt;Months ago now&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;, I started playing &lt;a href="https://store.steampowered.com/app/2830480/Gentoo_Rescue/" target="_blank" rel="noopener"&gt;Gentoo Rescue&lt;/a&gt; (after seeing the &lt;a href="https://www.youtube.com/watch?v=XK9AhMh5K_o&amp;amp;list=PLIwiAebpd5CIoqMDun9X7aMJIINeHT4Vz&amp;amp;index=1" target="_blank" rel="noopener"&gt;Aliensrock video&lt;/a&gt;). At the core, it&amp;rsquo;s a Sokoban style puzzle game where you have to guide cute little sliding penguins to their color coded nests&amp;hellip; but oh man does it start getting more complicated quickly.&lt;/p&gt;
&lt;p&gt;On top of that, it has a really interesting nesting level concept&amp;ndash;the level select screens are levels themselves. You can go several &amp;rsquo;levels&amp;rsquo; deep into levels or eventually further back out. And that&amp;rsquo;s just with how far I&amp;rsquo;ve gotten so far&amp;hellip;&lt;/p&gt;</description></item><item><title>Syncing Kobo Annotations... again!</title><link>https://blog.jverkamp.com/2026/03/16/syncing-kobo-annotations...-again/</link><pubDate>Mon, 16 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/03/16/syncing-kobo-annotations...-again/</guid><description>&lt;p&gt;A few months back, I gave a &lt;a href="https://www.kobo.com/" target="_blank" rel="noopener"&gt;Kobo&lt;/a&gt; a try. I&amp;rsquo;m still really enjoying it. At the time, I was using &lt;a href="https://blog.jverkamp.com/2025/12/29/syncing-kobo-annotations/"&gt;a script on the Kobo &amp;#43; Dropbox&lt;/a&gt; to sync annotations. But it was a little heavy (to send the entire database) and tended to fail silently. Plus, I had to use a second script to take the exported database and actually turn it into Markdown I could easily read and share.&lt;/p&gt;
&lt;p&gt;So I took a chance to make that a bit better!&lt;/p&gt;
&lt;p&gt;The code for this is available on Github here: &lt;a href="https://github.com/jpverkamp/kobo-highlights/" target="_blank" rel="noopener"&gt;https://github.com/jpverkamp/kobo-highlights/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Genuary 2026: And so it ends</title><link>https://blog.jverkamp.com/2026/01/31/genuary-2026-and-so-it-ends/</link><pubDate>Sat, 31 Jan 2026 23:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/31/genuary-2026-and-so-it-ends/</guid><description>&lt;p&gt;I just wanted to make a quick montage of all 31 sketches:&lt;/p&gt;
&lt;p&gt;You can combine all of the preview images and then add some nice text with a pair of &lt;a href=""&gt;imagemagick&lt;/a&gt; commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;montage content/programming/2026/genuary/*/gen26.??.png &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -tile 6x6 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -geometry +2+2 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -background none &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gen26-grid.png
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mogrify &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -gravity southeast &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -pointsize &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -fill &lt;span style="color:#e6db74"&gt;&amp;#34;white&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -stroke &lt;span style="color:#e6db74"&gt;&amp;#34;black&amp;#34;&lt;/span&gt; -strokewidth &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -annotate +20+20 &lt;span style="color:#e6db74"&gt;&amp;#34;Genuary 2026&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gen26-grid.png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Genuary 2026.31: Shader</title><link>https://blog.jverkamp.com/2026/01/31/genuary-2026.31-shader/</link><pubDate>Sat, 31 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/31/genuary-2026.31-shader/</guid><description>&lt;p&gt;I have very little experience with &lt;a href="https://en.wikipedia.org/wiki/graphics%20shaders"&gt;graphics shaders&lt;/a&gt;, but I&amp;rsquo;d like to learn. Perhaps I&amp;rsquo;ll take a month to redo all these prompts with shaders. That&amp;rsquo;d be neat.&lt;/p&gt;
&lt;p&gt;But for now, one shader, messing around a bit.&lt;/p&gt;</description></item><item><title>Genuary 2026.30: Bug</title><link>https://blog.jverkamp.com/2026/01/30/genuary-2026.30-bug/</link><pubDate>Fri, 30 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/30/genuary-2026.30-bug/</guid><description>&lt;p&gt;A throwback to what&amp;rsquo;s probably one of my earliest programming projects (originally in &lt;a href="https://en.wikipedia.org/wiki/qbasic"&gt;qbasic&lt;/a&gt;&amp;hellip;): bugs!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s very simple: each frame, each bug moves randomly and the draws a dot.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s really it.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve updated it a bit with various parameters to tweak. Play with them. See what they do!&lt;/p&gt;</description></item><item><title>Genuary 2026.29: Evolution</title><link>https://blog.jverkamp.com/2026/01/29/genuary-2026.29-evolution/</link><pubDate>Thu, 29 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/29/genuary-2026.29-evolution/</guid><description>&lt;p&gt;That got quite a bit more than I expected. So now it&amp;rsquo;s basically an evolving programmatic image generator. &amp;#x1f604;&lt;/p&gt;</description></item><item><title>Genuary 2026.28: No Libraries, No Canvas</title><link>https://blog.jverkamp.com/2026/01/28/genuary-2026.28-no-libraries-no-canvas/</link><pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/28/genuary-2026.28-no-libraries-no-canvas/</guid><description>&lt;p&gt;Whelp. I&amp;rsquo;m not a fan of that, but it was interesting enough. I got to brush off my &lt;a href="https://blog.jverkamp.com/2021/01/27/a-tabbed-view-for-hugo/"&gt;tabbed view code&lt;/a&gt;. And do some weird things with CSS. Whee?&lt;/p&gt;</description></item><item><title>Genuary 2026.27: Lifeform</title><link>https://blog.jverkamp.com/2026/01/27/genuary-2026.27-lifeform/</link><pubDate>Tue, 27 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/27/genuary-2026.27-lifeform/</guid><description>&lt;p&gt;So this one really fits better for &lt;a href="https://blog.jverkamp.com/2026/01/25/genuary-2026.25-organic-geometry/"&gt;Genuary 2026.25: Organic Geometry&lt;/a&gt; and that one is a lifeform like this one, so&amp;hellip; we&amp;rsquo;ll consider them swapped or something.&lt;/p&gt;
&lt;p&gt;Anyways, spawn branching nodes and draw a bunch of squares. Not only an organic looking lifeform but creepy to boot! I do love it without borders and with fade.&lt;/p&gt;
&lt;p&gt;Be careful with high child count without either a high segment length or death rate to compensate, it will get slow.&lt;/p&gt;</description></item><item><title>Genuary 2026.26: Recursive Grids</title><link>https://blog.jverkamp.com/2026/01/26/genuary-2026.26-recursive-grids/</link><pubDate>Mon, 26 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/26/genuary-2026.26-recursive-grids/</guid><description>&lt;p&gt;A favorite technique of mine. I&amp;rsquo;ve already done it on &lt;a href="https://blog.jverkamp.com/2026/01/05/genuary-2026.05-write-genuary/"&gt;day 5&lt;/a&gt;, &lt;a href="https://blog.jverkamp.com/2026/01/07/genuary-2026.07-boolean-algebra/"&gt;day 7&lt;/a&gt;, and &lt;a href="https://blog.jverkamp.com/2026/01/13/genuary-2026.13-self-portrait/"&gt;day 13&lt;/a&gt;. But now we can go one a-maze-ing step further&amp;hellip;&lt;/p&gt;
&lt;p&gt;See what I did there? &amp;#x1f604;&lt;/p&gt;
&lt;p&gt;Basically: generate a maze. For each cell in the maze&amp;hellip; generate a smaller maze! Recursively.&lt;/p&gt;</description></item><item><title>Genuary 2026.25: Organic Geometry</title><link>https://blog.jverkamp.com/2026/01/25/genuary-2026.25-organic-geometry/</link><pubDate>Sun, 25 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/25/genuary-2026.25-organic-geometry/</guid><description>&lt;p&gt;So basically we have a simulation where each of n different species has a weight of attraction/repulsion for each other species. This is, by itself, enough to generate some pretty organic behavior!&lt;/p&gt;
&lt;p&gt;Edit: This one probably fits better for &lt;a href="https://blog.jverkamp.com/2026/01/27/genuary-2026.27-lifeform/"&gt;Genuary 2026.27: Lifeform&lt;/a&gt; and that one here.&lt;/p&gt;</description></item><item><title>Genuary 2026.24: Perfectionist's Nightmare</title><link>https://blog.jverkamp.com/2026/01/24/genuary-2026.24-perfectionists-nightmare/</link><pubDate>Sat, 24 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/24/genuary-2026.24-perfectionists-nightmare/</guid><description>&lt;p&gt;&lt;a href="?gridX=10&amp;amp;gridY=10&amp;amp;brick=false&amp;amp;rainbow=false&amp;amp;fadeIn=false&amp;amp;fadeOut=false&amp;amp;perfectlyImperfect=false"&gt;It started off&lt;/a&gt; with a neat grow of blocks and just sort of grew from there&amp;ndash;as these things seem wont to do.&lt;/p&gt;
&lt;p&gt;This is another one that really benefits from the animation, but it&amp;rsquo;s neat enough to see each simulation done.&lt;/p&gt;
&lt;p&gt;Try playing with the settings. &lt;a href="?gridX=2&amp;amp;gridY=100&amp;amp;maxActivationsPerFrame=10&amp;amp;rainbow=false&amp;amp;fadeIn=false&amp;amp;fadeOut=false&amp;amp;perfectlyImperfect=false"&gt;This one&lt;/a&gt; looks like a game of Pick Up Sticks. And &lt;a href="?gridX=70&amp;amp;gridY=100&amp;amp;maxActivationsPerFrame=100&amp;amp;rainbow=false&amp;amp;fadeIn=false&amp;amp;fadeOut=false"&gt;this one&lt;/a&gt; is just tiny brick chaos!&lt;/p&gt;</description></item><item><title>Genuary 2026.23: Transparency</title><link>https://blog.jverkamp.com/2026/01/23/genuary-2026.23-transparency/</link><pubDate>Fri, 23 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/23/genuary-2026.23-transparency/</guid><description>&lt;p&gt;&lt;a href="https://blog.jverkamp.com/2026/01/10/genuary-2026.10-polar-coordinates/"&gt;Genuary 2026.10: Polar coordinates&lt;/a&gt; did the transparency thing, but &amp;hellip; let&amp;rsquo;s do it again!&lt;/p&gt;
&lt;p&gt;This is one that really stands out when it&amp;rsquo;s animated.&lt;/p&gt;</description></item><item><title>Genuary 2026.22: Pen plotter ready</title><link>https://blog.jverkamp.com/2026/01/22/genuary-2026.22-pen-plotter-ready/</link><pubDate>Thu, 22 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/22/genuary-2026.22-pen-plotter-ready/</guid><description>&lt;p&gt;Split a polygon into triangles and then recursively split those triangles over and over again!&lt;/p&gt;</description></item><item><title>Genuary 2026.21: Bauhaus poster</title><link>https://blog.jverkamp.com/2026/01/21/genuary-2026.21-bauhaus-poster/</link><pubDate>Wed, 21 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/21/genuary-2026.21-bauhaus-poster/</guid><description>&lt;p&gt;A &lt;a href="https://en.wikipedia.org/wiki/Bauhaus"&gt;Bauhaus&lt;/a&gt; style poster.&lt;/p&gt;</description></item><item><title>Genuary 2026.20: One line</title><link>https://blog.jverkamp.com/2026/01/20/genuary-2026.20-one-line/</link><pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/20/genuary-2026.20-one-line/</guid><description>&lt;p&gt;One line&amp;hellip; that repeatedly splits, albeit without (mostly) crossing itself.&lt;/p&gt;
&lt;p&gt;Fractal trees GO!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;splitChance&lt;/code&gt; controls how quickly the line branches&lt;/li&gt;
&lt;li&gt;&lt;code&gt;minChildren&lt;/code&gt; / &lt;code&gt;maxChildren&lt;/code&gt; controls branching&lt;/li&gt;
&lt;li&gt;&lt;code&gt;angleRange&lt;/code&gt; is how many radians the new branches can change by&lt;/li&gt;
&lt;li&gt;&lt;code&gt;randomizeAngles&lt;/code&gt; controls if child angles are random/evenly spaced&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spacing&lt;/code&gt; is roughly how spread out the tree is&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pauseOnResetFor&lt;/code&gt; / &lt;code&gt;stopOnReset&lt;/code&gt; controls what happens when a tree is done&lt;/li&gt;
&lt;li&gt;&lt;code&gt;colorMode&lt;/code&gt; changes drawing colors&lt;/li&gt;
&lt;li&gt;&lt;code&gt;anchor&lt;/code&gt; changes where the tree starts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It does get a bit sluggish, especially if you have a high number of children.&lt;/p&gt;</description></item><item><title>Genuary 2026.19: 16x16</title><link>https://blog.jverkamp.com/2026/01/19/genuary-2026.19-16x16/</link><pubDate>Mon, 19 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/19/genuary-2026.19-16x16/</guid><description>&lt;p&gt;I&amp;rsquo;m&amp;hellip; not really sure where I was going with this one. &amp;#x1f604;&lt;/p&gt;
&lt;p&gt;Basically, 16x16 tiny sketches that slide around like a &lt;a href="https://en.wikipedia.org/wiki/sliding%20block%20puzzle"&gt;sliding block puzzle&lt;/a&gt;. Although with how chaotic some of the simulations are, it&amp;rsquo;s not always easy to see.&lt;/p&gt;</description></item><item><title>Genuary 2026.18: Unexpected paths</title><link>https://blog.jverkamp.com/2026/01/18/genuary-2026.18-unexpected-paths/</link><pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/18/genuary-2026.18-unexpected-paths/</guid><description>&lt;p&gt;I feel like the most unexpected of paths is &lt;a href="https://en.wikipedia.org/wiki/Langton%e2%80%99s%20Ant"&gt;Langton’s Ant&lt;/a&gt;!.&lt;/p&gt;
&lt;p&gt;Okay, it&amp;rsquo;s fairly expected. And I&amp;rsquo;ve even &lt;a href="https://blog.jverkamp.com/2014/08/07/langtons-ant/"&gt;done it before&lt;/a&gt;. Been a while though.&lt;/p&gt;
&lt;p&gt;Anyways, here we go!&lt;/p&gt;
&lt;p&gt;In a nutshell, you have a grid with N possible values (the length of the rule string). For each pattern, when the &amp;lsquo;ant&amp;rsquo; walks on that cell, the value in incremented by one and you will turn according to these rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;R&lt;/code&gt; turn right (90° or 60° in hex)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;L&lt;/code&gt; turn left (same)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;S&lt;/code&gt; turn right 120° in hex mode (nothing in square)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M&lt;/code&gt; turn left 120° in hex mode&lt;/li&gt;
&lt;li&gt;&lt;code&gt;U&lt;/code&gt; turn 180° in hex mode&lt;/li&gt;
&lt;li&gt;anything else (&lt;code&gt;N&lt;/code&gt; above), do nothing/go straight&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This ends up with some really interesting behavior for such a short ruleset. Langton&amp;rsquo;s Ant (LR, the default) is definitely an interesting one. For 10,000 ticks, you get chaotic behavior&amp;hellip; and then suddenly it stabilizes!&lt;/p&gt;</description></item><item><title>Genuary 2026.17: Wallpaper Groups</title><link>https://blog.jverkamp.com/2026/01/17/genuary-2026.17-wallpaper-groups/</link><pubDate>Sat, 17 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/17/genuary-2026.17-wallpaper-groups/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Wallpaper group. There are only 17 ways to cover a plane with a repeating pattern, choose your favourite on this page: &lt;a href="https://en.wikipedia.org/wiki/Wallpaper_group" target="_blank" rel="noopener"&gt;Wallpaper group&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a great article about &lt;a href="https://tiled.art/en/symmetryClassification/" target="_blank" rel="noopener"&gt;Classifying Symmetries&lt;/a&gt; that says there are actually 35 tiling patterns!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/List_of_planar_symmetry_groups" target="_blank" rel="noopener"&gt;List of planar symmetry groups&lt;/a&gt; is another Wikipedia page with a good summary of the wallpaper group.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I spent waaaaay too long on this one.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;group&lt;/code&gt; is the 17 groups mentioned&lt;/li&gt;
&lt;li&gt;&lt;code&gt;subGroup&lt;/code&gt; is horizontal or vertical for some of the above&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cellType&lt;/code&gt; is the shape of each cell&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cellStyle&lt;/code&gt; is what to fill them with&lt;/li&gt;
&lt;li&gt;&lt;code&gt;debugDrawOne&lt;/code&gt; shows what one tile looks like&lt;/li&gt;
&lt;li&gt;&lt;code&gt;debugDisplay&lt;/code&gt; prints what random values were selected&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pauseBuffer&lt;/code&gt; is useful for pausing the generation (although if any of the others are random they will keep changing)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not all of the groups and cell types are perfectly compatible. In fact, probably half or more aren&amp;rsquo;t. But they still produce something, and I think that&amp;rsquo;s pretty cool!&lt;/p&gt;</description></item><item><title>Genuary 2026.16: Order vs Disorder</title><link>https://blog.jverkamp.com/2026/01/16/genuary-2026.16-order-vs-disorder/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/16/genuary-2026.16-order-vs-disorder/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Order vs Disorder&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So I have two kinds of agents: Order, which always moves in straight lines and Chaos which&amp;hellip; doesn&amp;rsquo;t!&lt;/p&gt;
&lt;p&gt;Settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;updateRate&lt;/code&gt; is how fast it runs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;minAgentCount&lt;/code&gt; will spawn agents until you reach this number&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maxAgentCount&lt;/code&gt; will kill off agents until you&amp;rsquo;re under this number&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dieOfOldAge&lt;/code&gt; will kill off old agents&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maxAge&lt;/code&gt; is the longest an agent can last&lt;/li&gt;
&lt;li&gt;&lt;code&gt;agentRatio&lt;/code&gt; of 0 is all order and 1 is all chaos&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spawnRate&lt;/code&gt; is how often an agent will spawn a new agent (of the same kind)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resetPercent&lt;/code&gt; is how much of the screen can be full before resetting&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pauseOnReset&lt;/code&gt; will pause on a reset to allow downloading! (change any setting include this one to unpause)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Genuary 2026.15: Invisible Object</title><link>https://blog.jverkamp.com/2026/01/15/genuary-2026.15-invisible-object/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/15/genuary-2026.15-invisible-object/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Create an invisible object where only the shadows can be seen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Noise that pushes a bunch of particles around on the screen. There is 1 (or more) &amp;lsquo;shadows&amp;rsquo; on the screen that push the dust away.&lt;/p&gt;
&lt;p&gt;If the shadow runs off the screen it will come back in a bit from the opposite edge.&lt;/p&gt;
&lt;p&gt;Settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dustCount&lt;/code&gt; is how much dust&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dustSpeed&lt;/code&gt; is a multiplier for how fast the dust goes per frame&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dustDieOff&lt;/code&gt; is how much dust disappears each frame&lt;/li&gt;
&lt;li&gt;&lt;code&gt;onlyEdgeDust&lt;/code&gt; sets dust to only spawn on the edges, rather than anywhere (has some weird visual artifacts when the dust is a nearly horizontal / vertical)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rainbowDust&lt;/code&gt; makes the dust far more colorful&lt;/li&gt;
&lt;li&gt;&lt;code&gt;windScale&lt;/code&gt; is the scale of the noise, 1 will wiggle a lot more, 5 is closer to straight lines and slow changes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fade&lt;/code&gt; will leave trails by fading the screen; turning this off is interesting since the shadow will be much more subtle&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shadowCount&lt;/code&gt; is how many shadows there are&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shadowForce&lt;/code&gt; is how strongly they repel dust&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shadowWindIndependent&lt;/code&gt; means the shadow doesn&amp;rsquo;t always move with the particles&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shadowEdge&lt;/code&gt; will show where the shadow shape actually is&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shadowsMove&lt;/code&gt; will allow the shadows to move / stop them&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Genuary 2026.14: Fits Perfectly</title><link>https://blog.jverkamp.com/2026/01/14/genuary-2026.14-fits-perfectly/</link><pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/14/genuary-2026.14-fits-perfectly/</guid><description>&lt;h2 id="14-fits-perfectly"&gt;14) Fits Perfectly&lt;/h2&gt;
&lt;p&gt;Basically, we&amp;rsquo;ll pack as many circles in as we can!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;retriesPerFrame&lt;/code&gt; is how many circles it will try to place before giving up and drawing the frame&lt;/li&gt;
&lt;li&gt;&lt;code&gt;minDiameter&lt;/code&gt; is the smallest a circle can be (this should be 1 for a &amp;lsquo;perfect fit&amp;rsquo;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maxDiameter&lt;/code&gt; is the largest one can be&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spacing&lt;/code&gt; is how much space to leave between circles (this should be 0 a &amp;lsquo;perfect fit&amp;rsquo;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;borders&lt;/code&gt; will draw a black border on each circle&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fillInside&lt;/code&gt; will place circles &lt;em&gt;inside&lt;/em&gt; of each other as well as outside, so long as there is still enough &lt;code&gt;spacing&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;blackPercent&lt;/code&gt; is how many of the circles will be black rather than bright colors&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Genuary 2026.13: Self Portrait</title><link>https://blog.jverkamp.com/2026/01/13/genuary-2026.13-self-portrait/</link><pubDate>Tue, 13 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/13/genuary-2026.13-self-portrait/</guid><description>&lt;h2 id="13-self-portrait"&gt;13) Self Portrait&lt;/h2&gt;
&lt;p&gt;That was surprisingly fun.&lt;/p&gt;
&lt;p&gt;Basically, it will take recursively divide the picture over time. Each time, it will find the node with the largest error (real image color compared to the current random color) and split it in 4, assigning each to the nearest random color from our palette.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;colors&lt;/code&gt; controls how many maximum (random) colors will be chosen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;edges&lt;/code&gt; will draw the boxes of the tree&lt;/li&gt;
&lt;li&gt;&lt;code&gt;minimumBlock&lt;/code&gt; is the size at which it won&amp;rsquo;t split any more&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resetAfter&lt;/code&gt; will generate new colors even this many frames&lt;/li&gt;
&lt;li&gt;&lt;code&gt;evenSplit&lt;/code&gt; will split each box into exactly 4; if this is off, each axis will randomly be 25-75%&lt;/li&gt;
&lt;li&gt;&lt;code&gt;weightErrorBySize&lt;/code&gt; will split small boxes earlier; with this off, larger boxes have more error because they are larger&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you don&amp;rsquo;t want to look at me any more, turning off &lt;code&gt;selfPortraitMode&lt;/code&gt; will load an image from &lt;a href="https://picsum.dev/" target="_blank" rel="noopener"&gt;picsum.dev&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Genuary 2026.12: Boxes</title><link>https://blog.jverkamp.com/2026/01/12/genuary-2026.12-boxes/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/12/genuary-2026.12-boxes/</guid><description>&lt;h2 id="12-boxes"&gt;12) Boxes&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s like &lt;a href="https://drawabox.com/" target="_blank" rel="noopener"&gt;draw a box&lt;/a&gt;. But somehow even more. And automatic.&lt;/p&gt;
&lt;p&gt;If you let it run for a while, you get some crazy abstract art!&lt;/p&gt;
&lt;p&gt;&lt;img src="run-for-a-while.png" alt="Boxes after running for a long time"&gt;&lt;/p&gt;</description></item><item><title>Genuary 2026.11: Quine</title><link>https://blog.jverkamp.com/2026/01/11/genuary-2026.11-quine/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/11/genuary-2026.11-quine/</guid><description>&lt;h2 id="11-quine"&gt;11) Quine&lt;/h2&gt;
&lt;p&gt;Making a genart &lt;a href="https://en.wikipedia.org/wiki/quine"&gt;quine&lt;/a&gt;? That&amp;rsquo;s&amp;hellip; certainly a thing!&lt;/p&gt;
&lt;p&gt;So basically I made a very simple stack based virtual machine. You can check the source code below for what commands it can actually run. It will then run until it outputs enough code to match the input length (or times out). If it happens to output a quine? Woot!&lt;/p&gt;
&lt;p&gt;If not, it will randomly mutate and try again.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cellSize&lt;/code&gt; - Change how big the program is (default is 10, theoretically with &lt;code&gt;semi quines&lt;/code&gt; size shouldn&amp;rsquo;t matter)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ticksPerFrame&lt;/code&gt; - How fast the simulation will run&lt;/li&gt;
&lt;li&gt;&lt;code&gt;asFastAsPossible&lt;/code&gt; - Ignore the above and run an entire simulation per frame (it could &lt;em&gt;technically&lt;/em&gt; go even faster &amp;#x1f604;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pauseAfter&lt;/code&gt; - Pause to see what happened after output is done or a break&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stopAfter&lt;/code&gt; - When a single program has run, stop the main loop (mostly useful for debugging)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;randomizePercent&lt;/code&gt; - How much of the input to randomly change for the next iteration&lt;/li&gt;
&lt;li&gt;&lt;code&gt;runOutput&lt;/code&gt; - Run the output as the next program (otherwise, randomize the input)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;highlightActive&lt;/code&gt; - Highlight the parts of the program that actually ran (brighter colors)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;allowSemiQuine&lt;/code&gt; - Ignore non-active parts of the program when considering a quine (if you copied the output to the program in these parts, they&amp;rsquo;d be a quine, so I think it counts)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;allowReadingCode&lt;/code&gt; - Allow (new) commands that allow reading our own source code&lt;/li&gt;
&lt;li&gt;&lt;code&gt;allowWritingCode&lt;/code&gt; - Allow (new) commands that can modify the code you were originally running&lt;/li&gt;
&lt;li&gt;&lt;code&gt;debugPrint&lt;/code&gt; - Print each command run/output to console.log for debugging&lt;/li&gt;
&lt;li&gt;&lt;code&gt;debugSlow&lt;/code&gt; - Drops the framerate to 1 fps for debugging&lt;/li&gt;
&lt;li&gt;&lt;code&gt;debugStepButton&lt;/code&gt; - Add a &amp;lsquo;step&amp;rsquo; button that runs one step at a time (&lt;code&gt;noLoop&lt;/code&gt;) for debugging (reload the page)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, you can put in code in the box and &amp;rsquo;load&amp;rsquo; it to run. This will be helpful to verify quines! I have some interesting code &lt;a href="#interesting-examples"&gt;below&lt;/a&gt; (including a hand written quine! That uses the self reading instructions).&lt;/p&gt;
&lt;p&gt;If you manage to find a quine organically (or write one), I&amp;rsquo;d &lt;em&gt;love&lt;/em&gt; to hear what it was!&lt;/p&gt;</description></item><item><title>Genuary 2026.10: Polar coordinates</title><link>https://blog.jverkamp.com/2026/01/10/genuary-2026.10-polar-coordinates/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/10/genuary-2026.10-polar-coordinates/</guid><description>&lt;h2 id="10-polar-coordinates"&gt;10) Polar coordinates&lt;/h2&gt;
&lt;p&gt;CIrcles within circles within circles.&lt;/p&gt;</description></item><item><title>Genuary 2026.09: Cellular automata</title><link>https://blog.jverkamp.com/2026/01/09/genuary-2026.09-cellular-automata/</link><pubDate>Fri, 09 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/09/genuary-2026.09-cellular-automata/</guid><description>&lt;h2 id="9-cellular-automata"&gt;9) Cellular automata&lt;/h2&gt;
&lt;p&gt;Just a bunch of random rules, with the ability (if you put this in p5js at least) to add them pretty easily.&lt;/p&gt;
&lt;p&gt;This one can do some wacky things if you randomize it. But also, it &lt;em&gt;might&lt;/em&gt; crash your browser tab on some of these settings. Sorry. &amp;#x1f604;&lt;/p&gt;
&lt;p&gt;Try:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Perlin, Max, fuzz, diffuse&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Genuary 2026.08: A city</title><link>https://blog.jverkamp.com/2026/01/08/genuary-2026.08-a-city/</link><pubDate>Thu, 08 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/08/genuary-2026.08-a-city/</guid><description>&lt;h2 id="8-a-city"&gt;8) A city&lt;/h2&gt;
&lt;p&gt;Simple parallax graphics and (slowly) blinking windows. I enjoyed this one.&lt;/p&gt;</description></item><item><title>Genuary 2026.07: Boolean algebra</title><link>https://blog.jverkamp.com/2026/01/07/genuary-2026.07-boolean-algebra/</link><pubDate>Wed, 07 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/07/genuary-2026.07-boolean-algebra/</guid><description>&lt;h2 id="5-boolean-algebra"&gt;5) Boolean algebra&lt;/h2&gt;
&lt;p&gt;So the basic idea here is to recursively divide the space. The black squares are the randomly chosen values. Then, for each level of the tree, combine the children using one of the selected functions (and/or/xor/etc), drawing a border if the result of that combination is true.&lt;/p&gt;
&lt;p&gt;Try various combinations of settings!&lt;/p&gt;</description></item><item><title>Genuary 2026.06: Lights on/off</title><link>https://blog.jverkamp.com/2026/01/06/genuary-2026.06-lights-on/off/</link><pubDate>Tue, 06 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/06/genuary-2026.06-lights-on/off/</guid><description>&lt;h2 id="5-lights-onoff"&gt;5) Lights on/off&lt;/h2&gt;
&lt;p&gt;&amp;#x1f604;&lt;/p&gt;
&lt;p&gt;(&lt;a href="?flicker=true"&gt;Turn on flickering.&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;(&lt;a href="?flicker=true&amp;amp;flickerPercent=1"&gt;If you dare.&lt;/a&gt;)&lt;/p&gt;</description></item><item><title>Genuary 2026.05: Write 'genuary'</title><link>https://blog.jverkamp.com/2026/01/05/genuary-2026.05-write-genuary/</link><pubDate>Mon, 05 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/05/genuary-2026.05-write-genuary/</guid><description>&lt;h2 id="5-write-genuary"&gt;5) Write &amp;lsquo;genuary&amp;rsquo;&lt;/h2&gt;
&lt;p&gt;Yeah, this one got weird and recursive. But it&amp;rsquo;s only sort of font data, so I think it works.&lt;/p&gt;</description></item><item><title>Genuary 2026.04: lowres</title><link>https://blog.jverkamp.com/2026/01/04/genuary-2026.04-lowres/</link><pubDate>Sun, 04 Jan 2026 00:00:10 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/04/genuary-2026.04-lowres/</guid><description>&lt;h2 id="4-lowres"&gt;4) lowres&lt;/h2&gt;
&lt;p&gt;Perlin noise, but &amp;hellip; really lowres? You can play with how low res or how many colors you want.&lt;/p&gt;</description></item><item><title>Genuary 2026.03: Fibonacci forever</title><link>https://blog.jverkamp.com/2026/01/03/genuary-2026.03-fibonacci-forever/</link><pubDate>Sat, 03 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/03/genuary-2026.03-fibonacci-forever/</guid><description>&lt;h2 id="3-fibonacci-forever"&gt;3) Fibonacci forever&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Fibonacci"&gt;Fibonacci&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is entirely based around this Fibonacci generator function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;makeFibber&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;maxValue&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;maxValue&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make a &lt;code&gt;fibber&lt;/code&gt; and then just keep calling it for next values.&lt;/p&gt;
&lt;p&gt;All sorts of exciting options here!&lt;/p&gt;</description></item><item><title>Genuary 2026.02: Twelve principles of animation</title><link>https://blog.jverkamp.com/2026/01/02/genuary-2026.02-twelve-principles-of-animation/</link><pubDate>Fri, 02 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/02/genuary-2026.02-twelve-principles-of-animation/</guid><description>&lt;h2 id="2-twelve-principles-of-animation"&gt;2) Twelve principles of animation&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Twelve%20principles%20of%20animation"&gt;Twelve principles of animation&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stretch and shrink&lt;/li&gt;
&lt;li&gt;Anticipation&lt;/li&gt;
&lt;li&gt;Staging&lt;/li&gt;
&lt;li&gt;Direct animation&lt;/li&gt;
&lt;li&gt;Complementary&lt;/li&gt;
&lt;li&gt;Accelerate and decelerate&lt;/li&gt;
&lt;li&gt;Arcs&lt;/li&gt;
&lt;li&gt;Secondary action&lt;/li&gt;
&lt;li&gt;Synchronization&lt;/li&gt;
&lt;li&gt;Exaggeration&lt;/li&gt;
&lt;li&gt;Solid drawing&lt;/li&gt;
&lt;li&gt;Attractive&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That &amp;hellip; is a lot. And I&amp;rsquo;m not &lt;em&gt;really&lt;/em&gt; an animator. But let&amp;rsquo;s see what we can do!&lt;/p&gt;</description></item><item><title>Genuary 2026.01: One color, one shape</title><link>https://blog.jverkamp.com/2026/01/01/genuary-2026.01-one-color-one-shape/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2026/01/01/genuary-2026.01-one-color-one-shape/</guid><description>&lt;p&gt;It&amp;rsquo;s been a &lt;a href="https://blog.jverkamp.com/series/genuary-2023/"&gt;couple years&lt;/a&gt; since I last did &lt;a href="https://genuary.art/" target="_blank" rel="noopener"&gt;Genuary&lt;/a&gt;. Let&amp;rsquo;s do it again. I don&amp;rsquo;t expect to make any masterpieces, but I enjoy making tiny pretty pictures. It&amp;rsquo;s something I&amp;rsquo;ve been doing honestly as long as I&amp;rsquo;ve been programming (I remember making &lt;a href="https://en.wikipedia.org/wiki/brownian%20motion"&gt;brownian motion&lt;/a&gt; &amp;lsquo;bugs&amp;rsquo; in QBasic in the 90s&amp;hellip;).&lt;/p&gt;
&lt;h2 id="1-one-color-one-shape"&gt;1) One color, one shape&lt;/h2&gt;</description></item><item><title>Syncing Kobo Annotations</title><link>https://blog.jverkamp.com/2025/12/29/syncing-kobo-annotations/</link><pubDate>Mon, 29 Dec 2025 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/29/syncing-kobo-annotations/</guid><description>&lt;p&gt;I&amp;rsquo;ve recently been trying out a &lt;a href="https://www.kobo.com/" target="_blank" rel="noopener"&gt;Kobo&lt;/a&gt;. Amazon has some issues and Kindles are hard to do any amount of customization to, let&amp;rsquo;s just leave it at that.&lt;/p&gt;
&lt;p&gt;So what fun tricks can one do with a Kobo?&lt;/p&gt;
&lt;p&gt;Well, for one, it&amp;rsquo;s a Linux system. And if you attach it to your computer, you get access to a lot of the local filesystem. This includes the SQLite database holding all of teh system metadata, along with places to install all sorts of interesting scripts.&lt;/p&gt;
&lt;p&gt;One that I&amp;rsquo;ve been wanting in particular is the ability to extract my annotations. It&amp;rsquo;s a great way to &lt;a href="https://blog.jverkamp.com/reviews"&gt;review&lt;/a&gt; books. Highlight, write a note, and then export right at the end.&lt;/p&gt;
&lt;p&gt;So how do you do that on a Kobo?&lt;/p&gt;
&lt;nav id="TableOfContents"&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#starting-point"&gt;Starting point&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#via-dropbox"&gt;Via Dropbox&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#adding-a-button-on-the-kobo"&gt;Adding a button on the Kobo&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#exporting-notes"&gt;Exporting notes&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#todo"&gt;Todo&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/nav&gt;

&lt;hr&gt;</description></item><item><title>Locking BGA tabs with UserScripts</title><link>https://blog.jverkamp.com/2025/12/20/locking-bga-tabs-with-userscripts/</link><pubDate>Sat, 20 Dec 2025 00:00:00 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/20/locking-bga-tabs-with-userscripts/</guid><description>&lt;p&gt;I play a lot of games on &lt;a href="https://boardgamearena.com/" target="_blank" rel="noopener"&gt;Board Game Arena (BGA!)&lt;/a&gt;. A lot of those are turn based games with random people, but I have two subsets of games that I consider &amp;lsquo;more important&amp;rsquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Turn based games with people I know&lt;/li&gt;
&lt;li&gt;Alpha games I&amp;rsquo;m testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately, the first tends to have longer &amp;lsquo;per turn&amp;rsquo; times and the latter doesn&amp;rsquo;t have a timer at all, so both end up right at the very end of the sorted table list. But both, I&amp;rsquo;d rather play first and in-between other games.&lt;/p&gt;
&lt;p&gt;Super niche problems, I know.&lt;/p&gt;
&lt;p&gt;Generally, my solution has been to keep a tab open for each of those games in a Firefox Tab Group, but in those cases, I keep navigating off those pages accidentally (thank you next table button).&lt;/p&gt;
&lt;p&gt;Super &lt;em&gt;super&lt;/em&gt; niche problems, now.&lt;/p&gt;
&lt;p&gt;In any case, I whipped up a quick userscript (I use ViolentMonkey) that will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Detect if a tab I&amp;rsquo;m on is one of the games I want to &amp;rsquo;lock&amp;rsquo;&lt;/li&gt;
&lt;li&gt;Remove the next table button (buttons; there are two different ones)&lt;/li&gt;
&lt;li&gt;Disable navigation (at least make it pop up a warning)&lt;/li&gt;
&lt;li&gt;Periodically refresh the tab (BGA tends to go to sleep in the background)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AoC 2025 Day 12: Knapsackinator</title><link>https://blog.jverkamp.com/2025/12/12/aoc-2025-day-12-knapsackinator/</link><pubDate>Fri, 12 Dec 2025 00:00:03 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/12/aoc-2025-day-12-knapsackinator/</guid><description>&lt;h2 id="source-day-12-christmas-tree-farm"&gt;Source: &lt;a href="https://adventofcode.com/2025/day/12" target="_blank" rel="noopener"&gt;Day 12: Christmas Tree Farm&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/advent-of-code/blob/master/2025/src/day12.rs" target="_blank" rel="noopener"&gt;Full solution&lt;/a&gt; for today (spoilers!).&lt;/p&gt;
&lt;nav id="TableOfContents"&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#source-day-12-christmas-tree-farm"&gt;Source: Day 12: Christmas Tree Farm&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1---its-actually-trivial"&gt;Part 1 - It&amp;rsquo;s actually trivial&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#rendering"&gt;Rendering&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#benchmarks"&gt;Benchmarks&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/nav&gt;

&lt;h2 id="part-1"&gt;Part 1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Solve the &lt;a href="https://en.wikipedia.org/wiki/knapsack%20problem"&gt;knapsack problem&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;But really, you are given a set of tiles (which all happen to be some subset of a 3x3) and a set of constraints&amp;ndash;a MxN grid and how many of each tile to place. Count how many constraints are possible.&lt;/p&gt;
&lt;p&gt;Tiles may be rotated and/or flipped.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>AoC 2025 Day 11: Graphinator</title><link>https://blog.jverkamp.com/2025/12/11/aoc-2025-day-11-graphinator/</link><pubDate>Thu, 11 Dec 2025 00:00:03 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/11/aoc-2025-day-11-graphinator/</guid><description>&lt;h2 id="source-day-11-reactor"&gt;Source: &lt;a href="https://adventofcode.com/2025/day/11" target="_blank" rel="noopener"&gt;Day 11: Reactor&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/advent-of-code/blob/master/2025/src/day11.rs" target="_blank" rel="noopener"&gt;Full solution&lt;/a&gt; for today (spoilers!).&lt;/p&gt;
&lt;nav id="TableOfContents"&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#source-day-11-reactor"&gt;Source: Day 11: Reactor&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#benchmarks"&gt;Benchmarks&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/nav&gt;

&lt;h2 id="part-1"&gt;Part 1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Given a &lt;a href="https://en.wikipedia.org/wiki/directed%20graph"&gt;directed graph&lt;/a&gt; defined where &lt;code&gt;aaa: you hhh&lt;/code&gt; means &lt;code&gt;aaa&lt;/code&gt; is connected to &lt;code&gt;you&lt;/code&gt; and &lt;code&gt;hhh&lt;/code&gt;, how many paths are there from &lt;code&gt;you&lt;/code&gt; to &lt;code&gt;out&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>AoC 2025 Day 10: Linear Algebranator</title><link>https://blog.jverkamp.com/2025/12/10/aoc-2025-day-10-linear-algebranator/</link><pubDate>Wed, 10 Dec 2025 00:00:03 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/10/aoc-2025-day-10-linear-algebranator/</guid><description>&lt;h2 id="source-day-10-factory"&gt;Source: &lt;a href="https://adventofcode.com/2025/day/10" target="_blank" rel="noopener"&gt;Day 10: Factory&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/advent-of-code/blob/master/2025/src/day10.rs" target="_blank" rel="noopener"&gt;Full solution&lt;/a&gt; for today (spoilers!).&lt;/p&gt;
&lt;nav id="TableOfContents"&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#source-day-10-factory"&gt;Source: Day 10: Factory&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2---a-system-of-equations-wip"&gt;Part 2 - A system of equations [WIP]&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2---memoization"&gt;Part 2 - Memoization&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2---add-branch-and-bound"&gt;Part 2 - Add branch and bound&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2---just-use-z3"&gt;Part 2 - Just use z3&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#1211-part-2---equations-continued"&gt;[12/11] Part 2 - Equations continued&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#benchmarks"&gt;Benchmarks&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/nav&gt;

&lt;h2 id="part-1"&gt;Part 1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Given a target light pattern &lt;code&gt;[.##.]&lt;/code&gt; and a series of buttons (&lt;code&gt;(3) (1, 3) etc&lt;/code&gt;) where the first button toggles light &amp;lsquo;3&amp;rsquo; (the 4th light) and the second toggles the first and 4th etc, what is the minimum number of buttons you need to press to match the light pattern.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>AoC 2025 Day 9: Polygoninator</title><link>https://blog.jverkamp.com/2025/12/09/aoc-2025-day-9-polygoninator/</link><pubDate>Tue, 09 Dec 2025 00:00:03 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/09/aoc-2025-day-9-polygoninator/</guid><description>&lt;h2 id="source-day-9-movie-theater"&gt;Source: &lt;a href="https://adventofcode.com/2025/day/9" target="_blank" rel="noopener"&gt;Day 9: Movie Theater&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/advent-of-code/blob/master/2025/src/day9.rs" target="_blank" rel="noopener"&gt;Full solution&lt;/a&gt; for today (spoilers!).&lt;/p&gt;
&lt;nav id="TableOfContents"&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#source-day-9-movie-theater"&gt;Source: Day 9: Movie Theater&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2"&gt;Part 2&lt;/a&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#line2drs"&gt;line2d.rs&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#polygonrs"&gt;polygon.rs&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#back-to-the-problem"&gt;Back to the problem&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#visualization"&gt;Visualization&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#1213-part-2---dimensional-compression"&gt;[12/13] Part 2 - Dimensional Compression&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#benchmarks"&gt;Benchmarks&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/nav&gt;

&lt;h2 id="part-1"&gt;Part 1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Given a list of points (2D), find the pair of points which form the largest rectangle.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>AoC 2025 Day 8: Point Cloudinator</title><link>https://blog.jverkamp.com/2025/12/08/aoc-2025-day-8-point-cloudinator/</link><pubDate>Mon, 08 Dec 2025 00:00:03 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/08/aoc-2025-day-8-point-cloudinator/</guid><description>&lt;h2 id="source-day-8-playground"&gt;Source: &lt;a href="https://adventofcode.com/2025/day/8" target="_blank" rel="noopener"&gt;Day 8: Playground&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/advent-of-code/blob/master/2025/src/day8.rs" target="_blank" rel="noopener"&gt;Full solution&lt;/a&gt; for today (spoilers!).&lt;/p&gt;
&lt;nav id="TableOfContents"&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#source-day-8-playground"&gt;Source: Day 8: Playground&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1---binary-heap"&gt;Part 1 - Binary Heap&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#benchmarks"&gt;Benchmarks&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/nav&gt;

&lt;h2 id="part-1"&gt;Part 1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Given a list of points in 3D space, connect the 1000 closest nodes to each other. Calculate the product of the size of the 3 largest resulting regions?&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>AoC 2025 Day 7: Laser Splittinator</title><link>https://blog.jverkamp.com/2025/12/07/aoc-2025-day-7-laser-splittinator/</link><pubDate>Sun, 07 Dec 2025 00:00:03 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/07/aoc-2025-day-7-laser-splittinator/</guid><description>&lt;h2 id="source-day-7-laboratories"&gt;Source: &lt;a href="https://adventofcode.com/2025/day/7" target="_blank" rel="noopener"&gt;Day 7: Laboratories&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/advent-of-code/blob/master/2025/src/day7.rs" target="_blank" rel="noopener"&gt;Full solution&lt;/a&gt; for today (spoilers!).&lt;/p&gt;
&lt;nav id="TableOfContents"&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#source-day-7-laboratories"&gt;Source: Day 7: Laboratories&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#benchmarks"&gt;Benchmarks&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#rendering"&gt;Rendering&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/nav&gt;

&lt;h2 id="part-1"&gt;Part 1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;You are given a map like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.......S.......
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...............
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.......^.......
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...............
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;......^.^......
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...............
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A laser shines from the top &lt;code&gt;S&lt;/code&gt; and splits each time it hits a &lt;code&gt;^&lt;/code&gt;, making this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.......S.......
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.......|.......
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;......|^|......
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;......|.|......
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.....|^|^|.....
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.....|.|.|.....
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The two lasers in the center of this example merge to count as one laser.&lt;/p&gt;
&lt;p&gt;Count how many times lasers hit splitters.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>AoC 2025 Day 6: Column Operatinator</title><link>https://blog.jverkamp.com/2025/12/06/aoc-2025-day-6-column-operatinator/</link><pubDate>Sat, 06 Dec 2025 00:00:03 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/06/aoc-2025-day-6-column-operatinator/</guid><description>&lt;h2 id="source-day-6-trash-compactor"&gt;Source: &lt;a href="https://adventofcode.com/2025/day/6" target="_blank" rel="noopener"&gt;Day 6: Trash Compactor&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/advent-of-code/blob/master/2025/src/day6.rs" target="_blank" rel="noopener"&gt;Full solution&lt;/a&gt; for today (spoilers!).&lt;/p&gt;
&lt;nav id="TableOfContents"&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#source-day-6-trash-compactor"&gt;Source: Day 6: Trash Compactor&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1---grid"&gt;Part 1 - Grid&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#benchmarks"&gt;Benchmarks&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/nav&gt;

&lt;h2 id="part-1"&gt;Part 1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Given input like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;123 328 51 64 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 45 64 387 23 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 6 98 215 314
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* + * + 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Apply the operation in each column then sum the results.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>AoC 2025 Day 5: Range Merginator</title><link>https://blog.jverkamp.com/2025/12/05/aoc-2025-day-5-range-merginator/</link><pubDate>Fri, 05 Dec 2025 00:00:03 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/05/aoc-2025-day-5-range-merginator/</guid><description>&lt;h2 id="source-day-5-cafeteria"&gt;Source: &lt;a href="https://adventofcode.com/2025/day/5" target="_blank" rel="noopener"&gt;Day 5: Cafeteria&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/advent-of-code/blob/master/2025/src/day5.rs" target="_blank" rel="noopener"&gt;Full solution&lt;/a&gt; for today (spoilers!).&lt;/p&gt;
&lt;nav id="TableOfContents"&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#source-day-5-cafeteria"&gt;Source: Day 5: Cafeteria&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2---bruteforce"&gt;Part 2 - Bruteforce&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#benchmarks"&gt;Benchmarks&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/nav&gt;

&lt;h2 id="part-1"&gt;Part 1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Given a list of ranges (inclusive) and a list of IDs, how many of the IDs are in any range?&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>AoC 2025 Day 4: Fade Awayinator</title><link>https://blog.jverkamp.com/2025/12/04/aoc-2025-day-4-fade-awayinator/</link><pubDate>Thu, 04 Dec 2025 00:00:03 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/04/aoc-2025-day-4-fade-awayinator/</guid><description>&lt;h2 id="source-day-4-printing-department"&gt;Source: &lt;a href="https://adventofcode.com/2025/day/4" target="_blank" rel="noopener"&gt;Day 4: Printing Department&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/advent-of-code/blob/master/2025/src/day4.rs" target="_blank" rel="noopener"&gt;Full solution&lt;/a&gt; for today (spoilers!).&lt;/p&gt;
&lt;nav id="TableOfContents"&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#source-day-4-printing-department"&gt;Source: Day 4: Printing Department&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2---no-map"&gt;Part 2 - No Map&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#rendering"&gt;Rendering&lt;/a&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#register_render"&gt;&lt;code&gt;register_render&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#render_imagewidth-height-filename-f"&gt;&lt;code&gt;render_image!(width, height, filename, f)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#render_framewidth-height-f"&gt;&lt;code&gt;render_frame!(width, height, f)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#rendering-part-2"&gt;Rendering Part 2&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#edit-part-2---floodfill"&gt;[Edit] Part 2 - Floodfill&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#benchmarks"&gt;Benchmarks&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/nav&gt;

&lt;h2 id="part-1"&gt;Part 1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Given a grid of solid &lt;code&gt;@&lt;/code&gt; and empty cells &lt;code&gt;.&lt;/code&gt;, count how many solid cells have less than 4 neighbors.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>AoC 2025 Day 3: Loopinator</title><link>https://blog.jverkamp.com/2025/12/03/aoc-2025-day-3-loopinator/</link><pubDate>Wed, 03 Dec 2025 00:00:03 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/03/aoc-2025-day-3-loopinator/</guid><description>&lt;h2 id="source-day-3-lobby"&gt;Source: &lt;a href="https://adventofcode.com/2025/day/3" target="_blank" rel="noopener"&gt;Day 3: Lobby&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/advent-of-code/blob/master/2025/src/day3.rs" target="_blank" rel="noopener"&gt;Full solution&lt;/a&gt; for today (spoilers!).&lt;/p&gt;
&lt;nav id="TableOfContents"&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#source-day-3-lobby"&gt;Source: Day 3: Lobby&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#a-recursive-solution"&gt;A recursive solution&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2---recursive"&gt;Part 2 - Recursive&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1---recursive"&gt;Part 1 - Recursive&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#benchmarks"&gt;Benchmarks&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/nav&gt;

&lt;h2 id="part-1"&gt;Part 1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Given a list of numbers, for each find the two digits in the number which if concatenated make the largest. Sum these values.&lt;/p&gt;
&lt;p&gt;For example: &lt;code&gt;811111111111119&lt;/code&gt; should be &lt;code&gt;89&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>AoC 2025 Day 2: Repeat Repeat Repeatinator</title><link>https://blog.jverkamp.com/2025/12/02/aoc-2025-day-2-repeat-repeat-repeatinator/</link><pubDate>Tue, 02 Dec 2025 00:00:03 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/02/aoc-2025-day-2-repeat-repeat-repeatinator/</guid><description>&lt;h2 id="source-day-2-gift-shop"&gt;Source: &lt;a href="https://adventofcode.com/2025/day/2" target="_blank" rel="noopener"&gt;Day 2: Gift Shop&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/advent-of-code/blob/master/2025/src/day2.rs" target="_blank" rel="noopener"&gt;Full solution&lt;/a&gt; for today (spoilers!).&lt;/p&gt;
&lt;nav id="TableOfContents"&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#source-day-2-gift-shop"&gt;Source: Day 2: Gift Shop&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1---regex"&gt;Part 1 - Regex&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2---matching-integers"&gt;Part 2 - Matching Integers&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2---matching-integers-1"&gt;Part 2 - Matching Integers&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#benchmarks"&gt;Benchmarks&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#edit-part-1---chatgpt"&gt;(Edit) Part 1 - ChatGPT&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/nav&gt;

&lt;h2 id="part-1"&gt;Part 1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Given a list of ranges &lt;code&gt;a-b&lt;/code&gt; (ie &lt;code&gt;11-22&lt;/code&gt;), sum all values that are made of two repeated chunks of digits (ie &lt;code&gt;123123&lt;/code&gt;)&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>AoC 2025 Day 1: Turn Turn Turninator</title><link>https://blog.jverkamp.com/2025/12/01/aoc-2025-day-1-turn-turn-turninator/</link><pubDate>Mon, 01 Dec 2025 00:00:03 +0000</pubDate><guid>https://blog.jverkamp.com/2025/12/01/aoc-2025-day-1-turn-turn-turninator/</guid><description>&lt;h2 id="source-day-1-secret-entrance"&gt;Source: &lt;a href="https://adventofcode.com/2025/day/1" target="_blank" rel="noopener"&gt;Day 1: Secret Entrance&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jpverkamp/advent-of-code/blob/master/2025/src/bin/day1.rs" target="_blank" rel="noopener"&gt;Full solution&lt;/a&gt; for today (spoilers!).&lt;/p&gt;
&lt;nav id="TableOfContents"&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="#source-day-1-secret-entrance"&gt;Source: Day 1: Secret Entrance&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-1"&gt;Part 1&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#part-2"&gt;Part 2&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#benchmarks"&gt;Benchmarks&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/nav&gt;

&lt;h2 id="part-1"&gt;Part 1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Implement a padlock with 100 values (0-99). Run each command (&lt;code&gt;L23&lt;/code&gt; to turn left by 23 places) and then output the number of times you landed on zero.&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>