Guest User

Untitled

a guest
Dec 27th, 2024
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.29 KB | None | 0 0
  1. from argparse import ArgumentParser
  2. from typing import Callable, Dict, Optional
  3.  
  4.  
  5. class Byte(int):
  6.     def __init__(self, *_):
  7.         assert self >= 0 and self <= 255, 'pizdec'
  8.  
  9.     def __add__(self, value: int) -> 'Byte':
  10.         return Byte((int(self) + value) % 256)
  11.  
  12.     def __sub__(self, value: int) -> 'Byte':
  13.         return Byte((int(self) - value) % 256)
  14.  
  15.  
  16. class Interpretator:
  17.     def __init__(self, instructions: str):
  18.         self._instructions = instructions
  19.         self._stack = [
  20.             Byte(0),
  21.         ]
  22.         self._pointer = 0
  23.         self._position = 0
  24.         self._jump_to = {}
  25.         self._stdout = []
  26.  
  27.         left_stack = []
  28.         for i, char in enumerate(instructions):
  29.             if char == '[':
  30.                 left_stack.append(i)
  31.             elif char == ']':
  32.                 to = left_stack.pop()
  33.                 self._jump_to[to] = i
  34.                 self._jump_to[i] = to
  35.  
  36.     def now(self):
  37.         handlers: Dict[str, Callable[[], Optional[int]]] = {
  38.             '>': self._handle_increment_pointer,
  39.             '<': self._handle_decrement_pointer,
  40.             '+': self._handle_increment_data,
  41.             '-': self._handle_decrement_data,
  42.             '.': self._handle_stdout,
  43.             '[': self._handle_left_jump,
  44.             ']': self._handle_right_jump,
  45.         }
  46.  
  47.         stop = len(self._instructions)
  48.         while self._position < stop:
  49.             instruction = self._instructions[self._position]
  50.             new_position = handlers[instruction]()
  51.             if new_position is None:
  52.                 new_position = self._position + 1
  53.             self._position = new_position
  54.  
  55.         if self._stdout:
  56.             output = ''.join(self._stdout)
  57.             print(output)
  58.  
  59.     @property
  60.     def _pdata(self) -> Byte:
  61.         return self._stack[self._pointer]
  62.  
  63.     @_pdata.setter
  64.     def _pdata(self, value: Byte):
  65.         self._stack[self._pointer] = value
  66.  
  67.     def _move_pointer(self, to: int):
  68.         if to < 0:
  69.             raise ValueError('ebanulsja?')
  70.  
  71.         self._pointer = to
  72.         increase_on = self._pointer - (len(self._stack) - 1)
  73.         if increase_on > 0:
  74.             self._stack.extend(
  75.                 [Byte(0)] * increase_on
  76.             )
  77.  
  78.     def _handle_increment_pointer(self) -> Optional[int]:
  79.         self._move_pointer(self._pointer + 1)
  80.  
  81.     def _handle_decrement_pointer(self) -> Optional[int]:
  82.         self._move_pointer(self._pointer - 1)
  83.  
  84.     def _handle_increment_data(self) -> Optional[int]:
  85.         self._pdata += 1
  86.  
  87.     def _handle_decrement_data(self) -> Optional[int]:
  88.         self._pdata -= 1
  89.  
  90.     def _handle_left_jump(self) -> Optional[int]:
  91.         if self._pdata == 0:
  92.              return self._jump_to[self._position]
  93.  
  94.     def _handle_right_jump(self) -> Optional[int]:
  95.         if self._pdata != 0:
  96.             return self._jump_to[self._position]
  97.  
  98.     def _handle_stdout(self) -> Optional[int]:
  99.         self._stdout.append(chr(self._pdata))
  100.  
  101.  
  102. def interpretate(data: str) -> str:
  103.     return data
  104.  
  105.  
  106. def main():
  107.     parser = ArgumentParser()
  108.     parser.add_argument('brainfuck', action='store', type=str)
  109.     data: str = parser.parse_args().brainfuck
  110.     interpretate = Interpretator(data)
  111.     interpretate.now()
  112.  
  113.  
  114. if __name__ == '__main__':
  115.     main()
  116.  
Advertisement
Add Comment
Please, Sign In to add comment