EXAPUNKS from Zachtronics

EXAPUNKS is the next game from Zachtronics, creators of my beloved SpaceChem, Shenzhen I/O, TIS-100, Opus Magnum.

This one seems more similar to TIS-100 and Shenzhen, pseudo-asm code in 1997 to control Execution Agents (XA) and hack stuff like road signs, banks and your own body, with lots of in-universe bumf to read like Shenzhen. The collector's edition comes with 3D glasses and some 90's hacking magazines.

Naturally this sort of nonsense is catnip to me, so I'll see you all in the histograms, where Mooquack can show us all how it's really done.

I still have the (mostly) uncracked binder from SHENZEN I/O sitting on my desk. I played a lot of SpaceChem, not a lot of TIS-100, and no Shenzen at all!

Still, I love Zachtronics' work and so I bought the Exapunks physical package as well. Thanks DudleySmith!

Holy crap. I haven't even bought Opus Magnum yet, let alone given up halfway through it when it gets too complicated.

Yoyoson wrote:

I still have the (mostly) uncracked binder from SHENZEN I/O sitting on my desk. I played a lot of SpaceChem, not a lot of TIS-100, and no Shenzen at all!

Still, I love Zachtronics' work and so I bought the Exapunks physical package as well. Thanks DudleySmith!

I'm in just about exactly this same boat, and did exactly this same thing. I didn't know Shenzhen had a physical package, but the Zachtronics games scratch an itch I didn't even know I had, so I'm happy to give them a few extra bucks to help support.

merphle wrote:
Yoyoson wrote:

I still have the (mostly) uncracked binder from SHENZEN I/O sitting on my desk. I played a lot of SpaceChem, not a lot of TIS-100, and no Shenzen at all!

Still, I love Zachtronics' work and so I bought the Exapunks physical package as well. Thanks DudleySmith!

I'm in just about exactly this same boat, and did exactly this same thing. I didn't know Shenzhen had a physical package, but the Zachtronics games scratch an itch I didn't even know I had, so I'm happy to give them a few extra bucks to help support.

I did the same. I missed the Shenzhen pack, and I kinda regret it, because a laptop with the PDF and the game running isn't the same...

It's sad that he can write and release these faster than I can complete them.

... preordered the physical package.

I just pre-ordered the physical package. See you on the leaderboards!

I just received a package from Zachtronics that confused me.
"Like the software company? That's weird..."
Then it finally clicked.

Cool goodies -- that I'm not supposed to open until told to do so.

Mine arrived as well. I'm not even going to look at the one un-sealed item until I at least get the Steam key.

I got my package, though I haven't looked through it yet, either.

The Steam keys have also gone out, though the early access version doesn't unlock until Thursday.

It's out, and it's great.

Played through the first zine's puzzles and unlocked the second one. It, uh, escalates.

But I beat Mooquack's solutions a couple of times, and I have screenshot proof of it.

Usually I will solve a puzzle in whichever way seems easiest so I can move on to other puzzles, and then go back and optimize it later once enough people on my friends list have put scores on the board for me to compete with. Usually the mere fact that a lower score exists is the biggest hint as to what the more optimized solution might look like.

It always astonishes me how much these Zachtronics games build on each other. The lessons I've learned from their previous games definitely feel like they apply here, and I'm enjoying it a great deal.

The total instruction limit is an interesting wrinkle. It's much more flexible than the limits that TIS-100 or Shenzhen I/O imposed, in that you can fill a single EXA unit with your entire quota, or split it up among several EXAs. It makes it fairly easy to brute-force your way to a solution with a single lengthy program, while still e.g. limiting your ability to completely unroll your loops.

I'm getting an impressive amount of use out of the REPL instruction. As someone who has written his share of code that calls fork(), I actually laughed out loud when I first read what REPL does, and was delighted the first time I saw a puzzle that was obviously created with it in mind.

REPL actually strikes me as being like this game's JRO instruction. Not in the sense that they do similar things, but in the sense that it's an instruction which can permit some serious trickery once you wrap your brain around it.

Painfully it was released whilst I was on holiday, and I've had to wait until now to play it. I've had a look at the first few problems. Mooquack appears to have something I don't to get some of the scores - are there hidden instructions like in Shenzhen? It looks like my loops are bringing me down at the moment, since they're the ones with the biggest difference.

OK, there was a new instruction brought in Issue 2. I still need to work out your solution to the fourth tutorial problem though - I'm using the T register as a counter so I can use a FJMP directly and avoid a TEST instruction, but I'm still way off

So my preference for zachtronics games is:

1) Opus Magnum (actually completed it)
2) Shenzhen (feels most like actual programming)
3) Spacechem
4) TIS-100 (too difficult)

Which games is this most alike?

DudleySmith wrote:

Painfully it was released whilst I was on holiday, and I've had to wait until now to play it. I've had a look at the first few problems. Mooquack appears to have something I don't to get some of the scores - are there hidden instructions like in Shenzhen? It looks like my loops are bringing me down at the moment, since they're the ones with the biggest difference.

DudleySmith wrote:

OK, there was a new instruction brought in Issue 2. I still need to work out your solution to the fourth tutorial problem though - I'm using the T register as a counter so I can use a FJMP directly and avoid a TEST instruction, but I'm still way off

It isn't really a new instruction, in that it gives no advantage with respect to any of the scores it grades you on. It's just a convenience feature.

There's no great secret to optimizing. You just need to look very closely at where you're spending your cycles, then identify which cycles aren't necessary to the solution. Loops tend to be the richest source of spare cycles, in that TEST and JUMP/TJMP/FJMP instructions each take a cycle, and finding a way to eliminate them can yield great dividends.

I tend to approach solutions from both the bottom up (that is, make the first solution I can, then improve it incrementally) and the top down (that is, look at the problem as a whole, and identify some abstract idea of what the "ideal" solution would look like, and try to implement that). Sometimes this means making a chart of where a given piece of code is spending each and every individual cycle, possibly between multiple EXAs at once.

That said, my solution for Tutorial 4 is exceedingly cheeky, and no one on my friends list has matched it yet. It doesn't use anything you wouldn't know about from the first zine, but it does think outside the box a little.

Concave wrote:

So my preference for zachtronics games is:

1) Opus Magnum (actually completed it)
2) Shenzhen (feels most like actual programming)
3) Spacechem
4) TIS-100 (too difficult)

Which games is this most alike?

I feel like zachtonics games fall into two similar-but-distinct categories: spatial programming (Spacechem, Infinifactory, Opus Magnum)and literal programming (Shenzhen, TIS-100, and I assume Exapunks)

And that from your list, you probably prefer the spatial ones. And I've just realized the I prefer the actually-writing-code ones.

I've not played Exapunks, but from the trailer I've watched, it kind of looks like a cross-over of those two styles. Anyone care to comment?

No, it's not really spatial. Whilst your programming units move through the network a bit, it's still of the literal rather than spatial flavour.

I've been concentrating on the tutorials a bit since they'll be transferrable techniques if I can crack them.

Logically, for tutorial 4, I have to get my main loop down from three to two instructions to match MooQuack's cycles. I have a copy operation, a subtract and a test.

An additional EXA won't help, since it'll need the same three instructions. Maybe writing 10 at a time, and then deleting the negative extras? That might give an overall improvement.

Here are some subtle bits of how the game works that I've run into, which others might find interesting:

Your final scores are based on the maximum across all test runs. In many puzzles, the different test cases may take different numbers of cycles or require different amounts of activity. Your final score in each of these categories is simply the largest one out of all 100 tests.

Writing to the M register always takes at least two cycles. Reading from the M register can take a single cycle. This has implications for synchronizing communication between EXAs without wasting cycles. When writing to the M register, the first cycle is spent actually copying the value into the register. It is only after that point that another EXA can read the value, which requires a matching cycle on the part of the sending EXA. The practical upshot is that it is possible to deterministically send a value over M on every single cycle, if you set things up correctly.

That's relevant on my current level (the eye hacking). I need to get the synchronisation sorted somehow.

After finishing the campaign, I enabled the option to add the single-percentile scores to the leaderboards, and have been going back through the puzzles with those as my target. I've been rather pleased to see that my scores beat the 1% mark in a few cases, but in most cases, even though I top the leaderboard among my friends list, I'm usually a bit shy of the mark.

One puzzle in which I had already exceeded the first percentile was the highway sign puzzle: I had 84 cycles to the first percentile score of 86. This is a case where, while I won't state categorically that a faster solution is impossible, I'm fairly sure I have the puzzle dialed in, and I have no idea where any more cycles could possibly come from.

In another case, I had been rather pleased with my score on Tutorial 4 of 143 cycles. But then I saw that the first percentile had a score of 137, and decided that just wouldn't do at all. To make a long story short, I stared at my computer for an hour, and now have a score of 115 cycles.

That one was tricky, but I think I learned some things while doing it that may end up being applicable to other puzzles. You can keep learning things from these tutorials, even after finishing the game.

I'm also currently beating the first percentile on the Alliance Power and Light puzzle, with a score of 18 cycles vs. the first percentile score of 21 cycles. That one also took some doing, and actually required breaking out the whiteboard to diagram things out. (I'm not completely convinced that I can't squeeze another cycle out of it, either.)

While I've been doing well in the early game, many of my solutions in the latter half of the game are completely woeful, and could really use this sort of attention. I'll get there eventually, but for the most part, I'm starting at the top of the list and working my way down.

I'm generally dissatisfied with most of my solutions do far, but the highway sign is the main one. I'm ploughing on rather than optimising as I go now.

I need a better max method in general. My current standard solution has EXA A storing the tag of the max, sending the values to EXA B which stores the current max value. A sends 3 values to B, a valid flag, the value twice (so B can compare the first one and decide whether to copy or void the second), and then a result sent from B to A, which A uses to decide whether to update the tag in its X register.

A is reading a file, but B could probably use a file or something to do something with that. It might not be fewer cycles though.

I've started trying to kill my other exas to avoid per loop bailout checks. That's something I can use more I think.

Re: Highway sign

Spoiler:

Div and mod commands are your friend for the highway sign. You keep a counter in X, and the x coordinate is X % 9, the y coordinate is X/9.

Step 1: Open 30 copies of the zine PDF because pushing the button doesn't seem to do anything.

This is going to go well....

Katy wrote:

Step 1: Open 30 copies of the zine PDF because pushing the button doesn't seem to do anything.

This is going to go well....

Step 2: Print the zine but flip pages on the wrong axis so you can't make it into a booklet.

(Printers are evil.)

Step 3: Spend $15 on the printed Zine and bonus fun stuff.

Step 4: Profit!

Also, I've friended the lot of you on Steam. My leaderboards are too empty!

I have not started yet. Gotta do business travel this week so I don't want to get hooked yet lol.

...

One private register, one shared register, and one file handle. I guess I have to approach this differently...

NOTE CREATE TEMP FILE MAKE COPY F ... DANG IT I CAN ONLY HAVE ONE FILE OPEN
Katy wrote:

One private register, one shared register, and one file handle. I guess I have to approach this differently...

Or even one private register, one multipurpose register, one shared register and one file handle. Hmmm.

Is there any way to test if a REPL instruction will be successful? It waits to execute if there's no memory location for a new EXA. I want to REPL if there's room, or do something else if there isn't.

It would be easy if REPL "just failed" instead of waiting around to execute successfully.

(Or maybe I should just exploit the fact that I know that all the test cases have the same network architecture. Seems unfair somehow, though.)