from itertools import product import string import subprocess def check_pair(script, instr, outstr): result = subprocess.run( ["/usr/bin/env", "bash", "-c", script], input=instr.encode(), capture_output=True, ) return result.returncode == 0 and result.stdout == outstr.encode() def check_pairs(script, pairs): for pair in pairs: if not check_pair(script, *pair): return False return True def find_script(pairs, max_length): candidates = [] chars = len(string.printable) total_options = int((chars ** (max_length + 1) - 1) / (chars - 1)) current_option = 0 for length in range(max_length + 1): for letters in product(string.printable, repeat=length): if current_option % 1000 == 0: print(f"Progress: {current_option}/{total_options}") script = "".join(letters) if check_pairs(script, pairs): print("> Found candidate:", script) candidates.append(script) current_option += 1 print("Candidates:", candidates) if __name__ == '__main__': # Identity print("\nSearching for identity") find_script(( ("1", "1"), ("2", "2"), ("3", "3"), ), max_length=2) # Successor print("\nSearching for successor") find_script(( ("1", "2"), ("2", "3"), ("3", "4"), ), max_length=5)