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()))