The earliest memory I have of ‘programming’ is in the early/mid 90s when my father brought home a computer from work. We could play games on it … so of course I took the spreadsheet program he used (LOTUS 123, did I date myself with that?) and tried to modify it to print out a helpful message for him. It … halfway worked? At least I could undo it so he could get back to work…

After that, I picked up programming for real in QBASIC (I still have a few of those programs lying around), got my own (junky) Linux desktop from my cousin, tried to learn VBasic (without a Windows machine), and eventually made it to high school… In college, I studied computer science and mathematics, mostly programming in Java/.NET, although with a bit of everything in the mix. A few of my oldest programming posts on this blog are from that time.

After that, on to grad school! Originally, I was going to study computational linguistics, but that fell through. Then programming languages (the school’s specialty). And finally I ended up studying censorship and computer security. That’s about where I am today!

But really, I still have a habit of doing a little bit of everything. Whatever seems interesting at the time!

Infinite Craft Bot

You’ve probably seen Neil.fun’s Infinite Craft game somewhere on the internet. If not, in a nutshell:

  • You start with 4 blocks: Earth, Fire, Water, and Wind.
  • You can combine any two blocks, for example:
    • Earth + Water = Plant
    • Plant + Fire = Smoke
    • Smoke + Smoke = Cloud

That’s… pretty much it, from a gameplay perspective. There’s not really any goal, other than what you set yourself (try to make Cthulhu!). Although if you manage to find something no one has ever made before, you get a neat little note for it!

So wait, what do I mean by ‘something no one has ever seen before’?

Well, if two elements have ever been combined by anyone before, you get a cached response. Barring resets of the game (no idea if / how often this has happened, but I assume it has), if A + B = C for you, A + B = C for everyone.

And here’s the fun part: if you find a combination no one has ever found before: Neil.fun will send the combination out to an LLM to generate the new answer. The specific prompt isn’t public (so far as I know), but essentially what that means is that you have a basically infinite crafting tree1!

So of course seeing something like this I want to automate it. đŸ˜„


read more...


AoC 2023 Day 22: Block Dropinator

Source: Day 22: Sand Slabs

Full solution for today (spoilers!)

Part 1

Given a series of 3D blocks, allow them to fall until the simulation is stable. Any cube of a block is sufficient to support another block, ignore rotations etc.

How many blocks are not the sole supporter for any other block?

read more...


AoC 2023 Day 20: Flip-Flopinator

Source: Day 20: Pulse Propagation

Full solution for today (spoilers!)

Part 1

Simulate a virtual circuit with high and low pulses and four kinds of chips:

  • Broadcast - Re-transmit all pulses
  • Flip-flops - On a low pulse, toggle internal state; if it was on, send high; otherwise send low
  • Conjunction - Remember input from each attached module; if all inputs were high, send a low, otherwise send high
  • Output - Do nothing; just receive pulses

Count the product of low and high pulses sent after 1000 low inputs to broadcaster.

read more...


AoC 2023 Day 19: Assembly Lininator

Source: Day 19: Aplenty

Full solution for today (spoilers!)

Part 1

You are given a series of parts with 4 ratings as such:

{x=787,m=2655,a=1222,s=2876}

In addition, you are given a series of rules describing a graph as such:

px{a<2006:qkq,m>2090:A,rfg}

In this example, if you are at the node px, if a < 2006, move to qkq. Otherwise, if m > 2090 move to A. If no other case matches, the last defaults to rfg.

A and R are special cases for accept and reject.

Calculate the sum of sum of all four ratings for all nodes that end at Accept.

read more...