Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement