Advertisement
matrus

metafuck.py (autopep8)

May 7th, 2024
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.14 KB | Source Code | 0 0
  1. import sys
  2. import string
  3. import math
  4. from getch import getch
  5.  
  6.  
  7. def bf(prog: str):
  8.     tape = [0 for _ in range(30000)]
  9.     pointer = 0
  10.     i = 0
  11.     while 1:
  12.         if i >= len(prog):
  13.             break
  14.         char = prog[i]
  15.         if char == '>':
  16.             pointer = (pointer + 1) % len(tape)
  17.         elif char == '<':
  18.             pointer = (pointer - 1) % len(tape)
  19.         elif char == '+':
  20.             tape[pointer] = (tape[pointer] + 1) % 256
  21.         elif char == '-':
  22.             tape[pointer] -= (tape[pointer] - 1) % 256
  23.         elif char == '.':
  24.             print(chr(tape[pointer]), end='')
  25.         elif char == ',':
  26.             tape[pointer] = ord(getch())
  27.         elif char == '[':
  28.             if tape[pointer] == 0:
  29.                 brackets = 1
  30.                 while (brackets > 0):
  31.                     i += 1
  32.                     if i >= len(prog):
  33.                         break
  34.                     if prog[i] == '[':
  35.                         brackets += 1
  36.                     elif prog[i] == ']':
  37.                         brackets -= 1
  38.         elif char == ']':
  39.             if tape[pointer] != 0:
  40.                 brackets = 1
  41.                 while (brackets > 0):
  42.                     i -= 1
  43.                     if i < 0:
  44.                         break
  45.                     if prog[i] == ']':
  46.                         brackets += 1
  47.                     elif prog[i] == '[':
  48.                         brackets -= 1
  49.         i += 1
  50.  
  51.  
  52. def base2number(digits: list[int], base: int) -> int:
  53.     return sum(digit * base ** i for i, digit in enumerate(digits[::-1]))
  54.  
  55.  
  56. def number2base(number: int, base: int) -> list[int]:
  57.     result = []
  58.     while number > 0:
  59.         result.append(number % base)
  60.         number //= base
  61.     return result[::-1]
  62.  
  63.  
  64. def string2base(string: str, characters: str) -> list[int]:
  65.     return number2base(sum(characters.index(character) * len(characters) ** i for i, character in enumerate(string[::-1])), len(characters))
  66.  
  67.  
  68. def string2number(string: str, characters: str) -> int:
  69.     return base2number(string2base(string, characters), len(characters))
  70.  
  71.  
  72. def number2lsys(number: int, characters: str) -> dict[str, str]:
  73.     binary = bin(number)[2:]
  74.     repeats = math.ceil(len(binary) / len(characters) ** 2)
  75.     binary = binary.rjust(len(characters) ** 2 * repeats, '0')
  76.     print(binary)
  77.     rules = {}
  78.     j = 0
  79.     for character in characters:
  80.         rules[character] = ''
  81.         for _ in range(repeats):
  82.             for k in range(len(characters)):
  83.                 if binary[j] == '1':
  84.                     rules[character] += characters[k]
  85.                 j += 1
  86.     return rules
  87.  
  88.  
  89. charset = string.ascii_letters + string.digits + string.punctuation + ' \t\n'
  90. encset = string.printable
  91.  
  92. sys.set_int_max_str_digits(0)
  93. dimension = ' '.join(sys.argv[1:])
  94. with open(dimension, 'r') as f:
  95.     dimension = f.read()
  96. n = string2number(dimension, encset)
  97. rules = number2lsys(n, charset)
  98. prog = []
  99. while (1):
  100.     try:
  101.         prog.append(input())
  102.     except EOFError:
  103.         break
  104. axiom = '\n'.join(prog)
  105. result = ''
  106. for character in axiom:
  107.     result += rules[character]
  108. bf(result)
  109.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement