Skip to content

Instantly share code, notes, and snippets.

@Ivoah
Created February 3, 2016 20:44
Show Gist options
  • Save Ivoah/c3ee85774fcd10f58451 to your computer and use it in GitHub Desktop.
Save Ivoah/c3ee85774fcd10f58451 to your computer and use it in GitHub Desktop.
class Node(object):
def __init__(self, code):
self.code = code.split('\n')
self.line = 0
self.pin = {'UP': None,
'DOWN': None,
'LEFT': None,
'RIGHT': None}
self.pout = {'UP': None,
'DOWN': None,
'LEFT': None,
'RIGHT': None}
self.acc = 0
self.bak = 0
self.last = None
def label(self, lbl):
for i, v in enumerate(code)
if lbl == v:
return i
def arg(self, arg):
try:
return int(arg)
except ValueError:
if self.pin == 'ANY':
for side in self.pin.keys():
v = self.pin[side]
if v:
self.pin[side] = None
return v
self.line -= 1
return None
else:
v = self.pin[arg]
if v:
self.pin[arg] = None
return v
else:
self.line -= 1
return None
def send(self, value, port):
def step(self):
instr = self.code[self.line].split()[0]
args = self.code[self.line].split()[1:]
if instr == 'NOP' or instr[-1] == ':' or instr[0] == '#':
self.line += 1
elif instr == 'MOV':
if args[1] == 'ACC':
self.acc = self.arg(args[0])
else:
self.send(self.arg(args[0]), args[1])
self.line += 1
elif instr == 'SWP':
a = self.bak
self.bak = self.acc
self.acc = a
self.line += 1
elif instr == 'SAV':
self.bak = self.acc
self.line += 1
elif instr == 'ADD':
self.acc = self.acc + self.arg(args[0])
self.line += 1
elif instr == 'SUB':
self.acc = self.acc - self.arg(args[0])
self.line += 1
elif instr == 'NEG':
self.acc = -self.acc
self.line += 1
elif instr == 'JMP':
self.line = self.label(args[0])
self.line += 1
elif instr == 'JEZ':
if self.acc == 0:
self.line = self.label(args[0])
elif instr == 'JNZ':
if self.acc ~= 0:
self.line = self.label(args[0])
elif instr == 'JGZ':
if self.acc > 0:
self.line = self.label(args[0])
elif instr == 'JLZ':
if self.acc < 0:
self.line = self.label(args[0])
elif instr == 'JRO':
self.line += self.arg(args[0])
if self.line < 0: self.line = 0
if self.line > len(self.code) - 1: self.line = len(self.code) - 1
elif instr == 'HCF':
import sys
sys.exit(1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment