Advent of Code 2022 day 13 is done
I figured out my problem: I wasn’t correctly handing the scenario where a list had been exhausted with no result. I was incorrectly assuming that when either side of the list had been exhausted, a result must have been obtained.
Final code:
from functools import cmp_to_key
from utils import get_raw_input_as_str
def parse_raw_input(raw_input):
return [[eval(packet) for packet in pair.splitlines()] for pair in raw_input.split("\n\n")]
def compare(left, right):
if type(left) == type(right) == list:
result = None
i = 0
while result is None:
if len(left) != len(right) and len(left) <= i:
return 1
elif len(left) != len(right) and len(right) <= i:
return -1
elif len(left) == i and len(right) == i:
return None
else:
result = compare(left[i], right[i])
i += 1
return result
elif type(left) == type(right) == int:
if left < right:
return 1
elif left > right:
return -1
else:
return None
elif type(left) == int and type(right) != int:
return compare([left], right)
elif type(right) == int and type(left) != int:
return compare(left, [right])
else:
raise Exception
def part_one(input):
return sum([i + 1 for i, pair in enumerate(input) if compare(pair[0], pair[1]) == 1])
def part_two(input):
flattened_input = [packet for pair in input for packet in pair] + [[[2]]] + [[[6]]]
sorted_packets = sorted(flattened_input, key=cmp_to_key(compare), reverse=True)
return (sorted_packets.index([[2]]) + 1) * (sorted_packets.index([[6]]) + 1)
if __name__ == '__main__':
print(f"Part one: {part_one(parse_raw_input(get_raw_input_as_str('day_13_input.txt')))}")
print(f"Part one: {part_two(parse_raw_input(get_raw_input_as_str('day_13_input.txt')))}")