#!/usr/bin/env python3 from logging import debug, DEBUG, basicConfig from sys import argv def parse_input( input_filepath: str, ) -> list[tuple[list[bool], list[list[bool]], list[int]]]: with open(file=input_filepath, mode="r") as input_file: input_data: list[str] = input_file.readlines() debug(f"\n\nRAW INPUT: {input_data}\n\n") # Not even trying to be legible anymore. return [ ( [l == "#" for l in line.split()[0][1:-1]], [ [ str(w) in l[1:-1].split(",") for w in range(len(line.split()[0][1:-1])) ] for l in line.split()[1:-1] if line ], [int(j) for j in line.split()[-1][1:-1].split(",")], ) for line in input_data ] def traverse_tree( solution: list[bool], choices: list[list[bool]], states: list[list[bool]] ) -> int: debug( "CURRENT STATES: %s", ["".join(["#" if x else "." for x in s]) for s in states], ) if solution in states: debug("FOUND IT") return 0 new_states: list[list[bool]] = [] for state in states: for choice_index in range(len(choices)): temp_state = state.copy() for c in range(len(choices[choice_index])): if choices[choice_index][c]: temp_state[c] = not temp_state[c] new_states.append(temp_state) return 1 + traverse_tree(solution, choices, new_states) def find_shortest_solutions( manual: list[tuple[list[bool], list[list[bool]], list[int]]], ) -> list[int]: output: list[int] = [] for line in manual: debug( "CURRENT SOLUTION: %s\nCURRENT CHOICES: %s", "".join(["#" if x else "." for x in line[0]]), ["".join(["#" if x else "." for x in button]) for button in line[1]], ) output.append(traverse_tree(line[0], line[1], [[False] * len(line[0])])) return output def main() -> None: input_filepath = "input/manual.txt" input_manual = parse_input(input_filepath) # debug("MANUAL\n%s", "\n".join([str(x) for x in input_manual])) shortest_solutions = find_shortest_solutions(input_manual) debug(f"SHORTEST SOLUTIONS: {shortest_solutions}") print(f"The sum of shortest solution is: {sum(shortest_solutions)}") return if __name__ == "__main__": if "-d" in argv or "--debug" in argv: basicConfig(filename="debug.log", level=DEBUG) main() exit(0)