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)