https://github.com/paulwoitaschek/synacorchallenge
https://github.com/paulwoitaschek/synacorchallenge
Last synced: about 1 month ago
JSON representation
- Host: GitHub
- URL: https://github.com/paulwoitaschek/synacorchallenge
- Owner: PaulWoitaschek
- Created: 2023-01-07T22:12:23.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2023-01-09T20:25:05.000Z (over 2 years ago)
- Last Synced: 2025-03-24T14:42:11.415Z (7 months ago)
- Language: Kotlin
- Size: 114 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Puzzle
In this repo I'm solving the [Syncaor Challenge](https://challenge.synacor.com/) puzzle.
## Synacor Challenge
In this challenge, your job is to use this architecture spec to create a
virtual machine capable of running the included binary. Along the way,
you will find codes; submit these to the challenge website to track
your progress. Good luck!### Architecture
- three storage regions
- memory with 15-bit address space storing 16-bit values
- eight registers
- an unbounded stack which holds individual 16-bit values
- all numbers are unsigned integers `0..32767` (15-bit)
- all math is modulo `32768`; `32758 + 15 => 5`### Binary format
- each number is stored as a 16-bit little-endian pair (low byte, high byte)
- numbers `0..32767` mean a literal value
- numbers `32768..32775` instead mean registers 0..7
- numbers `32776..65535` are invalid
- programs are loaded into memory starting at address 0
- address 0 is the first 16-bit value, address 1 is the second 16-bit value, etc### Execution
- After an operation is executed, the next instruction to read is immediately after the last argument of the current operation. If a jump
was performed, the next operation is instead the exact destination of the jump.
- Encountering a register as an operation argument should be taken as reading from the register or setting into the register as appropriate.### Hints
- Start with operations 0, 19, and 21.
- Here's a code for the challenge website: xyzqPkrAlwtq
- The program `9,32768,32769,4,19,32768` occupies six memory addresses and should:
- Store into register 0 the sum of 4 and the value contained in register 1.
- Output to the terminal the character with the ascii code contained in register 0.### opcode listing
```
halt: 0
stop execution and terminate the program
set: 1 a b
set register to the value of
push: 2 a
push onto the stack
pop: 3 a
remove the top element from the stack and write it into ; empty stack = error
eq: 4 a b c
set to 1 if is equal to ; set it to 0 otherwise
gt: 5 a b c
set to 1 if is greater than ; set it to 0 otherwise
jmp: 6 a
jump to
jt: 7 a b
if is nonzero, jump to
jf: 8 a b
if is zero, jump to
add: 9 a b c
assign into the sum of and (modulo 32768)
mult: 10 a b c
store into the product of and (modulo 32768)
mod: 11 a b c
store into the remainder of divided by
and: 12 a b c
stores into the bitwise and of and
or: 13 a b c
stores into the bitwise or of and
not: 14 a b
stores 15-bit bitwise inverse of in
rmem: 15 a b
read memory at address and write it to
wmem: 16 a b
write the value from into memory at address
call: 17 a
write the address of the next instruction to the stack and jump to
ret: 18
remove the top element from the stack and jump to it; empty stack = halt
out: 19 a
write the character represented by ascii code to the terminal
in: 20 a
read a character from the terminal and write its ascii code to ; it can be assumed that once input starts, it will continue until a newline is encountered; this means that you can safely read whole lines from the keyboard and trust that they will be fully read
noop: 21
no operation
```