2025(07): inspired by Marit, a new, better function
This commit is contained in:
@ -52,10 +52,35 @@ def quantum_propagate(x, subdiagram):
|
|||||||
print("Reached end of world!")
|
print("Reached end of world!")
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
def sninkogate(diagram):
|
||||||
|
ylen = len(diagram)
|
||||||
|
|
||||||
|
# Find start location
|
||||||
|
y0 = 0
|
||||||
|
x0, = np.where(diagram[y0] == "S")[0]
|
||||||
|
|
||||||
|
# Save worlds per column
|
||||||
|
I = np.zeros_like(diagram, dtype=int)
|
||||||
|
|
||||||
|
# Emit starting beam
|
||||||
|
I[y0 + 1, x0] = 1
|
||||||
|
|
||||||
|
for y in range(2, ylen):
|
||||||
|
for x in np.where((diagram[y] == "^")&(I[y - 1] > 0))[0]:
|
||||||
|
# NOTE: I do not ever check whether carets are on the boundary.
|
||||||
|
I[y, (x - 1, x + 1)] += I[y - 1, x]
|
||||||
|
for x in np.where((diagram[y] == ".")&(I[y - 1] > 0))[0]:
|
||||||
|
I[y, x] += I[y - 1, x]
|
||||||
|
if debug:
|
||||||
|
print_diagram(diagram)
|
||||||
|
print()
|
||||||
|
return I[-1].sum()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
test_diagram = load_diagram("testinput")
|
test_diagram = load_diagram("testinput")
|
||||||
|
|
||||||
assert quantum_propagate_diagram(test_diagram) == 40
|
assert quantum_propagate_diagram(test_diagram) == 40
|
||||||
|
|
||||||
diagram = load_diagram("input")
|
diagram = load_diagram("input")
|
||||||
print(quantum_propagate_diagram(diagram))
|
print(sninkogate(diagram))
|
||||||
|
|||||||
Reference in New Issue
Block a user