Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 773fc93

Browse files
committed
day 11
1 parent 4011a56 commit 773fc93

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
|[08](https://adventofcode.com/2020/day/8)|Handheld Halting|[py](/day08/main.py)|
1313
|[09](https://adventofcode.com/2020/day/9)|Encoding Error|[py](/day09/main.py)|
1414
|[10](https://adventofcode.com/2020/day/10)|Adapter Array|[py](/day10/main.py), [alt](/day10/alt.py)|
15-
|[11](https://adventofcode.com/2020/day/11)|-|-|
15+
|[11](https://adventofcode.com/2020/day/11)|Seating System|[py](/day11/main.py)|
1616
|[12](https://adventofcode.com/2020/day/12)|-|-|
1717
|[13](https://adventofcode.com/2020/day/13)|-|-|
1818
|[14](https://adventofcode.com/2020/day/14)|-|-|

‎day11/main.py‎

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from itertools import product, cycle
2+
3+
import numpy as np
4+
from scipy.ndimage import convolve
5+
6+
def check(grid, cols, rows):
7+
for c, r in zip(cols, rows):
8+
k = grid[c, r]
9+
if k in (1,2):
10+
return k-1
11+
return 0
12+
13+
def get_neightbors(grid, orig_grid, is_part1):
14+
if is_part1:
15+
kernel = np.ones((3,3), dtype=np.int8)
16+
kernel[1,1] = 0
17+
empty = convolve(orig_grid, kernel, mode="constant", cval=0)
18+
return convolve(grid, kernel, mode="constant", cval=0) - empty
19+
else:
20+
res = np.zeros_like(grid)
21+
col, row = grid.shape
22+
for r, c in product(range(row), range(col)):
23+
if grid[c,r] == 0:
24+
continue
25+
else:
26+
n = check(grid, cycle([c]), reversed(range(r))) # left
27+
n += check(grid, cycle([c]), range(r+1, row)) # right
28+
n += check(grid, reversed(range(c)), cycle([r])) # up
29+
n += check(grid, range(c+1, col), cycle([r])) # down
30+
31+
n += check(grid, reversed(range(c)), reversed(range(r))) # diag left up
32+
n += check(grid, range(c+1, col), reversed(range(r))) # diag left down
33+
n += check(grid, reversed(range(c)), range(r+1, row)) # diag right up
34+
n += check(grid, range(c+1, col), range(r+1, row)) # diag right down
35+
36+
res[c,r] = n
37+
38+
return res
39+
40+
with open("input.txt") as f:
41+
rows = []
42+
for x in f:
43+
rows.append([c == "L" for c in x.strip()])
44+
45+
for is_part1 in [True, False]:
46+
47+
if is_part1:
48+
cutoff = 4
49+
else:
50+
cutoff = 5
51+
52+
grid = np.array(rows).astype(np.int8)
53+
seats = grid.copy()
54+
occ = (grid == 2).sum()
55+
56+
while True:
57+
prev_occ = occ
58+
n = get_neightbors(grid, seats, is_part1)
59+
u = (n == 0).astype(int) - (n >= cutoff).astype(int)
60+
u[grid == 0] = 0
61+
grid = np.clip(grid + u, 0, 2)
62+
grid[grid == 0] = seats[grid == 0]
63+
occ = (grid == 2).sum()
64+
if occ == prev_occ:
65+
break
66+
67+
print(occ)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /