Skip to content

Commit 1a61eb7

Browse files
author
Björn Walter
committed
Solve Day 14
Change-Id: Id9b1522bee8e0c35e4231dd0b9d0e74555f2cbb5
1 parent f0e5203 commit 1a61eb7

File tree

3 files changed

+124
-37
lines changed

3 files changed

+124
-37
lines changed

10.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import numpy as np
22

3-
def traverse
3+
def traverse(grid, pos):
4+
return
45

56
def main():
67
with open("inputs/10_test.txt", "r") as file:

13.py

+65-14
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,85 @@
11
import numpy as np
2+
import math
23

34

45
def find_symmetry(pattern):
56
#horizontal
6-
for i, row in enumerate(pattern):
7-
top = pattern[:i]
8-
bottom = np.flip(pattern[i:i*2], axis=0)
7+
for i, _ in enumerate(pattern):
8+
if i < len(pattern)/2:
9+
top = pattern[:i]
10+
bottom = np.flip(pattern[i:i*2], axis=0)
11+
else:
12+
bottom = np.flip(pattern[i:], axis=0)
13+
top = pattern[i-len(bottom):i]
14+
if np.array_equal(top, bottom) and i != 0:
15+
return i*100
16+
#vertical
17+
hpattern = pattern.T
18+
19+
for i, _ in enumerate(hpattern):
20+
if i < len(hpattern)/2:
21+
top = hpattern[:i]
22+
bottom = np.flip(hpattern[i:i*2], axis=0)
23+
else:
24+
bottom = np.flip(hpattern[i:], axis=0)
25+
top = hpattern[i-len(bottom):i]
926
if np.array_equal(top, bottom) and i != 0:
10-
return i, "horizontal"
11-
for j, _ in enumerate(pattern[0]):
12-
left = pattern[:,:j]
13-
right = np.flip(pattern[:, j:j*2], axis=0)
14-
print(left, right)
15-
if np.array_equal(left, right) and j != 0:
16-
return j, "vertical"
27+
return i
28+
29+
def all_versions(pattern):
30+
versions = []
31+
32+
r, c = len(pattern), len(pattern[0])
33+
34+
for i in range(r):
35+
for j in range(c):
36+
smudged_pattern = [row.copy() for row in pattern]
37+
smudged_pattern[i][j] = "#" if pattern[i][j] == "." else "."
38+
39+
versions.append(smudged_pattern)
40+
return versions
1741

1842

1943
def main():
20-
with open("inputs/13_test.txt", "r") as file:
44+
with open("inputs/13.txt", "r") as file:
2145
lines = file.readlines()
2246
patterns = []
2347
pattern = []
2448
for i, line in enumerate(lines):
25-
if line == "\n" or i == len(lines)-1:
26-
patterns.append(np.array([list(map(str, row)) for row in pattern]))
49+
if i == len(lines)-1:
50+
pattern.append(line.strip("\n"))
51+
patterns.append(np.array([list(map(str, row)) for row in pattern]))
52+
if line == "\n":
53+
patterns.append(np.array([list(map(str, row)) for row in pattern]))
2754
pattern = []
2855
else:
2956
pattern.append(line.strip("\n"))
30-
find_symmetry(patterns[0])
57+
scores = []
58+
#find_symmetry(patterns[2])
59+
for pattern in patterns:
60+
score = find_symmetry(pattern)
61+
if score:
62+
scores.append(score)
63+
print(len(scores))
64+
print(sum(scores))
65+
66+
#part 2
67+
68+
extended_patterns = []
69+
for pattern in patterns:
70+
extended_pattern = all_versions(pattern)
71+
72+
extended_patterns += extended_pattern
73+
#print(extended_pattern)
74+
75+
scores2 = []
76+
for pattern in extended_patterns:
3177

78+
score = find_symmetry(pattern)
79+
if score:
80+
scores2.append(score)
81+
print(len(scores2))
82+
print(sum(scores2))
3283

3384
#print(patterns)
3485
if __name__ == "__main__":

14.py

+57-22
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,72 @@
11
import numpy as np
22

3-
def shift_stones(row):
4-
for idx, _ in enumerate(row):
5-
if row[-idx-1] == "O":
6-
right = row[-idx:]
7-
for i, _ in enumerate(right):
8-
if right[i+1] == "#" or right[i+1] == "O":
9-
right[i] = "O"
10-
new_row = row[-idx-2] + "." + right
11-
row = new_row
12-
break
13-
elif i == len(right):
14-
right[i] = "O"
15-
new_row = row[-idx-2] + "." + right
16-
row = new_row
17-
break
18-
else:
19-
continue
20-
return row
3+
def shift_stones(platform):
4+
shifted_platform = []
5+
for row in platform:
6+
for i, _ in enumerate(row):
7+
if row[-i-1] == "O":
8+
right = row[-i-1:]
9+
for j, _ in enumerate(right):
10+
if j == 0 and i == 0:
11+
continue
12+
elif j == len(right)-1:
13+
row[-i-1] = "."
14+
right[j] = "O"
15+
16+
new_row = new_row = np.concatenate([row[:-i],right[-i:]])
17+
row = new_row
18+
break
19+
elif right[j+1] == "#" or right[j+1] == "O":
20+
row[-i-1] = "."
21+
right[j] = "O"
22+
23+
new_row = np.concatenate([row[:-i],right[-i:]])
24+
row = new_row
25+
break
26+
else:
27+
continue
28+
shifted_platform.append(list(row))
29+
return shifted_platform
30+
31+
def get_load(pl):
32+
total_load = 0
33+
for row in pl:
34+
for i, pos in enumerate(row):
35+
if pos == "O":
36+
total_load += i+1
37+
return total_load
38+
39+
def perform_cycle(pl):
40+
for i in range(4):
41+
pl = np.rot90(pl, k=-1)
42+
pl = shift_stones(pl)
43+
return pl
44+
45+
2146

2247

2348
def main():
24-
with open("inputs/14_test.txt", "r") as file:
49+
with open("inputs/14.txt", "r") as file:
2550
lines = file.readlines()
2651
platform = []
2752
for line in lines:
2853
row = line.strip("\n").split()
2954
platform.append([*row[0]])
30-
print(platform)
55+
#print(platform)
3156
platform = np.array(platform)
57+
shifted_platform = shift_stones(np.rot90(platform, k=-1))#platform[::-1].T)
3258

33-
for row in platform:
34-
row = shift_stones(row)
59+
for row in shifted_platform:
60+
print(row)
61+
print(get_load(shifted_platform))
62+
63+
# Part 2
64+
for i in range(10000):
65+
platform = perform_cycle(platform)
66+
print(f"Load: {get_load(np.rot90(platform, k=-1))}, cycle: {i+1}")
67+
# Write some code to detect the repeating pattern...
68+
# I found that the pattern repeats every 17th cycle after about 100 loops.
69+
# (1000000000-109)%17 = 0 so answer is same as after 109 cycles.
3570

3671

3772
if __name__ == "__main__":

0 commit comments

Comments
 (0)