2025 07
This commit is contained in:
parent
4d49abf0ac
commit
4c82196926
1 changed files with 57 additions and 0 deletions
57
Python/2025/07/main.py
Normal file
57
Python/2025/07/main.py
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
import bisect
|
||||||
|
input = open("input", 'r')
|
||||||
|
|
||||||
|
splitters = None
|
||||||
|
start = None
|
||||||
|
for row, line in enumerate(input):
|
||||||
|
if splitters == None:
|
||||||
|
splitters = [[] for _ in range(len(line))]
|
||||||
|
for col, char in enumerate(line):
|
||||||
|
if char == "S":
|
||||||
|
start = (row, col)
|
||||||
|
elif char == "^":
|
||||||
|
splitters[col].append(row)
|
||||||
|
|
||||||
|
def beam_to_splitter(splitters, beam):
|
||||||
|
beam_row, beam_col = beam
|
||||||
|
splitters_in_col = splitters[beam_col]
|
||||||
|
next_splitter = bisect.bisect_right(splitters_in_col, beam_row)
|
||||||
|
if next_splitter == len(splitters_in_col):
|
||||||
|
return None
|
||||||
|
return (splitters_in_col[next_splitter], beam_col)
|
||||||
|
|
||||||
|
def part1(splitters, start):
|
||||||
|
used_splitters = set()
|
||||||
|
unresolved_splitters = [beam_to_splitter(splitters,start)]
|
||||||
|
while unresolved_splitters:
|
||||||
|
splitter = unresolved_splitters.pop()
|
||||||
|
used_splitters.add(splitter)
|
||||||
|
|
||||||
|
splitter_row, splitter_col = splitter
|
||||||
|
for offset in [-1, 1]:
|
||||||
|
new_beam = (splitter_row, splitter_col+offset)
|
||||||
|
next_splitter = beam_to_splitter(splitters, new_beam)
|
||||||
|
if not next_splitter or next_splitter in used_splitters:
|
||||||
|
continue
|
||||||
|
unresolved_splitters.append(next_splitter)
|
||||||
|
|
||||||
|
return len(used_splitters)
|
||||||
|
|
||||||
|
def part2(splitters, start):
|
||||||
|
splitter_multiverses = {}
|
||||||
|
def multiverse_count(splitters, splitter):
|
||||||
|
if splitter == None:
|
||||||
|
return 1
|
||||||
|
if splitter not in splitter_multiverses:
|
||||||
|
splitter_multiverses[splitter] = 0
|
||||||
|
splitter_row, splitter_col = splitter
|
||||||
|
for offset in [-1, 1]:
|
||||||
|
new_beam = (splitter_row, splitter_col+offset)
|
||||||
|
next_splitter = beam_to_splitter(splitters, new_beam)
|
||||||
|
splitter_multiverses[splitter] += multiverse_count(splitters, next_splitter)
|
||||||
|
return splitter_multiverses[splitter]
|
||||||
|
|
||||||
|
return multiverse_count(splitters, start)
|
||||||
|
|
||||||
|
print(part1(splitters, start))
|
||||||
|
print(part2(splitters, start))
|
||||||
Loading…
Add table
Add a link
Reference in a new issue