-
Notifications
You must be signed in to change notification settings - Fork 0
/
2023_13.py
65 lines (55 loc) · 1.64 KB
/
2023_13.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from aocd import get_data, post
from common import *
def solve(data, p):
puzzles = data.split('\n\n')
total = 0
for puzzle in puzzles:
lines = puzzle.splitlines()
m, n = len(lines[0]), len(lines)
hori_scores = []
for y in range(n):
score = 0
for x in range(m):
score = (score << 1) + (lines[y][x] == '#')
hori_scores.append(score)
vert_scores = []
for x in range(m):
score = 0
for y in range(n):
score = (score << 1) + (lines[y][x] == '#')
vert_scores.append(score)
ans = 0
for score_set, mult in ((vert_scores, 1), (hori_scores, 100)):
for split_after_idx in range(0, len(score_set) - 1):
mirror_zips = list(zip(score_set[split_after_idx + 1:], score_set[split_after_idx::-1]))
mismatches = [i for i in mirror_zips if i[0] != i[1]]
if (p == 1 and len(mismatches) == 0) or \
(p == 2 and len(mismatches) == 1 and bin(mismatches[0][0] ^ mismatches[0][1]).count('1') == 1):
ans += (split_after_idx + 1) * mult
total += ans
return total
s1 = '''#.##..##.
..#.##.#.
##......#
##......#
..#.##.#.
..##..##.
#.#.##.#.
#...##..#
#....#..#
..##..###
#####.##.
#####.##.
..##..###
#....#..#'''
tests = {
s1: (405, 400)
}
test_assertions(tests, solve)
input_data = get_data(day=13, year=2023)
p1 = solve(input_data, p=1)
print(f"Part 1: {p1}")
# post.submit(p1, part=1, day=13, year=2023)
p2 = solve(input_data, p=2)
print(f"Part 2: {p2}")
# post.submit(p2, part=2, day=13, year=2023)