diff --git a/synacor.py b/synacor.py new file mode 100755 index 0000000..e275da2 --- /dev/null +++ b/synacor.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +# synacor.py - An implementation of the Synacor Challenge +# Copyright © 2016 RunasSudo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import struct + +SYN_PTR = 0 +SYN_MEM = [0] * 32768 +SYN_REG = [0] * 8 +SYN_STK = [] + +class OpLiteral: + def __init__(self, value): + self.value = value; + def get(self): + return self.value; + def set(self, value): + raise Exception('Attempted to set literal value {} to {} at {}'.format(self.value, value, SYN_PTR)) + +class OpRegister: + def __init__(self, register): + self.register = register; + def get(self): + return SYN_REG[self.register]; + def set(self, value): + SYN_REG[self.register] = value; + +def readOp(word): + if 0 <= word <= 32767: + return OpLiteral(word) + if 32768 <= word <= 32775: + return OpRegister(word - 32768) + raise Exception('Invalid word {} at {}'.format(word, SYN_PTR)) + +def swallowOp(): + global SYN_PTR + op = readOp(SYN_MEM[SYN_PTR]) + SYN_PTR += 1 + return op + +# Read code into memory +with open('challenge.bin', 'rb') as data: + while True: + byteData = data.read(2) + if len(byteData) < 2: + break + SYN_MEM[SYN_PTR] = struct.unpack('