Solve day 16.
This commit is contained in:
parent
d41e4737cb
commit
87e2568b12
@ -12,3 +12,4 @@
|
|||||||
- Day 10: 180:00; this one was hard for me.
|
- Day 10: 180:00; this one was hard for me.
|
||||||
- Day 11: 68:00; okay but not elegant and way too slow ofc; x-ray solution would have been neat
|
- Day 11: 68:00; okay but not elegant and way too slow ofc; x-ray solution would have been neat
|
||||||
- Day 12: 52:00 and 22:00 for leaderboard; had the right idea and I am good at this type of problem
|
- Day 12: 52:00 and 22:00 for leaderboard; had the right idea and I am good at this type of problem
|
||||||
|
- Day 16: 00:27:30 745; best placement so far, of course still horribly slow
|
||||||
|
109
d16.py
Normal file
109
d16.py
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
import lib
|
||||||
|
|
||||||
|
EXAMPLE = r"""
|
||||||
|
.|...\....
|
||||||
|
|.-.\.....
|
||||||
|
.....|-...
|
||||||
|
........|.
|
||||||
|
..........
|
||||||
|
.........\
|
||||||
|
..../.\\..
|
||||||
|
.-.-/..|..
|
||||||
|
.|....-|.\
|
||||||
|
..//.|....
|
||||||
|
"""
|
||||||
|
|
||||||
|
NEW = {
|
||||||
|
'.': {
|
||||||
|
'w': (0, -1, 'w'),
|
||||||
|
'e': (0, 1, 'e'),
|
||||||
|
's': (1, 0, 's'),
|
||||||
|
'n': (-1, 0, 'n'),
|
||||||
|
},
|
||||||
|
'|': {
|
||||||
|
'w': [(1, 0, 's'), (-1, 0, 'n')],
|
||||||
|
'e': [(1, 0, 's'), (-1, 0, 'n')],
|
||||||
|
's': (1, 0, 's'),
|
||||||
|
'n': (-1, 0, 'n'),
|
||||||
|
},
|
||||||
|
'-': {
|
||||||
|
's': [(0, -1, 'w'), (0, 1, 'e')],
|
||||||
|
'n': [(0, -1, 'w'), (0, 1, 'e')],
|
||||||
|
'e': (0, 1, 'e'),
|
||||||
|
'w': (0, -1, 'w'),
|
||||||
|
},
|
||||||
|
'/': {
|
||||||
|
's': (0, -1, 'w'),
|
||||||
|
'n': (0, 1, 'e'),
|
||||||
|
'e': (-1, 0, 'n'),
|
||||||
|
'w': (1, 0, 's'),
|
||||||
|
},
|
||||||
|
'\\': {
|
||||||
|
's': (0, 1, 'e'),
|
||||||
|
'n': (0, -1, 'w'),
|
||||||
|
'e': (1, 0, 's'),
|
||||||
|
'w': (-1, 0, 'n'),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
def solve(lines: list[str], second=False):
|
||||||
|
res = 0
|
||||||
|
|
||||||
|
g = list(map(list, lines))
|
||||||
|
|
||||||
|
rows = len(g)
|
||||||
|
cols = len(g[0])
|
||||||
|
|
||||||
|
if not second:
|
||||||
|
starts = [(0, 0, 'e')]
|
||||||
|
else:
|
||||||
|
starts = [(r, 0, 'e') for r in range(rows)]
|
||||||
|
starts += [(r, cols - 1, 'w') for r in range(rows)]
|
||||||
|
starts += [(0, c, 's') for c in range(cols)]
|
||||||
|
starts += [(rows - 1, c, 'n') for c in range(cols)]
|
||||||
|
|
||||||
|
for start in starts:
|
||||||
|
visited = set()
|
||||||
|
beams = [start]
|
||||||
|
while beams:
|
||||||
|
b = beams.pop()
|
||||||
|
row, col, d = b
|
||||||
|
visited.add((row, col, d))
|
||||||
|
|
||||||
|
f = g[row][col]
|
||||||
|
new = NEW[f][d]
|
||||||
|
if isinstance(new, tuple):
|
||||||
|
r, c, nd = new
|
||||||
|
nr = row + r
|
||||||
|
nc = col + c
|
||||||
|
if nr >= 0 and nc >= 0 and nr < rows and nc < cols:
|
||||||
|
if not (nr, nc, nd) in visited:
|
||||||
|
beams.append((nr, nc, nd))
|
||||||
|
else:
|
||||||
|
for r, c, nd in new:
|
||||||
|
nr = row + r
|
||||||
|
nc = col + c
|
||||||
|
if nr >= 0 and nc >= 0 and nr < rows and nc < cols:
|
||||||
|
if not (nr, nc, nd) in visited:
|
||||||
|
beams.append((nr, nc, nd))
|
||||||
|
|
||||||
|
v = set([(r, c) for (r, c, _) in list(visited)])
|
||||||
|
res = max(res, len(v))
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
lines = lib.str_to_lines_no_empty(EXAMPLE)
|
||||||
|
print("Example 1:", solve(lines))
|
||||||
|
|
||||||
|
lines = lib.str_to_lines_no_empty(open("i16.txt").read())
|
||||||
|
print("Solution 1:", solve(lines))
|
||||||
|
|
||||||
|
lines = lib.str_to_lines_no_empty(EXAMPLE)
|
||||||
|
print("Example 2:", solve(lines, True))
|
||||||
|
|
||||||
|
lines = lib.str_to_lines_no_empty(open("i16.txt").read())
|
||||||
|
print("Solution 2:", solve(lines, True))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Reference in New Issue
Block a user