Created
June 23, 2019 08:11
-
-
Save aadibajpai/44a30540a57a12673fb8374e756bba9f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
π π₯ 0οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 7οΈβ£ 4οΈβ£ 8οΈβ£ 8οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 6οΈβ£ 7οΈβ£ 5οΈβ£ 8οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 6οΈβ£ 5οΈβ£ 9οΈβ£ 9οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 6οΈβ£ 2οΈβ£ 8οΈβ£ 5οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 6οΈβ£ 0οΈβ£ 9οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 5οΈβ£ 5οΈβ£ 0οΈβ£ 5οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 5οΈβ£ 4οΈβ£ 1οΈβ£ 7οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 4οΈβ£ 8οΈβ£ 3οΈβ£ 2οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 4οΈβ£ 4οΈβ£ 5οΈβ£ 0οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 3οΈβ£ 8οΈβ£ 9οΈβ£ 3οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 3οΈβ£ 9οΈβ£ 2οΈβ£ 6οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 3οΈβ£ 4οΈβ£ 3οΈβ£ 7οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 2οΈβ£ 8οΈβ£ 3οΈβ£ 3οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 2οΈβ£ 7οΈβ£ 4οΈβ£ 1οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 2οΈβ£ 5οΈβ£ 3οΈβ£ 3οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 1οΈβ£ 5οΈβ£ 0οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 1οΈβ£ 3οΈβ£ 4οΈβ£ 2οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 5οΈβ£ 0οΈβ£ 3οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 5οΈβ£ 5οΈβ£ 0οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 3οΈβ£ 1οΈβ£ 9οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 7οΈβ£ 5οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 0οΈβ£ 7οΈβ£ β π₯ π₯ | |
π π₯ 8οΈβ£ 9οΈβ£ 2οΈβ£ β π₯ π₯ | |
π π₯ 8οΈβ£ 9οΈβ£ 3οΈβ£ β π₯ π₯ | |
π π₯ 6οΈβ£ 6οΈβ£ 0οΈβ£ β π₯ π₯ | |
π π₯ 7οΈβ£ 4οΈβ£ 3οΈβ£ β π₯ π₯ | |
π π₯ 2οΈβ£ 6οΈβ£ 7οΈβ£ β π₯ π₯ | |
π π₯ 3οΈβ£ 4οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 2οΈβ£ 6οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 3οΈβ£ 3οΈβ£ 9οΈβ£ β π₯ π₯ | |
π π₯ 2οΈβ£ 0οΈβ£ 8οΈβ£ β π₯ π₯ | |
π π₯ 2οΈβ£ 1οΈβ£ 6οΈβ£ β π₯ π₯ | |
π π₯ 2οΈβ£ 4οΈβ£ 2οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 7οΈβ£ 2οΈβ£ β π₯ π₯ | |
π π₯ 7οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 4οΈβ£ 9οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 1οΈβ£ 9οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 1οΈβ£ 3οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 1οΈβ£ 9οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 6οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ β | |
ππ πΆππ©π πΏ π₯ π₯ π₯ π₯ π₯ π π₯ 3οΈβ£ 8οΈβ£ 9οΈβ£ β | |
π₯ π₯ π₯ π₯ | |
π π°ππ©ππ πΆ | |
π π€ | |
π π₯ 1οΈβ£ β π₯ π₯ π‘ πΏ π₯ | |
π π π°π πΆππ©π π | |
π π₯ 9οΈβ£ 8οΈβ£ 4οΈβ£ 2οΈβ£ 6οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 7οΈβ£ 8οΈβ£ 5οΈβ£ 0οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 7οΈβ£ 6οΈβ£ 0οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 7οΈβ£ 2οΈβ£ 8οΈβ£ 0οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 6οΈβ£ 8οΈβ£ 1οΈβ£ 5οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 6οΈβ£ 4οΈβ£ 4οΈβ£ 3οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 6οΈβ£ 3οΈβ£ 5οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 5οΈβ£ 9οΈβ£ 3οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 4οΈβ£ 8οΈβ£ 6οΈβ£ 5οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 4οΈβ£ 9οΈβ£ 5οΈβ£ 2οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 4οΈβ£ 6οΈβ£ 6οΈβ£ 9οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 4οΈβ£ 4οΈβ£ 4οΈβ£ 0οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 3οΈβ£ 9οΈβ£ 6οΈβ£ 9οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 3οΈβ£ 7οΈβ£ 6οΈβ£ 6οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ β | |
ππ πππΆπ© πΏ π₯ π₯ π₯ π₯ π₯ π π₯ 5οΈβ£ 6οΈβ£ 8οΈβ£ β | |
π₯ π₯ π₯ π₯ | |
π π°ππ©ππ πΆ | |
π π€ | |
π π₯ 1οΈβ£ β π₯ π₯ π‘ πΏ π₯ | |
π π π°π πππΆπ© π | |
π π₯ 1οΈβ£ 0οΈβ£ 1οΈβ£ 1οΈβ£ 4οΈβ£ 1οΈβ£ 0οΈβ£ 5οΈβ£ 8οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 1οΈβ£ 0οΈβ£ 6οΈβ£ 0οΈβ£ 2οΈβ£ 0οΈβ£ 6οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 1οΈβ£ 0οΈβ£ 3οΈβ£ 0οΈβ£ 0οΈβ£ 5οΈβ£ 5οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 0οΈβ£ 9οΈβ£ 9οΈβ£ 8οΈβ£ 9οΈβ£ 6οΈβ£ 6οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 0οΈβ£ 8οΈβ£ 8οΈβ£ 7οΈβ£ 9οΈβ£ 9οΈβ£ 0οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 0οΈβ£ 7οΈβ£ 6οΈβ£ 7οΈβ£ 0οΈβ£ 8οΈβ£ 5οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 0οΈβ£ 7οΈβ£ 0οΈβ£ 7οΈβ£ 0οΈβ£ 3οΈβ£ 6οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 0οΈβ£ 6οΈβ£ 5οΈβ£ 6οΈβ£ 1οΈβ£ 1οΈβ£ 1οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 0οΈβ£ 4οΈβ£ 0οΈβ£ 4οΈβ£ 0οΈβ£ 9οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 0οΈβ£ 1οΈβ£ 6οΈβ£ 0οΈβ£ 9οΈβ£ 2οΈβ£ 2οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 0οΈβ£ 1οΈβ£ 3οΈβ£ 1οΈβ£ 0οΈβ£ 1οΈβ£ 9οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 0οΈβ£ 1οΈβ£ 1οΈβ£ 1οΈβ£ 1οΈβ£ 0οΈβ£ 0οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 0οΈβ£ 0οΈβ£ 5οΈβ£ 9οΈβ£ 9οΈβ£ 2οΈβ£ 6οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 0οΈβ£ 0οΈβ£ 4οΈβ£ 9οΈβ£ 9οΈβ£ 8οΈβ£ 2οΈβ£ β π₯ π₯ | |
π π₯ 1οΈβ£ 0οΈβ£ 0οΈβ£ 0οΈβ£ 3οΈβ£ 0οΈβ£ 0οΈβ£ 4οΈβ£ 5οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 8οΈβ£ 9οΈβ£ 9οΈβ£ 9οΈβ£ 7οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 8οΈβ£ 1οΈβ£ 8οΈβ£ 5οΈβ£ 8οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 8οΈβ£ 0οΈβ£ 8οΈβ£ 1οΈβ£ 5οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 7οΈβ£ 8οΈβ£ 8οΈβ£ 4οΈβ£ 2οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 6οΈβ£ 5οΈβ£ 7οΈβ£ 9οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 5οΈβ£ 7οΈβ£ 5οΈβ£ 6οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 3οΈβ£ 8οΈβ£ 3οΈβ£ 0οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 3οΈβ£ 5οΈβ£ 4οΈβ£ 2οΈβ£ 7οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 3οΈβ£ 2οΈβ£ 2οΈβ£ 8οΈβ£ 9οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 3οΈβ£ 1οΈβ£ 4οΈβ£ 9οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 2οΈβ£ 7οΈβ£ 3οΈβ£ 8οΈβ£ 8οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 2οΈβ£ 6οΈβ£ 3οΈβ£ 7οΈβ£ 6οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 2οΈβ£ 3οΈβ£ 2οΈβ£ 1οΈβ£ 3οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 2οΈβ£ 1οΈβ£ 3οΈβ£ 9οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 1οΈβ£ 9οΈβ£ 1οΈβ£ 5οΈβ£ 4οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 1οΈβ£ 8οΈβ£ 0οΈβ£ 8οΈβ£ 2οΈβ£ β π₯ π₯ | |
π π₯ 9οΈβ£ 9οΈβ£ 1οΈβ£ 6οΈβ£ 2οΈβ£ 3οΈβ£ 9οΈβ£ β π₯ π₯ | |
π π₯ 7οΈβ£ 6οΈβ£ 5οΈβ£ β | |
ππ©π ππΆπ πΏ π₯ π₯ π₯ π₯ π₯ π π₯ 1οΈβ£ 0οΈβ£ 2οΈβ£ 3οΈβ£ β | |
π₯ π₯ π₯ π₯ | |
π π°ππ©ππ πΆ | |
π π€ | |
π π₯ 1οΈβ£ β π₯ π₯ π‘ πΏ π₯ | |
π π π°π©π ππΆπ π | |
β | |
πππ©ππ πΆ | |
π π₯ 2οΈβ£ β π₯ π₯ ππ πππ©πΆ | |
π π°π©πΆπππ | |
ππΆππ©π π π² π€ π π°πΆπ©π ππ β π | |
π€ π π°πππ πΆπ© | |
ππππ©πΆπ π² π€ π π°πΆπ©π ππ π | |
π€ πΏ π₯ π π₯ 1οΈβ£ β π₯ π₯ πͺ | |
π² π€ πΏ π₯ π₯ π₯ π₯ π₯ β° π π₯ π₯ | |
ππΆπ©π ππ π π₯ 1οΈβ£ β π₯ π₯ π‘ π π°π πππ©πΆ | |
ππ©πΆπππ | |
π€‘ π π₯ 2οΈβ£ β π₯ π₯ | |
πππ©π πΆπ πͺ π² π€ π π₯ 1οΈβ£ β π₯ π₯ | |
π π°πΆππ©π π π | |
π€ π€‘ π₯ π₯ | |
π¬ π² π π°πΆππ©π π π | |
π€ π€‘ π₯ π₯ π π₯ 1οΈβ£ β | |
π₯ π₯ π‘ π€‘ πΏ π₯ π π°ππ©π πΆπ | |
ππππ πΆπ© | |
π€‘ π€‘ π π₯ 0οΈβ£ β π₯ π₯ | |
πππ πΆπ©π π π₯ 1οΈβ£ 0οΈβ£ β π₯ π₯ | |
β πΏ π₯ π₯ π₯ π¬ | |
π₯ π₯ π‘ πΏ π₯ πΏ π₯ π€‘ π₯ π₯ πͺ | |
π² π€ π π₯ 1οΈβ£ β π₯ π₯ π π°πππ©πΆπ π | |
π€ π₯ π₯ π π₯ 1οΈβ£ 0οΈβ£ β π₯ π₯ π | |
π² π π°πππ©πΆπ π | |
π€‘ π₯ π₯ π π°ππ πΆπ©π |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
# Implements a simple stack-based VM | |
class VM: | |
def __init__(self, rom): | |
self.rom = rom | |
self.accumulator1 = 0 | |
self.accumulator2 = 0 | |
self.instruction_pointer = 1 | |
self.stack = [] | |
def step(self): | |
cur_ins = self.rom[self.instruction_pointer] | |
self.instruction_pointer += 1 | |
fn = VM.OPERATIONS.get(cur_ins, None) | |
if cur_ins[0] == 'π': | |
return | |
if fn is None: | |
raise RuntimeError("Unknown instruction '{}' at {}".format( | |
repr(cur_ins), self.instruction_pointer - 1)) | |
else: | |
fn(self) | |
def add(self): | |
self.stack.append(self.stack.pop() + self.stack.pop()) | |
def sub(self): | |
a = self.stack.pop() | |
b = self.stack.pop() | |
self.stack.append(b - a) | |
def if_zero(self): | |
if self.stack[-1] == 0: | |
while self.rom[self.instruction_pointer] != 'π': | |
if self.rom[self.instruction_pointer] in ['π', 'β°']: | |
break | |
self.step() | |
else: | |
self.find_first_endif() | |
self.instruction_pointer += 1 | |
def if_not_zero(self): | |
if self.stack[-1] != 0: | |
while self.rom[self.instruction_pointer] != 'π': | |
if self.rom[self.instruction_pointer] in ['π', 'β°']: | |
break | |
self.step() | |
else: | |
self.find_first_endif() | |
self.instruction_pointer += 1 | |
def find_first_endif(self): | |
while self.rom[self.instruction_pointer] != 'π': | |
self.instruction_pointer += 1 | |
def jump_to(self): | |
marker = self.rom[self.instruction_pointer] | |
if marker[0] != 'π°': | |
print('Incorrect symbol : ' + marker[0]) | |
raise SystemExit() | |
marker = 'π' + marker[1:] | |
self.instruction_pointer = self.rom.index(marker) + 1 | |
def jump_top(self): | |
self.instruction_pointer = self.stack.pop() | |
def exit(self): | |
print('\nDone.') | |
raise SystemExit() | |
def print_top(self): | |
sys.stdout.write(chr(self.stack.pop())) | |
sys.stdout.flush() | |
def push(self): | |
if self.rom[self.instruction_pointer] == 'π₯': | |
self.stack.append(self.accumulator1) | |
elif self.rom[self.instruction_pointer] == 'π₯': | |
self.stack.append(self.accumulator2) | |
else: | |
raise RuntimeError('Unknown instruction {} at position {}'.format( | |
self.rom[self.instruction_pointer], str(self.instruction_pointer))) | |
self.instruction_pointer += 1 | |
def pop(self): | |
if self.rom[self.instruction_pointer] == 'π₯': | |
self.accumulator1 = self.stack.pop() | |
elif self.rom[self.instruction_pointer] == 'π₯': | |
self.accumulator2 = self.stack.pop() | |
else: | |
raise RuntimeError('Unknown instruction {} at position {}'.format( | |
self.rom[self.instruction_pointer], str(self.instruction_pointer))) | |
self.instruction_pointer += 1 | |
def pop_out(self): | |
self.stack.pop() | |
def load(self): | |
num = 0 | |
if self.rom[self.instruction_pointer] == 'π₯': | |
acc = 1 | |
elif self.rom[self.instruction_pointer] == 'π₯': | |
acc = 2 | |
else: | |
raise RuntimeError('Unknown instruction {} at position {}'.format( | |
self.rom[self.instruction_pointer], str(self.instruction_pointer))) | |
self.instruction_pointer += 1 | |
while self.rom[self.instruction_pointer] != 'β': | |
num = num * 10 + (ord(self.rom[self.instruction_pointer][0]) - ord('0')) | |
self.instruction_pointer += 1 | |
if acc == 1: | |
self.accumulator1 = num | |
else: | |
self.accumulator2 = num | |
self.instruction_pointer += 1 | |
def clone(self): | |
self.stack.append(self.stack[-1]) | |
def multiply(self): | |
a = self.stack.pop() | |
b = self.stack.pop() | |
self.stack.append(b * a) | |
def divide(self): | |
a = self.stack.pop() | |
b = self.stack.pop() | |
self.stack.append(b // a) | |
def modulo(self): | |
a = self.stack.pop() | |
b = self.stack.pop() | |
self.stack.append(b % a) | |
def xor(self): | |
a = self.stack.pop() | |
b = self.stack.pop() | |
self.stack.append(b ^ a) | |
OPERATIONS = { | |
'π‘': add, | |
'π€‘': clone, | |
'π': divide, | |
'π²': if_zero, | |
'π': if_not_zero, | |
'π': jump_to, | |
'π': load, | |
'π¬': modulo, | |
'β': multiply, | |
'πΏ': pop, | |
'π€': pop_out, | |
'π€': print_top, | |
'π₯': push, | |
'πͺ': sub, | |
'π': xor, | |
'β°': jump_top, | |
'β': exit | |
} | |
if __name__ == '__main__': | |
if len(sys.argv) != 2: | |
print('Missing program') | |
raise SystemExit() | |
with open(sys.argv[1], 'r') as f: | |
print('Running ....') | |
all_ins = [''] | |
all_ins.extend(f.read().split()) | |
vm = VM(all_ins) | |
while 1: | |
vm.step() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment