from functools import cmp_to_key from json import loads from tools.aoc import AOCDay from tools.tools import compare from typing import Any def packet_compare(left: list, right: list, debug: int = 0) -> int: for l_value, r_value in zip(left, right): if isinstance(l_value, list) and isinstance(r_value, int): r_value = [r_value] elif isinstance(l_value, int) and isinstance(r_value, list): l_value = [l_value] if r_value != l_value: if isinstance(l_value, int): return compare(l_value, r_value) else: return packet_compare(l_value, r_value, debug + 1) if len(left) != len(right): return compare(len(left), len(right)) return -1 class Day(AOCDay): inputs = [ [ (13, "input13_test"), (6428, "input13"), ], [ (140, "input13_test"), (22464, "input13"), ] ] def parse_input(self) -> list: return [loads(x) for x in self.getInput() if x] def part1(self) -> Any: packets = self.parse_input() index_sum = 0 for x in range(len(packets) // 2): if packet_compare(packets[x * 2], packets[x * 2 + 1]) == -1: index_sum += x + 1 return index_sum def part2(self) -> Any: packets = self.parse_input() packets.extend([[[2]], [[6]]]) sorted_packets = sorted(packets, key=cmp_to_key(packet_compare)) return (sorted_packets.index([[2]]) + 1) * (sorted_packets.index([[6]]) + 1) if __name__ == '__main__': day = Day(2022, 13) day.run(verbose=True)