From f648a40dd67a1d42079460a68b919f9b05bfbd61 Mon Sep 17 00:00:00 2001 From: Kees van Kempen Date: Mon, 8 Dec 2025 08:06:25 +0100 Subject: [PATCH] 2025(07): inspired by Marit, a new, better function --- 2025/07/part2.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/2025/07/part2.py b/2025/07/part2.py index f5d5ca5..ec85f23 100644 --- a/2025/07/part2.py +++ b/2025/07/part2.py @@ -52,10 +52,35 @@ def quantum_propagate(x, subdiagram): print("Reached end of world!") 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__": test_diagram = load_diagram("testinput") assert quantum_propagate_diagram(test_diagram) == 40 diagram = load_diagram("input") - print(quantum_propagate_diagram(diagram)) + print(sninkogate(diagram))