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()
