aoc2022/solutions/04/main.py
Ari Archer ef161cfccb
day 4: make it prettier
Signed-off-by: Ari Archer <ari.web.xyz@gmail.com>
2022-12-04 17:35:10 +02:00

67 lines
1.6 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""AoC -- day 4"""
import sys
from warnings import filterwarnings as filter_warnings
import tabulate # type: ignore
def log(msg: str) -> None:
print(f" \033[1m\033[32m*\033[0m {msg}")
def part_one(data: list[tuple[int, ...]]) -> int:
return sum(
line[0] <= line[2] <= line[3] <= line[1]
or line[2] <= line[0] <= line[1] <= line[3]
for line in data
)
def part_two(data: list[tuple[int, ...]]) -> int:
return sum(
line[0] <= line[2] <= line[1] or line[2] <= line[0] <= line[3] for line in data
)
def main() -> int:
"""Entry/main function"""
log("Reading and splitting data from stdin")
data: list[list[str]] = [line.split(",") for line in map(str.strip, sys.stdin)]
log("Prepating data")
data_preped: list[tuple[int, ...]] = [
tuple(map(int, (*line[0].split("-"), *line[1].split("-")))) for line in data
]
log("Solving problems")
print(
"\n"
+ tabulate.tabulate(
(
(
len(data_preped),
part_one(data_preped),
part_two(data_preped),
),
),
headers=(
"Data size",
"Full ranges (pt 1)",
"Overlapping ranges (pt 2)",
),
tablefmt="grid",
)
)
return 0
if __name__ == "__main__":
assert main.__annotations__.get("return") is int, "main() should return an integer"
filter_warnings("error", category=Warning)
sys.exit(main())