day 13
This commit is contained in:
parent
33f5dce9e5
commit
d23a4e136b
86
src/day13.py
Normal file
86
src/day13.py
Normal file
@ -0,0 +1,86 @@
|
||||
import json
|
||||
from functools import cmp_to_key
|
||||
from math import prod
|
||||
from typing import Union
|
||||
|
||||
from cpl_core.console import Console
|
||||
from cpl_query.extension import List
|
||||
|
||||
from aoc.aoc import get_input
|
||||
|
||||
# global vars
|
||||
day = 13
|
||||
aoc_input = get_input(2022, day)
|
||||
test_input = """[1,1,3,1,1]
|
||||
[1,1,5,1,1]
|
||||
|
||||
[[1],[2,3,4]]
|
||||
[[1],4]
|
||||
|
||||
[9]
|
||||
[[8,7,6]]
|
||||
|
||||
[[4,4],4,4]
|
||||
[[4,4],4,4,4]
|
||||
|
||||
[7,7,7,7]
|
||||
[7,7,7]
|
||||
|
||||
[]
|
||||
[3]
|
||||
|
||||
[[[]]]
|
||||
[[]]
|
||||
|
||||
[1,[2,[3,[4,[5,6,7]]]],8,9]
|
||||
[1,[2,[3,[4,[5,6,0]]]],8,9]
|
||||
"""
|
||||
|
||||
|
||||
def compare(left: Union[int, list], right: Union[int, list]):
|
||||
match left, right:
|
||||
case int(), list():
|
||||
return compare([left], right)
|
||||
case list(), int():
|
||||
return compare(left, [right])
|
||||
case int(), int():
|
||||
return left - right
|
||||
case list(), list():
|
||||
for i, j in zip(left, right):
|
||||
if (r := compare(i, j)) != 0:
|
||||
return r
|
||||
return compare(len(left), len(right))
|
||||
|
||||
|
||||
def main(lines=aoc_input, part2=False):
|
||||
lists: List[List[int]] = List(str, lines.splitlines()) \
|
||||
.select(lambda x: List(object, json.loads(x)) if x != '' else None) \
|
||||
.split(lambda x: None) \
|
||||
.select(lambda x: x.where(lambda y: y is not None))
|
||||
|
||||
if not part2:
|
||||
lists: List[List[int]] = List(str, lines.splitlines()) \
|
||||
.select(lambda x: List(object, json.loads(x)) if x != '' else None) \
|
||||
.split(lambda x: None) \
|
||||
.select(lambda x: x.where(lambda y: y is not None))
|
||||
compared = lists \
|
||||
.where(lambda pair: compare(pair.element_at(0).to_list(), pair.element_at(1).to_list()) < 0) \
|
||||
.select(lambda x: lists.index_of(x) + 1)
|
||||
|
||||
Console.write_line(compared.count(), compared.sum(lambda x: x))
|
||||
return
|
||||
|
||||
two_six = List(object, [List(object, [List(object, [2])]), List(object, [List(object, [6])])])
|
||||
compared = lists.extend(two_six) \
|
||||
.select_many(lambda x: x.select(lambda y: y.to_list() if isinstance(x, List) else y).to_list() if isinstance(x, List) else x) \
|
||||
.order_by(cmp_to_key(compare))
|
||||
|
||||
Console.write_line(prod(two_six.select_many(lambda x: x.select(lambda y: compared.index_of(y.to_list()) + 1))))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
Console.write_line(f'Advent of code day {day}')
|
||||
main()
|
||||
Console.write_line()
|
||||
main(part2=True)
|
||||
Console.write_line()
|
Loading…
Reference in New Issue
Block a user