Co-authored-by: Mikael CAPELLE <mikael.capelle@thalesaleniaspace.com> Co-authored-by: Mikaël Capelle <capelle.mikael@gmail.com> Reviewed-on: #3
49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
from typing import Any, Iterator
|
|
|
|
import numpy as np
|
|
|
|
from ..base import BaseSolver
|
|
|
|
|
|
class Solver(BaseSolver):
|
|
def solve(self, input: str) -> Iterator[Any]:
|
|
lines = input.splitlines()
|
|
|
|
sections: list[tuple[tuple[int, int], tuple[int, int]]] = [
|
|
(
|
|
(
|
|
int(line.split(" -> ")[0].split(",")[0]),
|
|
int(line.split(" -> ")[0].split(",")[1]),
|
|
),
|
|
(
|
|
int(line.split(" -> ")[1].split(",")[0]),
|
|
int(line.split(" -> ")[1].split(",")[1]),
|
|
),
|
|
)
|
|
for line in lines
|
|
]
|
|
|
|
np_sections = np.array(sections).reshape(-1, 4)
|
|
|
|
x_max, y_max = (
|
|
max(np_sections[:, 0].max(), np_sections[:, 2].max()),
|
|
max(np_sections[:, 1].max(), np_sections[:, 3].max()),
|
|
)
|
|
|
|
counts_1 = np.zeros((y_max + 1, x_max + 1), dtype=int)
|
|
counts_2 = counts_1.copy()
|
|
|
|
for (x1, y1), (x2, y2) in sections:
|
|
x_rng = range(x1, x2 + 1, 1) if x2 >= x1 else range(x1, x2 - 1, -1)
|
|
y_rng = range(y1, y2 + 1, 1) if y2 >= y1 else range(y1, y2 - 1, -1)
|
|
|
|
if x1 == x2 or y1 == y2:
|
|
counts_1[list(y_rng), list(x_rng)] += 1
|
|
counts_2[list(y_rng), list(x_rng)] += 1
|
|
elif abs(x2 - x1) == abs(y2 - y1):
|
|
for i, j in zip(y_rng, x_rng):
|
|
counts_2[i, j] += 1
|
|
|
|
yield (counts_1 >= 2).sum()
|
|
yield (counts_2 >= 2).sum()
|