aoc-2025/10/main.py

85 lines
2.5 KiB
Python
Raw Normal View History

2025-12-10 23:19:35 -06:00
#!/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)