import sys import string import math from getch import getch def bf(prog: str): tape = [0 for _ in range(30000)] pointer = 0 i = 0 while 1: if i >= len(prog): break char = prog[i] if char == '>': pointer = (pointer + 1) % len(tape) elif char == '<': pointer = (pointer - 1) % len(tape) elif char == '+': tape[pointer] = (tape[pointer] + 1) % 256 elif char == '-': tape[pointer] -= (tape[pointer] - 1) % 256 elif char == '.': print(chr(tape[pointer]), end='') elif char == ',': tape[pointer] = ord(getch()) elif char == '[': if tape[pointer] == 0: brackets = 1 while (brackets > 0): i += 1 if i >= len(prog): break if prog[i] == '[': brackets += 1 elif prog[i] == ']': brackets -= 1 elif char == ']': if tape[pointer] != 0: brackets = 1 while (brackets > 0): i -= 1 if i < 0: break if prog[i] == ']': brackets += 1 elif prog[i] == '[': brackets -= 1 i += 1 def base2number(digits: list[int], base: int) -> int: return sum(digit * base ** i for i, digit in enumerate(digits[::-1])) def number2base(number: int, base: int) -> list[int]: result = [] while number > 0: result.append(number % base) number //= base return result[::-1] def string2base(string: str, characters: str) -> list[int]: return number2base(sum(characters.index(character) * len(characters) ** i for i, character in enumerate(string[::-1])), len(characters)) def string2number(string: str, characters: str) -> int: return base2number(string2base(string, characters), len(characters)) def number2lsys(number: int, characters: str) -> dict[str, str]: binary = bin(number)[2:] repeats = math.ceil(len(binary) / len(characters) ** 2) binary = binary.rjust(len(characters) ** 2 * repeats, '0') print(binary) rules = {} j = 0 for character in characters: rules[character] = '' for _ in range(repeats): for k in range(len(characters)): if binary[j] == '1': rules[character] += characters[k] j += 1 return rules charset = string.ascii_letters + string.digits + string.punctuation + ' \t\n' encset = string.printable sys.set_int_max_str_digits(0) dimension = ' '.join(sys.argv[1:]) with open(dimension, 'r') as f: dimension = f.read() n = string2number(dimension, encset) rules = number2lsys(n, charset) prog = [] while (1): try: prog.append(input()) except EOFError: break axiom = '\n'.join(prog) result = '' for character in axiom: result += rules[character] bf(result)