62 lines
1.6 KiB
Python
62 lines
1.6 KiB
Python
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)
|