https://github.com/dplocki/synacor-challenge
Solution for Synacor Challange.
https://github.com/dplocki/synacor-challenge
challange python simulator synacor synacor-challenge virtual-machine
Last synced: about 2 months ago
JSON representation
Solution for Synacor Challange.
- Host: GitHub
- URL: https://github.com/dplocki/synacor-challenge
- Owner: dplocki
- License: gpl-3.0
- Created: 2021-01-01T20:23:39.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2021-01-14T18:25:43.000Z (over 4 years ago)
- Last Synced: 2025-01-14T14:11:41.505Z (3 months ago)
- Topics: challange, python, simulator, synacor, synacor-challenge, virtual-machine
- Language: Jupyter Notebook
- Homepage:
- Size: 116 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Synacor Challenge

Solution for [Synacor Challenge](https://challenge.synacor.com/).
Language used: **Python**.
## Tasks
### Virtual machine
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.#### Optcodes
| Name | Code | Parameters | Notes |
|------|------|------------|-------|
| halt | 0 | | stop execution and terminate the program |
| set | 1 | a b | set register `a` to the value of `b` |
| push | 2 | a | push `a` onto the stack |
| pop | 3 | a | remove the top element from the stack and write it into `a`; empty stack = error |
| eq | 4 | a b c | set `a` to 1 if `b` is equal to `c`; set it to 0 otherwise |
| gt | 5 | a b c | set `a` to 1 if `b` is greater than `c`; set it to 0 otherwise |
| jmp | 6 | a | jump to `a` |
| jt | 7 | a b | if `a` is nonzero, jump to `b` |
| jf | 8 | a b | if `a` is zero, jump to `b` |
| add | 9 | a b c | assign into `a` the sum of `b` and `c` (modulo 32768) |
| mult | 10 | a b c | store into `a` the product of `b` and `c` (modulo 32768) |
| mod | 11 | a b c | store into `a` the remainder of `b` divided by `c` |
| and | 12 | a b c | stores into `a` the bitwise and of `b` and `c` |
| or | 13 | a b c | stores into `a` the bitwise or of `b` and `c` |
| not | 14 | a b | stores 15-bit bitwise inverse of `b` in `a` |
| rmem | 15 | a b | read memory at address `b` and write it to `a` |
| wmem | 16 | a b | write the value from `b` into memory at address `a` |
| call | 17 | a | write the address of the next instruction to the stack and jump to `a` |
| 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 `a` to the terminal |
| in | 20 | a | read a character from the terminal and write its ascii code to `a`; 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 |### Running
Run Virtual Machine by command:
```bash
python main.py
```#### Parameters
- `-l`: load dump file (excepte file name after `-l` option)
- `-d`: display debug information during running programExample:
```bash
python main.py -l save.dump -d
```### Decompiling
Run decompile script. The script requires dump file to operate on.
```bash
python decompile.py -l save.dump
```## Other puzzles notes
After running the virtual machine, we can play in the text advature hidden in the given program. In the game we can find another puzzles:
- [A puzzle for open the door](./puzzles/door_puzzle.ipynb)
- [A puzzle breaking the teleporter check function](./puzzles/check_code.ipynb)
- [A puzzle with bypassing the check function invoking](./puzzles/bypassing_the_check.md)
- [A puzzle with opening the vault lock](./puzzles/vault_lock.ipynb)
- [A puzzle with mirror](./puzzles/mirror_puzzle.md)