From ed2e4f1403eff3c48df2576b46d2116f64f3fcfa Mon Sep 17 00:00:00 2001 From: Lachlan Meyer Date: Fri, 20 Dec 2024 20:01:15 +1100 Subject: [PATCH] 20-2 - slow - might need numpy for better performance --- 2024/20/20-2.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 2024/20/20-2.py diff --git a/2024/20/20-2.py b/2024/20/20-2.py new file mode 100644 index 0000000..f9f8324 --- /dev/null +++ b/2024/20/20-2.py @@ -0,0 +1,64 @@ +import networkx as nx + +map = set() +directions = [(1, 0), (0, 1), (-1, 0), (0, -1)] + +testing = False + +minimumStepsSaved = 50 if testing else 100 +picosecondsCheatable = 20 +totalGoodCheats = 0 + +filename = 'testinput' if testing else 'input' + +with open(f'2024/20/{filename}.txt') as f: + g = nx.DiGraph() + for j, line in enumerate(f): + line = line.strip() + for i, char in enumerate(line): + if char == '#': + continue + if char == 'E': + e = (i, j) + if char == 'S': + s = (i, j) # reindeer starts pointing west + + map.add((i,j)) + +for node in map: + x, y = node + for direction in directions: + dirX, dirY = direction + neighbour = (x + dirX, y + dirY) + + if neighbour in map: + g.add_edge(node, neighbour, weight=1) + + +shortestPath = nx.shortest_path(g, s, e, weight='weight') + + +def getCheatEndpoints(coords): + i, j = coords + output = set() + for distanceX in range(-picosecondsCheatable, picosecondsCheatable + 1): + distanceYMax = picosecondsCheatable - abs(distanceX) + for distanceY in range(-distanceYMax, distanceYMax + 1): + if (i + distanceX, j + distanceY) in shortestPath: + output.add((i + distanceX, j + distanceY)) + return output + +for i, node in enumerate(shortestPath): + potentialCheatNodes = getCheatEndpoints(node) + for potentialCheat in potentialCheatNodes: + j = shortestPath.index(potentialCheat) + + manhattanDistance = abs(node[0] - potentialCheat[0]) + abs(node[1] - potentialCheat[1]) + + stepsSaved = j - i - manhattanDistance + if stepsSaved < minimumStepsSaved: + continue + + totalGoodCheats += 1 + +print(totalGoodCheats) \ No newline at end of file