8000 Add 2020 · nthistle/advent-of-code@1a3cfa3 · GitHub
[go: up one dir, main page]

Skip to content

Commit 1a3cfa3

Browse files
committed
Add 2020
1 parent cf42eb2 commit 1a3cfa3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+3016
-0
lines changed

2020/aoc_lib.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
def get_input():
3+
with open("input.txt") as f:
4+
s = f.read().strip()
5+
lines = s.split("\n")
6+
print(f"num lines = {len(lines)}")
7+
total_length = sum(len(line) for line in lines)
8+
print(f"avg line length = {round(total_length/len(lines),2)}")
9+
return s
10+
11+
def grid(s, split = None):
12+
if split is None:
13+
split = lambda line : list(line)
14+
s = s.split("\n")
15+
n = len(s)
16+
g = [split(line) for line in s]
17+
m = len(g[0])
18+
return n, m, g
19+

2020/day1/day1.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
with open("input.txt") as f:
2+
s = f.read().strip()
3+
4+
s = [int(x) for x in s.split("\n")]
5+
6+
# part 1
7+
for i in range(len(s)):
8+
for j in range(i+1,len(s)):
9+
if s[i]+s[j] == 2020:
10+
print(s[i]*s[j])
11+
12+
# part 2
13+
for i in range(len(s)):
14+
for j in range(i+1,len(s)):
15+
for k in range(j+1,len(s)):
16+
if s[i]+s[j]+s[k] == 2020:
17+
print(s[i]*s[j]*s[k])
18+
19+
20+
# faster version for neel
21+
s_set = set()
22+
for i in range(len(s)):
23+
if 2020 - s[i] in s_set:
24+
print(s[i]*(2020-s[i]))
25+
s_set.add(s[i])
26+
27+
s_set = set()
28+
for i in range(len(s)):
29+
for j in range(i+1,len(s)):
30+
if 2020 - s[i] - s[j] in s_set:
31+
print(s[i]*s[j]*(2020-s[i]-s[j]))
32+
s_set.add(s[i])

2020/day10/day10.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
with open("input.txt") as f:
2+
s = f.read().strip()
3+
4+
nums = [int(x) for x in s.split("\n")]
5+
nums.append(0)
6+
nums.append(max(nums)+3)
7+
8+
nums.sort()
9+
10+
c3 = sum(1 for i in range(1,len(nums)) if nums[i] - nums[i-1] == 3)
11+
c1 = sum(1 for i in range(1,len(nums)) if nums[i] - nums[i-1] == 1)
12+
13+
print(c1*c3)
14+
15+
cnts = [0]*(len(nums))
16+
17+
cnts[0] = 1
18+
for i in range(1,len(cnts)):
19+
for j in range(0,i):
20+
if nums[i] - nums[j] <= 3:
21+
cnts[i] += cnts[j]
22+
23+
print(cnts[-1])

2020/day10/day10_alt.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import numpy as np
2+
import time
3+
4+
with open("input.txt") as f:
5+
s = f.read().strip()
6+
7+
nums = [int(x) for x in s.split("\n")]
8+
nums.append(0)
9+
nums.append(max(nums)+3)
10+
#nums.sort()
11+
m#nums[4] = 5
12+
13+
st = time.time()
14+
15+
f = lambda i, j : j > i and nums[j] - nums[i] <= 3
16+
m = np.fromfunction(np.vectorize(f), (len(nums), len(nums)), dtype=np.int64).astype(np.int64)
17+
m[len(nums)-1, len(nums)-1] = 1
18+
19+
aux = np.eye(len(nums))
20+
21+
aux = np.linalg.matrix_power(m, len(nums))
22+
#ans = 0
23+
#for _ in range(len(nums)):
24+
# aux = aux @ m
25+
# ans += aux[0, len(nums) - 1]
26+
27+
et = time.time()
28+
29+
ans = aux[0, len(nums) - 1]
30+
31+
print(ans)
32+
print(et - st)

2020/day11/day11.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import sys, os
2+
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
3+
from aoc_lib import *
4+
5+
s = get_input()
6+
7+
n,m,g = grid(s)
8+
9+
nb = [(i,j) for i in range(-1,2) for j in range(-1,2) if (i,j) != (0,0)]
10+
11+
def apply(g):
12+
ng = [[-1 for _ in range(m)] for _ in range(n)]
13+
for i in range(n):
14+
for j in range(m):
15+
e_n = 0
16+
o_n = 0
17+
for di,dj in nb:
18+
ni, nj = i + di, j + dj
19+
if ni in range(n) and nj in range(m):
20+
if g[ni][nj] == "L":
21+
e_n += 1
22+
elif g[ni][nj] == "#":
23+
o_n += 1
24+
if g[i][j] == "L":
25+
if o_n == 0:
26+
ng[i][j] = "#"
27+
else:
28+
ng[i][j] = "L"
29+
elif g[i][j] == "#":
30+
if o_n >= 4:
31+
ng[i][j] = "L"
32+
else:
33+
ng[i][j] = "#"
34+
else:
35+
ng[i][j] = g[i][j]
36+
return ng
37+
38+
ts = lambda gg : "\n".join("".join(v for v in r) for r in gg)
39+
40+
ct = 0
41+
cg = g
42+
while ts(cg) != ts((ng := apply(cg))):
43+
cg = ng
44+
ct += 1
45+
46+
print(ct)
47+
print(sum(1 for i in range(n) for j in range(m) if cg[i][j] == "#"))
48+
49+
50+
adj = {}
51+
for i in range(n):
52+
for j in range(m):
53+
adj[i,j] = []
54+
for di,dj in nb:
55+
ni, nj = i + di, j + dj
56+
while ni in range(n) and nj in range(m) and g[ni][nj] == ".":
57+
ni += di
58+
nj += dj
59+
if ni in range(n) and nj in range(m):
60+
adj[i,j].append((ni,nj))
61+
62+
63+
def apply(g):
64+
ng = [[-1 for _ in range(m)] for _ in range(n)]
65+
for i in range(n):
66+
for j in range(m):
67+
e_n = 0
68+
o_n = 0
69+
for ni,nj in adj[i,j]:
70+
if ni in range(n) and nj in range(m):
71+
if g[ni][nj] == "L":
72+
e_n += 1
73+
elif g[ni][nj] == "#":
74+
o_n += 1
75+
if g[i][j] == "L":
76+
if o_n == 0:
77+
ng[i][j] = "#"
78+
else:
79+
ng[i][j] = "L"
80+
elif g[i][j] == "#":
81+
if o_n >= 5:
82+
ng[i][j] = "L"
83+
else:
84+
ng[i][j] = "#"
85+
else:
86+
ng[i][j] = g[i][j]
87+
return ng
88+
89+
cg = g
90+
while ts(cg) != ts((ng := apply(cg))):
91+
cg = ng
92+
93+
print(sum(1 for i in range(n) for j in range(m) if cg[i][j] == "#"))

2020/day11/day11_viz.py

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import sys, os
2+
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
3+
from aoc_lib import *
4+
5+
s = get_input()
6+
7+
n,m,g = grid(s)
8+
9+
nb = [(i,j) for i in range(-1,2) for j in range(-1,2) if (i,j) != (0,0)]
10+
11+
def apply(g):
12+
ng = [[-1 for _ in range(m)] for _ in range(n)]
13+
for i in range(n):
14+
for j in range(m):
15+
e_n = 0
16+
o_n = 0
17+
for di,dj in nb:
18+
ni, nj = i + di, j + dj
19+
if ni in range(n) and nj in range(m):
20+
if g[ni][nj] == "L":
21+
e_n += 1
22+
elif g[ni][nj] == "#":
23+
o_n += 1
24+
if g[i][j] == "L":
25+
if o_n == 0:
26+
ng[i][j] = "#"
27+
else:
28+
ng[i][j] = "L"
29+
elif g[i][j] == "#":
30+
if o_n >= 4:
31+
ng[i][j] = "L"
32+
else:
33+
ng[i][j] = "#"
34+
else:
35+
ng[i][j] = g[i][j]
36+
return ng
37+
38+
ts = lambda gg : "\n".join("".join(v for v in r) for r in gg)
39+
40+
import cv2
41+
import numpy as np
42+
im = np.zeros((n*8, m*8, 3), dtype=np.uint8)
43+
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
44+
clip_writer = cv2.VideoWriter("vis.mp4", fourcc, 24, (m*8, n*8))
45+
46+
def update_im(im, g):
47+
for i in range(n):
48+
for j in range(m):
49+
if g[i][j] == "#":
50+
color = (0,0,0)
51+
elif g[i][j] == "L":
52+
color = (70,70,70)
53+
else:
54+
color = (200,200,200)
55+
im[8*i:8*(i+1),8*j:8*(j+1),:] = color
56+
57+
ct = 0
58+
cg = g
59+
60+
update_im(im, cg)
61+
clip_writer.write(im)
62+
63+
while ts(cg) != ts((ng := apply(cg))):
64+
cg = ng
65+
ct += 1
66+
update_im(im, cg)
67+
clip_writer.write(im)
68+
69+
for _ in range(20):
70+
clip_writer.write(im)
71+
72+
73+
74+
75+
ct = 0
76+
cg = g
77+
78+
update_im(im, cg)
79+
clip_writer.write(im)
80+
81+
while ts(cg) != ts((ng := apply(cg))):
82+
cg = ng
83+
ct += 1
84+
update_im(im, cg)
85+
clip_writer.write(im)
86+
clip_writer.write(im)
87+
clip_writer.write(im)
88+
clip_writer.write(im)
89+
90+
for _ in range(20):
91+
clip_writer.write(im)
92+
clip_writer.release()
93+
94+
95+
print("done!")
96+
97+
print(sum(1 for i in range(n) for j in range(m) if cg[i][j] == "#"))
98+
99+
100+
adj = {}
101+
for i in range(n):
102+
for j in range(m):
103+
adj[i,j] = []
104+
for di,dj in nb:
105+
ni, nj = i + di, j + dj
106+
while ni in range(n) and nj in range(m) and g[ni][nj] == ".":
107+
ni += di
108+
nj += dj
109+
if ni in range(n) and nj in range(m):
110+
adj[i,j].append((ni,nj))
111+
112+
113+
def apply(g):
114+
ng = [[-1 for _ in range(m)] for _ in range(n)]
115+
for i in range(n):
116+
for j in range(m):
117+
e_n = 0
118+
o_n = 0
119+
for ni,nj in adj[i,j]:
120+
if ni in range(n) and nj in range(m):
121+
if g[ni][nj] == "L":
122+
e_n += 1
123+
elif g[ni][nj] == "#":
124+
o_n += 1
125+
if g[i][j] == "L":
126+
if o_n == 0:
127+
ng[i][j] = "#"
128+
else:
129+
ng[i][j] = "L"
130+
elif g[i][j] == "#":
131+
if o_n >= 5:
132+
ng[i][j] = "L"
133+
else:
134+
ng[i][j] = "#"
135+
else:
136+
ng[i][j] = g[i][j]
137+
return ng
138+
139+
cg = g
140+
while ts(cg) != ts((ng := apply(cg))):
141+
cg = ng
142+
143+
print(sum(1 for i in range(n) for j in range(m) if cg[i][j] == "#"))

0 commit comments

Comments
 (0)
0