Essay - Published: 2023.06.21 | create | ctech | exapunks |
DISCLOSURE: If you buy through affiliate links, I may earn a small commission. (disclosures)
I've been playing a lot of Exapunks recently and been enjoying it. I love the complex simplicity of Zachtronics games and this one is no exception - allowing you to program in an assembly-like language.
Some of these get pretty hard and require a certain insight to accomplish them but that makes solving them so much more satisfying.
In this post I'll be holding my solutions to all puzzles in Exapunks. Hopefully it helps you get unstuck or shares some new ways of solving things.
A few caveats:

For this challenge, I decided to create 3 exas with their own job:
datereader
NOTE DATEREADER
LINK 800
LINK 801
COPY #DATE M
HALT
paywriter
NOTE PAYWRITER
LINK 800
GRAB 201
SEEK 9999
COPY M F ; DATE
MODE
COPY M F ; USERID
COPY M F ; DOLLARS
COPY M F ; CENTS
DROP
HALT
debtreader
NOTE DEBTREADER
GRAB 300
COPY F X
DROP
LINK 800
GRAB 200
MARK SCANLOOP
TEST F = X
FJMP SCANLOOP
COPY X M ; USERID
COPY F M ; DOLLARS
COPY F M ; CENTS
SEEK -2
COPY 0 F
COPY 0 F
HALT

For this solution, I split the process into two exas:
Highlights:
messagereader
NOTE MESSAGEREADER
GRAB 300
MARK READMESSAGE
COPY F M
TEST EOF
FJMP READMESSAGE
HALT
signwriter
NOTE SIGNWRITER
LINK 800
NOTE FILEWRITE
NOTE ROW, COL, CHAR
MARK FILEWRITE
DIVI X 9 T ; T = ROW
COPY T #DATA
MULI 9 T T
SUBI X T T ; T = COL
COPY T #DATA
COPY M #DATA
ADDI X 1 X
TEST X = 27
FJMP FILEWRITE
HALT

For this solution, we just use 1 exa that recursively spawns itself for a "tree-like" search:
Highlights:
searcher
NOTE SEARCHER
LINK 800
NOTE SEARCH
MARK SEARCH
ADDI X 1 X
TEST X = 4
TJMP KILLANDFETCH
REPL SEARCHR
MARK SEARCHL
LINK 800
JUMP SEARCH
MARK SEARCHR
LINK 801
JUMP SEARCH
MARK KILLANDFETCH
KILL
GRAB 276
LINK -1
LINK -1
LINK -1
LINK -1

For this solution, we use two exas:
Highlights:
FileFinder
NOTE FILEFINDER
GRAB 300
COPY F X
DROP
NOTE FINDHOST
MARK FINDHOST
LINK 800
HOST T
TEST T = X
FJMP FINDHOST
NOTE HOSTFOUND-GETMETA
NOTE META: NAME,OFF,LEN
GRAB 200
COPY M X
MARK FINDENTRY
TEST F = X
FJMP FINDENTRY
NOTE ENTRYFOUND-SETLOOP
COPY F T ; OFFSET
COPY F X ; LEN
NOTE SETTOOFFSET
SEEK -9999
SEEK T
COPY X M
MARK READDATA
COPY F M
SUBI X 1 X
TEST X = 0
FJMP READDATA
DROP
HALT
HostSendWrite
NOTE HOSTSENDWRITE
NOOP
NOOP
NOOP
NOTE SENDTARGETENTRY
GRAB 300
SEEK 1 ; TO TARGETNAME
COPY F X
COPY X M
DROP
NOTE WRITEENTRIES
MAKE
COPY M X
MARK WRITEDATA
COPY M F
SUBI X 1 X
TEST X = 0
FJMP WRITEDATA
HALT

For this solution, we use two Exas:
FindUserDB
NOTE FINDUSERDB
GRAB 300
COPY F X
DROP
LINK 800
GRAB 199
MARK FINDUSERDB
TEST F = X
FJMP FINDUSERDB
NOTE USERFILE TO M
SEEK 1
COPY F M
DROP
HALT
OverwriteUserDb
NOTE OVERWRITEUSERDB
LINK 800
LINK 799
COPY M X
GRAB X
COPY 0 X
SEEK 2
MARK SUMALL
ADDI X F X
TEST EOF
FJMP SUMALL
SEEK -9999
SEEK 2
MARK WRITEALL
TEST X > 75
TJMP WRITE75
JUMP WRITEREST
MARK WRITE75
COPY 75 F
SUBI X 75 X
JUMP WRITEALL
MARK WRITEREST
COPY X F
MARK END
DROP
HALT
The best way to support my work is to like / comment / share for the algorithm and subscribe for future updates.