74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
VERBOSE = True
|
|
def verbose(s = "", **kwargs):
|
|
if VERBOSE:
|
|
print(s, **kwargs)
|
|
|
|
def get_c(s: str):
|
|
c0 = s.split(',')
|
|
return [int(c0[0]), int(c0[1])]
|
|
|
|
def get_input(sample = False, part = 1):
|
|
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
|
tmp = f.readlines()
|
|
ret = {"coords": [], "map_dim": [0, 0]}
|
|
for line in tmp:
|
|
coords = line.split(' -> ')
|
|
c0 = get_c(coords[0])
|
|
c1 = get_c(coords[1])
|
|
ret["coords"].append([c0, c1])
|
|
ret["map_dim"][0] = c0[0] + 1 if c0[0] + 1 > ret["map_dim"][0] else ret["map_dim"][0]
|
|
ret["map_dim"][1] = c0[1] + 1 if c0[1] + 1 > ret["map_dim"][1] else ret["map_dim"][1]
|
|
ret["map_dim"][0] = c1[0] + 1 if c1[0] + 1 > ret["map_dim"][0] else ret["map_dim"][0]
|
|
ret["map_dim"][1] = c1[1] + 1 if c1[1] + 1 > ret["map_dim"][1] else ret["map_dim"][1]
|
|
|
|
return ret
|
|
|
|
|
|
def result(inp, part = 1):
|
|
m = [[0 for _ in range(inp["map_dim"][0])] for _ in range(inp["map_dim"][1])]
|
|
for c_pair in inp["coords"]:
|
|
x1, y1 = c_pair[0]
|
|
x2, y2 = c_pair[1]
|
|
if x1 == x2 or y1 == y2 or (part == 2 and abs(x2 - x1) == abs(y2 - y1)):
|
|
if x1 == x2:
|
|
for y in range(min(y1, y2), max(y1, y2) + 1):
|
|
m[y][x1] += 1
|
|
elif y1 == y2:
|
|
for x in range(min(x1, x2), max(x1, x2) + 1):
|
|
m[y1][x] += 1
|
|
elif abs(y1 - y2) == abs(x1 - x2):
|
|
d = (
|
|
1 if x1 < x2 else -1,
|
|
1 if y1 < y2 else -1
|
|
)
|
|
verbose(f"going through {x1, y1 = }, {x2, y2 = } with {d = }")
|
|
x = x1
|
|
y = y1
|
|
m[y][x] += 1
|
|
for _ in range(abs(y2 - y1)):
|
|
x = x + d[0]
|
|
y = y + d[1]
|
|
verbose(f"{x, y = }")
|
|
m[y][x] += 1
|
|
|
|
|
|
|
|
res = 0;
|
|
for row in m:
|
|
for cell in row:
|
|
if cell == 0:
|
|
verbose('.', end='')
|
|
else:
|
|
verbose(cell, end='')
|
|
res += 1 if cell >= 2 else 0
|
|
|
|
verbose()
|
|
verbose()
|
|
|
|
return res
|
|
|
|
|
|
if __name__ == "__main__":
|
|
VERBOSE = False
|
|
print(result(get_input(), part = 2))
|