<--

Synacor Challenge

2024-07-25


After participating in Advent of Code for a few years now, I have grown a fan of Eric Wastl's puzzles. This is a multi-part challenge that involves implementing a virtual machine to interpret and run the supplied binary file. You are also given a document outlining the architecture specification of the machine that can run the binary file. Once completed and the basic functionality tests are passed, you're taken through a text-based game as the program runs, that is very similar to AoC stories. The goal is to find 8 codes while completing various puzzles in the program. Before the original site was taken down, it could be used to validate the codes you found, but since it is no longer up, The codes can be manually verified. Thanks to Aneurysm9/vm_challenge for providing a binary file and matching checksums for the codes. I wrote a small script to validate them from a text file. I chose to implement my solution in C with a simple stack data structure, as that seems most fitting for this project. My implementation and related tools can be found here. The rest of what's on this page is likely to be spoilers of the challenge.

Code 1

This one is found in plain text in the arch-spec file.

== hints ==
- Start with operations 0, 19, and 21.
- Here's a code for the challenge website: <CODE>

Code 2

After implementing a basic interpreter that supports the first subset of opcodes (out, noop, and halt), this one is found in the output of program itself.

Welcome to the Synacor OSCON 2012 Challenge!
Please record your progress by putting codes like
this one into the challenge website: <CODE>

Just for fun, this one can also be spotted early on in the hexdump of the binary file:

00000210  13 00 20 00 13 00 49 00  13 00 6d 00 13 00 6f 00  |.. ...I...m...o.|
00000220  13 00 46 00 13 00 7a 00  13 00 74 00 13 00 57 00  |..F...z...t...W.|
00000230  13 00 51 00 13 00 43 00  13 00 76 00 13 00 78 00  |..Q...C...v...x.|
00000240  13 00 6a 00 13 00 0a 00  13 00 0a 00 13 00 45 00  |..j.............|

Code 3

To retrieve this code, the interpreter must be fully implemented and must pass the initial self-tests. If those conditions are met, the third code is printed.

Executing self-test...

self-test complete, all tests pass
The self-test completion code is: <CODE>

Code 4

Now, the adventure aspect of the challenge begins. Pay attention to the things of interest, and take/use them as needed, like the tablet here.

What do you do?
take tablet

Taken.

What do you do?
use tablet

You find yourself writing <CODE> on the tablet.  Perhaps it's some 
kind of code?

Code 5

This appears to be a maze puzzle after several entries of some cardinal directions. I mapped my steps with pen and paper and after not too long, I arrive at the next code, but not without getting lost and eaten by Grue's numerous times.

What do you do?
east

Chiseled on the wall of one of the passageways, you see:

    <CODE>

Code 6

The next puzzle is a maths problem. There will be some coins each with a numeric value that you can inspect to see. The coins must be arranged in a specific order to satisfy the equation on the wall.

There is a strange monument in the center of the hall with circular slots and unusual symbols.  It reads:

_ + _ * _^2 + _^3 - _ = 399

This is easy enough to be by hand, but why not make another script to do it. Looks like 9 + 2*5^2 + 7^3 - 3 = 399 will do, so arrange the coins in order blue, red, shiny, concave, corroded. After completing this, a previously locked door opens and our next code is revealed.

What do you do?
use teleporter

You activate the teleporter!  As you spiral through time and space, you think you see a pattern in the stars...

    <CODE>

Code 7

This is by far the most clever puzzle in this challenge. There's a strange book that contains some information about using the teleporter. Some way of logging instructions and register values is crucial for this puzzle. It appears we must set the 8th register to a certain value. We can set the register to a non-zero value to progress in the program, but it will not provide the correct code, thus we need to find the correct value. The underlying algorithm is a variation of the Ackermann function. The modified function can be found in the program used to find the register value. Python proved to be a too slow to compute this. Once set to the correct value (25734 in my case), the seventh code is shown.

You wake up on a sandy beach with a slight headache.  The last thing you remember is activating that teleporter... but now you can't find it anywhere in your pack.  Someone seems to have drawn a message in the sand here:

    <CODE>

It begins to rain. The message washes away. You take a deep breath and feel firmly grounded in reality as the effects of the teleportation wear off.

Code 8

This puzzle looks to be some sort of arrangement of tiles, each with a number of arithmetic operation. By moving from one tile to another, you are constructing an expression that must evaluate to the number on the door: 30. This is a BFS application to construct the shortest path to the door. I made another script to achieve this. After inputting the appropriate cardinal directions, we see the final code in a mirror. Of course, it is entered in reverse.

You gaze into the mirror, and you see yourself gazing back.
But wait!
It looks like someone wrote on your face while you were unconscious on the beach!
Through the mirror, you see <CODE> scrawled in charcoal on your forehead.

Congratulations; you have reached the end of the challenge!