Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from secrets import token_bytes
- from sys import argv
- from time import sleep
- rules = {
- '111': '0',
- '110': '1',
- '101': '1',
- '100': '0',
- '011': '1',
- '010': '1',
- '001': '1',
- '000': '0',
- }
- def prettify(tape: str) -> str:
- return tape.replace('0', ' ').replace('1', '.')
- def next_generation(tape: str) -> str:
- tape = tape
- new_tape = rules[tape[-1:] + tape[:2]]
- for i in range(0, len(tape) - 2):
- code = tape[i:i+3]
- new_tape += rules[code]
- new_tape += rules[tape[-2:] + tape[0]]
- return new_tape
- def simulate(tape: str, number_of_generations: int, delay: int, use_pretty: bool = False):
- if number_of_generations == 0:
- number_of_generations = -1
- while number_of_generations != 0:
- print(prettify(tape) if use_pretty else tape)
- sleep(delay/1000)
- tape = next_generation(tape)
- number_of_generations -= 1
- def setup_tape(tape_len: int, starting_string: str) -> str:
- string = ''
- if starting_string != '':
- while len(string) < tape_len:
- string += starting_string
- else:
- while len(string) < tape_len:
- string += "{0:b}".format(int.from_bytes(token_bytes(), 'little'))
- return string[:tape_len]
- def interactive():
- val = 20
- prevval = val
- while val != 0:
- print(f'example tape_len={val}')
- print(setup_tape(int(val), ''))
- prevval = val
- val = input('next int len to try (or non-int to stop): ')
- try:
- val = int(val)
- except:
- val = 0
- tape = setup_tape(prevval, '')
- simulate(tape, 0, 42, True)
- def usage(script):
- print(f'usage: python {script} [tape_len|interactive|i] [number_of_generations] [delay in ms] [prettify] [starting_string]')
- print('\ttape_len is the integer number of elements in the tape')
- print('\fif interactive or i is chosen, interactively determine the best length')
- print('\tif number_of_generations is omitted or is 0, the simulation will continue until interrupted')
- print('\tif delay is omitted or is 0, a 42ms delay is used as default')
- print('\tif prettify is set to 1, the prettifier will be used')
- print('\tif starting_string has len less than tape_len, it will be repeated to fill out the rest')
- def main(args):
- if len(args) == 1 or args[1] in ('h', '?', '-h', '-?', '--help'):
- usage(args[0])
- exit()
- starting_string = args[5] if len(args) == 6 else ''
- use_pretty = (args[4] in ('1', 'True', 'true')) if len(args) >= 5 else False
- delay = int(args[3]) if len(args) >= 4 else 42
- delay = delay if delay > 0 else 42
- number_of_generations = int(args[2]) if len(args) >= 3 else 0
- if args[1] in ('interactive', 'i'):
- return interactive()
- tape_len = int(args[1])
- tape = setup_tape(tape_len, starting_string)
- simulate(tape, number_of_generations, delay, use_pretty)
- if __name__ == '__main__':
- main(argv)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement