60 lines
1.3 KiB
Python
60 lines
1.3 KiB
Python
from lib import get_data, Grid2D
|
|
from collections import defaultdict
|
|
|
|
|
|
data = """.......S.......
|
|
...............
|
|
.......^.......
|
|
...............
|
|
......^.^......
|
|
...............
|
|
.....^.^.^.....
|
|
...............
|
|
....^.^...^....
|
|
...............
|
|
...^.^...^.^...
|
|
...............
|
|
..^...^.....^..
|
|
...............
|
|
.^.^.^.^.^...^.
|
|
..............."""
|
|
data = get_data(__file__)
|
|
|
|
g = Grid2D(data)
|
|
beams = [g.find('S')[0][1]]
|
|
|
|
splits = 0
|
|
for row in range(1, g.n_rows - 1):
|
|
new_beams = set()
|
|
for beam in beams:
|
|
field = g[(row, beam)]
|
|
if field == "^":
|
|
splits += 1
|
|
new_beams.add(beam - 1)
|
|
new_beams.add(beam + 1)
|
|
elif field == ".":
|
|
new_beams.add(beam)
|
|
else:
|
|
assert False, "unexpected field"
|
|
beams = list(new_beams)
|
|
# print(beams)
|
|
|
|
print(splits)
|
|
|
|
beams = {g.find('S')[0][1]: 1}
|
|
for row in range(1, g.n_rows - 1):
|
|
new_beams = defaultdict(int)
|
|
for beam, count in beams.items():
|
|
field = g[(row, beam)]
|
|
if field == "^":
|
|
new_beams[beam - 1] += count
|
|
new_beams[beam + 1] += count
|
|
elif field == ".":
|
|
new_beams[beam] += count
|
|
else:
|
|
assert False, "unexpected field"
|
|
beams = new_beams
|
|
|
|
print(sum(beams.values()))
|
|
|