MicroCorruption/17-Lagos/generate_lut.py

63 lines
1.9 KiB
Python

import string
from string import printable
from math import ceil, floor
valid = 0
valid_chars = (string.digits + string.ascii_uppercase + string.ascii_lowercase).encode()
def u16(i:int):
return i & 0xffff
def half_pair(i: int) -> list:
i = u16(i)
return [floor(i/2), ceil(i/2)]
def neg_half_pair(i: int) -> list:
# 2's c negate i
i = 0x10000 - u16(i)
return half_pair(i)
def not_in_set(set, start: int = 0x0, end: int = 0xff):
for char in range(start, end+1):
if char not in set:
print(F"{char:02x}[{chr(char)}]", end=" ")
def isprintable(char: int):
return f'{chr(char)}' if char > 0x30 and chr(char) in printable else "."
# for solution in sorted(solutions):
# print(f"{solution:02x} '{isprintable(solution)}'= {solutions[solution]}")
def bfs(start, end, characters = valid_chars): #function for BFS
solutions = {}
queue = []
# Populate solutions with trivial solutions, and queue with the same
for character in characters:
solutions[character] = f'{character:x}';
queue.append(character)
# loop until the queue is empty, and every reachable number has been found
while queue:
current = queue.pop(0)
for neighbor in characters:
for operator, operation in [['+', int.__add__], ['-', int.__sub__]]:
new = operation(current, neighbor)
if new in solutions: continue
if new in range(start, end+1):
solutions[new] = f"{solutions[current]} {operator} {neighbor:x}"
queue.append(new)
return solutions
super_valid_chars:bytes = []
for one in valid_chars:
for two in valid_chars:
super_valid_chars.append (int.from_bytes(one.to_bytes(1, 'big') + two.to_bytes(1, 'big'), 'big'))
solutions = bfs(0, 0xffff, super_valid_chars)
for solution in sorted(solutions):
bas = solution.to_bytes(2, 'big')
print(f"{solution:04x} '{isprintable(bas[0])}{isprintable(bas[1])}'= {solutions[solution]}")
exit()