From 19bd3221b34e7fb6b389c61b54897e8290287149 Mon Sep 17 00:00:00 2001 From: Dmitry Fedotov Date: Fri, 27 Dec 2024 22:08:19 +0300 Subject: [PATCH] add day8 part 2 --- day8/code.py | 89 +++++++++++++++++++++++++++++++------------- day8/input_test2.txt | 10 +++++ day8/task.txt | 2 + 3 files changed, 75 insertions(+), 26 deletions(-) create mode 100644 day8/input_test2.txt diff --git a/day8/code.py b/day8/code.py index 2a668c1..0da3f25 100644 --- a/day8/code.py +++ b/day8/code.py @@ -2,63 +2,100 @@ import sys sys.path.append('../aoclib') from aoclib import Input +import sys + +sys.setrecursionlimit(10**6) def find_pairs(field): - '''suboptimal (shitty) code''' pairs = set() for y in range(len(field)): for x in range(len(field[0])): if field[y][x] == '.': continue - for y2 in range(len(field)): + for y2 in range(y, len(field)): for x2 in range(len(field[0])): if x == x2 and y == y2: continue if field[y][x] == field[y2][x2]: # this is a pair - pairs.add((x, y, x2, y2)) + pairs.add(((x, y), (x2, y2))) return pairs -def find_antinodes(pair, field): - x, y, x2, y2 = pair - x_diff = abs(x - x2) - y_diff = abs(y - y2) +def find_antinodes(pair: tuple[tuple[int]], field): + p1, p2 = pair + x_diff = p2[0] - p1[0] + y_diff = p2[1] - p1[1] - one, two = None, None - if x2 >= x and y2 >= y: - one = (y-y_diff, x-x_diff) - two = (y2+y_diff, x2+x_diff) - elif x2 >= x and y2 < y: - one = (y+y_diff, x-x_diff) - two = (y2-y_diff, x2+x_diff) + one, two = (p1[0] - x_diff, p1[1] - y_diff), (p2[0] + x_diff, p2[1] + y_diff) - antinodes = [] - if one and not out_of_bounds(one, field): - antinodes.append(one) - if two and not out_of_bounds(two, field): - antinodes.append(two) - - return antinodes + nodes = [] + if out_of_bounds(one, field): + one = None + if out_of_bounds(two, field): + two = None + + return one, two + def out_of_bounds(c, field): return c[0] < 0 or c[1] < 0 or c[0] >= len(field[0]) or c[1] >= len(field) + def solve1(field: list): pairs = find_pairs(field) - print(pairs) antinodes = set() for p in pairs: - for anode in find_antinodes(p, field): - antinodes.add(anode) + one, two = find_antinodes(p, field) + if one: + antinodes.add(one) + if two: + antinodes.add(two) + + return len(antinodes) + + +def solve2(field: list): + pairs = find_pairs(field) + antinodes = set() + for p in pairs: + p1, p2 = p + antinodes.add(p1) + antinodes.add(p2) + + one, two = find_antinodes(p, field) + run = True + while run: + _one, _two = None, None + if one: + antinodes.add(one) + _one, _ = find_antinodes((one, p1), field) + if two: + antinodes.add(two) + _, _two = find_antinodes((p2, two), field) + + if not _one and not _two: + run = False + continue + + if _one: + p1 = one + one = _one + + if _two: + p2 = two + two = _two + return len(antinodes) if __name__ == '__main__': - #field = Input('input_test.txt').lines_as_lists() + #field = Input('input_test2.txt').lines_as_lists() field = Input('input.txt').lines_as_lists() + # print(find_pairs(field)) + #part 1 print('part 1:', solve1(field)) #part 2 - print('part 2:', '') + print('part 2:', solve2(field)) diff --git a/day8/input_test2.txt b/day8/input_test2.txt new file mode 100644 index 0000000..d12dbde --- /dev/null +++ b/day8/input_test2.txt @@ -0,0 +1,10 @@ +T....#.... +...T...... +.T....#... +.........# +..#....... +.......... +...#...... +.......... +....#..... +.......... diff --git a/day8/task.txt b/day8/task.txt index 638dd68..64493e7 100644 --- a/day8/task.txt +++ b/day8/task.txt @@ -115,4 +115,6 @@ The original example now has 34 antinodes, including the antinodes that appear o Calculate the impact of the signal using this updated model. How many unique locations within the bounds of the map contain an antinode? +Your puzzle answer was 1249. +Both parts of this puzzle are complete! They provide two gold stars: **