From 8e422c38c67416142f552cbb6a6c00935d7e85cd Mon Sep 17 00:00:00 2001 From: tobias Date: Fri, 20 Dec 2024 08:30:31 +0100 Subject: [PATCH] Add 16 --- 16/16.ipynb | 949 +++++++++++++++++++++++++++++++++++++++++++++++++++ 16/input | 141 ++++++++ 16/testinput | 15 + 3 files changed, 1105 insertions(+) create mode 100644 16/16.ipynb create mode 100644 16/input create mode 100644 16/testinput diff --git a/16/16.ipynb b/16/16.ipynb new file mode 100644 index 0000000..2623fb5 --- /dev/null +++ b/16/16.ipynb @@ -0,0 +1,949 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "([(1, 13),\n", + " (1, 12),\n", + " (1, 11),\n", + " (2, 11),\n", + " (3, 11),\n", + " (4, 11),\n", + " (5, 11),\n", + " (5, 10),\n", + " (5, 9),\n", + " (5, 8),\n", + " (5, 7),\n", + " (6, 7),\n", + " (7, 7),\n", + " (8, 7),\n", + " (9, 7),\n", + " (9, 6),\n", + " (9, 5),\n", + " (10, 5),\n", + " (11, 5),\n", + " (11, 4),\n", + " (11, 3),\n", + " (10, 3),\n", + " (9, 3),\n", + " (9, 2),\n", + " (9, 1),\n", + " (10, 1),\n", + " (11, 1),\n", + " (12, 1),\n", + " (13, 1)],\n", + " 28)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Rechecking the imports and retrying the execution\n", + "\n", + "# Importing NetworkX again to ensure proper initialization\n", + "import networkx as nx\n", + "\n", + "# Retry defining and executing the code\n", + "with open('testinput','r') as infile:\n", + " ascii_map = infile.read()\n", + "\n", + "def parse_ascii_map(ascii_map):\n", + " graph = nx.DiGraph() # Directed graph for flexibility with edge weights\n", + " rows = ascii_map.strip().split(\"\\n\")\n", + " height, width = len(rows), len(rows[0])\n", + " directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # Up, Down, Left, Right\n", + "\n", + " start, end = None, None\n", + " for y, row in enumerate(rows):\n", + " for x, char in enumerate(row):\n", + " if char != '#': # Not a wall\n", + " graph.add_node((x, y))\n", + " if char == 'S':\n", + " start = (x, y)\n", + " elif char == 'E':\n", + " end = (x, y)\n", + "\n", + " # Add edges for neighbors\n", + " for dx, dy in directions:\n", + " nx_new, ny_new = x + dx, y + dy\n", + " if 0 <= nx_new < width and 0 <= ny_new < height and rows[ny_new][nx_new] != '#':\n", + " graph.add_edge((x, y), (nx_new, ny_new), weight=1)\n", + " return graph, start, end\n", + "\n", + "def find_shortest_path(graph, start, end):\n", + " try:\n", + " path = nx.shortest_path(graph, source=start, target=end, weight='weight')\n", + " cost = nx.shortest_path_length(graph, source=start, target=end, weight='weight')\n", + " return path, cost\n", + " except nx.NetworkXNoPath:\n", + " return None, float('inf')\n", + "\n", + "# Parse and solve\n", + "graph, start, end = parse_ascii_map(ascii_map)\n", + "path, cost = find_shortest_path(graph, start, end)\n", + "\n", + "path, cost\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "([(1, 139, 'E'),\n", + " (2, 139, 'E'),\n", + " (3, 139, 'E'),\n", + " (3, 139, 'N'),\n", + " (3, 138, 'N'),\n", + " (3, 137, 'N'),\n", + " (3, 137, 'E'),\n", + " (4, 137, 'E'),\n", + " (5, 137, 'E'),\n", + " (5, 137, 'S'),\n", + " (5, 138, 'S'),\n", + " (5, 139, 'S'),\n", + " (5, 139, 'E'),\n", + " (6, 139, 'E'),\n", + " (7, 139, 'E'),\n", + " (7, 139, 'N'),\n", + " (7, 138, 'N'),\n", + " (7, 137, 'N'),\n", + " (7, 137, 'E'),\n", + " (8, 137, 'E'),\n", + " (9, 137, 'E'),\n", + " (10, 137, 'E'),\n", + " (11, 137, 'E'),\n", + " (11, 137, 'S'),\n", + " (11, 138, 'S'),\n", + " (11, 139, 'S'),\n", + " (11, 139, 'E'),\n", + " (12, 139, 'E'),\n", + " (13, 139, 'E'),\n", + " (13, 139, 'N'),\n", + " (13, 138, 'N'),\n", + " (13, 137, 'N'),\n", + " (13, 137, 'E'),\n", + " (14, 137, 'E'),\n", + " (15, 137, 'E'),\n", + " (15, 137, 'S'),\n", + " (15, 138, 'S'),\n", + " (15, 139, 'S'),\n", + " (15, 139, 'E'),\n", + " (16, 139, 'E'),\n", + " (17, 139, 'E'),\n", + " (17, 139, 'N'),\n", + " (17, 138, 'N'),\n", + " (17, 137, 'N'),\n", + " (17, 136, 'N'),\n", + " (17, 135, 'N'),\n", + " (17, 134, 'N'),\n", + " (17, 133, 'N'),\n", + " (17, 133, 'E'),\n", + " (18, 133, 'E'),\n", + " (19, 133, 'E'),\n", + " (20, 133, 'E'),\n", + " (21, 133, 'E'),\n", + " (22, 133, 'E'),\n", + " (23, 133, 'E'),\n", + " (24, 133, 'E'),\n", + " (25, 133, 'E'),\n", + " (26, 133, 'E'),\n", + " (27, 133, 'E'),\n", + " (28, 133, 'E'),\n", + " (29, 133, 'E'),\n", + " (30, 133, 'E'),\n", + " (31, 133, 'E'),\n", + " (32, 133, 'E'),\n", + " (33, 133, 'E'),\n", + " (34, 133, 'E'),\n", + " (35, 133, 'E'),\n", + " (35, 133, 'S'),\n", + " (35, 134, 'S'),\n", + " (35, 135, 'S'),\n", + " (35, 136, 'S'),\n", + " (35, 137, 'S'),\n", + " (35, 138, 'S'),\n", + " (35, 139, 'S'),\n", + " (35, 139, 'E'),\n", + " (36, 139, 'E'),\n", + " (37, 139, 'E'),\n", + " (37, 139, 'N'),\n", + " (37, 138, 'N'),\n", + " (37, 137, 'N'),\n", + " (37, 137, 'E'),\n", + " (38, 137, 'E'),\n", + " (39, 137, 'E'),\n", + " (39, 137, 'N'),\n", + " (39, 136, 'N'),\n", + " (39, 135, 'N'),\n", + " (39, 134, 'N'),\n", + " (39, 133, 'N'),\n", + " (39, 133, 'E'),\n", + " (40, 133, 'E'),\n", + " (41, 133, 'E'),\n", + " (41, 133, 'S'),\n", + " (41, 134, 'S'),\n", + " (41, 135, 'S'),\n", + " (41, 136, 'S'),\n", + " (41, 137, 'S'),\n", + " (41, 138, 'S'),\n", + " (41, 139, 'S'),\n", + " (41, 139, 'E'),\n", + " (42, 139, 'E'),\n", + " (43, 139, 'E'),\n", + " (44, 139, 'E'),\n", + " (45, 139, 'E'),\n", + " (45, 139, 'N'),\n", + " (45, 138, 'N'),\n", + " (45, 137, 'N'),\n", + " (45, 137, 'E'),\n", + " (46, 137, 'E'),\n", + " (47, 137, 'E'),\n", + " (48, 137, 'E'),\n", + " (49, 137, 'E'),\n", + " (49, 137, 'N'),\n", + " (49, 136, 'N'),\n", + " (49, 135, 'N'),\n", + " (49, 134, 'N'),\n", + " (49, 133, 'N'),\n", + " (49, 133, 'E'),\n", + " (50, 133, 'E'),\n", + " (51, 133, 'E'),\n", + " (52, 133, 'E'),\n", + " (53, 133, 'E'),\n", + " (53, 133, 'S'),\n", + " (53, 134, 'S'),\n", + " (53, 135, 'S'),\n", + " (53, 136, 'S'),\n", + " (53, 137, 'S'),\n", + " (53, 138, 'S'),\n", + " (53, 139, 'S'),\n", + " (53, 139, 'E'),\n", + " (54, 139, 'E'),\n", + " (55, 139, 'E'),\n", + " (56, 139, 'E'),\n", + " (57, 139, 'E'),\n", + " (57, 139, 'N'),\n", + " (57, 138, 'N'),\n", + " (57, 137, 'N'),\n", + " (57, 136, 'N'),\n", + " (57, 135, 'N'),\n", + " (57, 135, 'E'),\n", + " (58, 135, 'E'),\n", + " (59, 135, 'E'),\n", + " (60, 135, 'E'),\n", + " (61, 135, 'E'),\n", + " (61, 135, 'S'),\n", + " (61, 136, 'S'),\n", + " (61, 137, 'S'),\n", + " (61, 137, 'W'),\n", + " (60, 137, 'W'),\n", + " (59, 137, 'W'),\n", + " (59, 137, 'S'),\n", + " (59, 138, 'S'),\n", + " (59, 139, 'S'),\n", + " (59, 139, 'E'),\n", + " (60, 139, 'E'),\n", + " (61, 139, 'E'),\n", + " (62, 139, 'E'),\n", + " (63, 139, 'E'),\n", + " (64, 139, 'E'),\n", + " (65, 139, 'E'),\n", + " (66, 139, 'E'),\n", + " (67, 139, 'E'),\n", + " (68, 139, 'E'),\n", + " (69, 139, 'E'),\n", + " (69, 139, 'N'),\n", + " (69, 138, 'N'),\n", + " (69, 137, 'N'),\n", + " (69, 137, 'E'),\n", + " (70, 137, 'E'),\n", + " (71, 137, 'E'),\n", + " (72, 137, 'E'),\n", + " (73, 137, 'E'),\n", + " (74, 137, 'E'),\n", + " (75, 137, 'E'),\n", + " (76, 137, 'E'),\n", + " (77, 137, 'E'),\n", + " (78, 137, 'E'),\n", + " (79, 137, 'E'),\n", + " (79, 137, 'S'),\n", + " (79, 138, 'S'),\n", + " (79, 139, 'S'),\n", + " (79, 139, 'E'),\n", + " (80, 139, 'E'),\n", + " (81, 139, 'E'),\n", + " (82, 139, 'E'),\n", + " (83, 139, 'E'),\n", + " (84, 139, 'E'),\n", + " (85, 139, 'E'),\n", + " (86, 139, 'E'),\n", + " (87, 139, 'E'),\n", + " (88, 139, 'E'),\n", + " (89, 139, 'E'),\n", + " (90, 139, 'E'),\n", + " (91, 139, 'E'),\n", + " (92, 139, 'E'),\n", + " (93, 139, 'E'),\n", + " (94, 139, 'E'),\n", + " (95, 139, 'E'),\n", + " (96, 139, 'E'),\n", + " (97, 139, 'E'),\n", + " (98, 139, 'E'),\n", + " (99, 139, 'E'),\n", + " (100, 139, 'E'),\n", + " (101, 139, 'E'),\n", + " (102, 139, 'E'),\n", + " (103, 139, 'E'),\n", + " (104, 139, 'E'),\n", + " (105, 139, 'E'),\n", + " (106, 139, 'E'),\n", + " (107, 139, 'E'),\n", + " (108, 139, 'E'),\n", + " (109, 139, 'E'),\n", + " (110, 139, 'E'),\n", + " (111, 139, 'E'),\n", + " (112, 139, 'E'),\n", + " (113, 139, 'E'),\n", + " (113, 139, 'N'),\n", + " (113, 138, 'N'),\n", + " (113, 137, 'N'),\n", + " (113, 136, 'N'),\n", + " (113, 135, 'N'),\n", + " (113, 134, 'N'),\n", + " (113, 133, 'N'),\n", + " (113, 132, 'N'),\n", + " (113, 131, 'N'),\n", + " (113, 130, 'N'),\n", + " (113, 129, 'N'),\n", + " (113, 128, 'N'),\n", + " (113, 127, 'N'),\n", + " (113, 126, 'N'),\n", + " (113, 125, 'N'),\n", + " (113, 124, 'N'),\n", + " (113, 123, 'N'),\n", + " (113, 123, 'E'),\n", + " (114, 123, 'E'),\n", + " (115, 123, 'E'),\n", + " (115, 123, 'N'),\n", + " (115, 122, 'N'),\n", + " (115, 121, 'N'),\n", + " (115, 121, 'E'),\n", + " (116, 121, 'E'),\n", + " (117, 121, 'E'),\n", + " (118, 121, 'E'),\n", + " (119, 121, 'E'),\n", + " (120, 121, 'E'),\n", + " (121, 121, 'E'),\n", + " (121, 121, 'N'),\n", + " (121, 120, 'N'),\n", + " (121, 119, 'N'),\n", + " (121, 119, 'E'),\n", + " (122, 119, 'E'),\n", + " (123, 119, 'E'),\n", + " (123, 119, 'N'),\n", + " (123, 118, 'N'),\n", + " (123, 117, 'N'),\n", + " (123, 116, 'N'),\n", + " (123, 115, 'N'),\n", + " (123, 115, 'W'),\n", + " (122, 115, 'W'),\n", + " (121, 115, 'W'),\n", + " (121, 115, 'N'),\n", + " (121, 114, 'N'),\n", + " (121, 113, 'N'),\n", + " (121, 112, 'N'),\n", + " (121, 111, 'N'),\n", + " (121, 110, 'N'),\n", + " (121, 109, 'N'),\n", + " (121, 108, 'N'),\n", + " (121, 107, 'N'),\n", + " (121, 107, 'W'),\n", + " (120, 107, 'W'),\n", + " (119, 107, 'W'),\n", + " (119, 107, 'N'),\n", + " (119, 106, 'N'),\n", + " (119, 105, 'N'),\n", + " (119, 104, 'N'),\n", + " (119, 103, 'N'),\n", + " (119, 103, 'W'),\n", + " (118, 103, 'W'),\n", + " (117, 103, 'W'),\n", + " (117, 103, 'S'),\n", + " (117, 104, 'S'),\n", + " (117, 105, 'S'),\n", + " (117, 105, 'W'),\n", + " (116, 105, 'W'),\n", + " (115, 105, 'W'),\n", + " (115, 105, 'N'),\n", + " (115, 104, 'N'),\n", + " (115, 103, 'N'),\n", + " (115, 102, 'N'),\n", + " (115, 101, 'N'),\n", + " (115, 100, 'N'),\n", + " (115, 99, 'N'),\n", + " (115, 99, 'W'),\n", + " (114, 99, 'W'),\n", + " (113, 99, 'W'),\n", + " (113, 99, 'N'),\n", + " (113, 98, 'N'),\n", + " (113, 97, 'N'),\n", + " (113, 97, 'W'),\n", + " (112, 97, 'W'),\n", + " (111, 97, 'W'),\n", + " (111, 97, 'N'),\n", + " (111, 96, 'N'),\n", + " (111, 95, 'N'),\n", + " (111, 95, 'E'),\n", + " (112, 95, 'E'),\n", + " (113, 95, 'E'),\n", + " (113, 95, 'N'),\n", + " (113, 94, 'N'),\n", + " (113, 93, 'N'),\n", + " (113, 92, 'N'),\n", + " (113, 91, 'N'),\n", + " (113, 90, 'N'),\n", + " (113, 89, 'N'),\n", + " (113, 89, 'E'),\n", + " (114, 89, 'E'),\n", + " (115, 89, 'E'),\n", + " (116, 89, 'E'),\n", + " (117, 89, 'E'),\n", + " (117, 89, 'S'),\n", + " (117, 90, 'S'),\n", + " (117, 91, 'S'),\n", + " (117, 91, 'E'),\n", + " (118, 91, 'E'),\n", + " (119, 91, 'E'),\n", + " (119, 91, 'N'),\n", + " (119, 90, 'N'),\n", + " (119, 89, 'N'),\n", + " (119, 89, 'E'),\n", + " (120, 89, 'E'),\n", + " (121, 89, 'E'),\n", + " (122, 89, 'E'),\n", + " (123, 89, 'E'),\n", + " (123, 89, 'N'),\n", + " (123, 88, 'N'),\n", + " (123, 87, 'N'),\n", + " (123, 86, 'N'),\n", + " (123, 85, 'N'),\n", + " (123, 84, 'N'),\n", + " (123, 83, 'N'),\n", + " (123, 82, 'N'),\n", + " (123, 81, 'N'),\n", + " (123, 81, 'E'),\n", + " (124, 81, 'E'),\n", + " (125, 81, 'E'),\n", + " (125, 81, 'S'),\n", + " (125, 82, 'S'),\n", + " (125, 83, 'S'),\n", + " (125, 83, 'E'),\n", + " (126, 83, 'E'),\n", + " (127, 83, 'E'),\n", + " (127, 83, 'N'),\n", + " (127, 82, 'N'),\n", + " (127, 81, 'N'),\n", + " (127, 80, 'N'),\n", + " (127, 79, 'N'),\n", + " (127, 79, 'E'),\n", + " (128, 79, 'E'),\n", + " (129, 79, 'E'),\n", + " (129, 79, 'N'),\n", + " (129, 78, 'N'),\n", + " (129, 77, 'N'),\n", + " (129, 77, 'W'),\n", + " (128, 77, 'W'),\n", + " (127, 77, 'W'),\n", + " (126, 77, 'W'),\n", + " (125, 77, 'W'),\n", + " (124, 77, 'W'),\n", + " (123, 77, 'W'),\n", + " (123, 77, 'S'),\n", + " (123, 78, 'S'),\n", + " (123, 79, 'S'),\n", + " (123, 79, 'W'),\n", + " (122, 79, 'W'),\n", + " (121, 79, 'W'),\n", + " (121, 79, 'N'),\n", + " (121, 78, 'N'),\n", + " (121, 77, 'N'),\n", + " (121, 76, 'N'),\n", + " (121, 75, 'N'),\n", + " (121, 75, 'E'),\n", + " (122, 75, 'E'),\n", + " (123, 75, 'E'),\n", + " (124, 75, 'E'),\n", + " (125, 75, 'E'),\n", + " (125, 75, 'N'),\n", + " (125, 74, 'N'),\n", + " (125, 73, 'N'),\n", + " (125, 73, 'W'),\n", + " (124, 73, 'W'),\n", + " (123, 73, 'W'),\n", + " (123, 73, 'N'),\n", + " (123, 72, 'N'),\n", + " (123, 71, 'N'),\n", + " (123, 71, 'E'),\n", + " (124, 71, 'E'),\n", + " (125, 71, 'E'),\n", + " (126, 71, 'E'),\n", + " (127, 71, 'E'),\n", + " (128, 71, 'E'),\n", + " (129, 71, 'E'),\n", + " (129, 71, 'N'),\n", + " (129, 70, 'N'),\n", + " (129, 69, 'N'),\n", + " (129, 69, 'E'),\n", + " (130, 69, 'E'),\n", + " (131, 69, 'E'),\n", + " (131, 69, 'S'),\n", + " (131, 70, 'S'),\n", + " (131, 71, 'S'),\n", + " (131, 72, 'S'),\n", + " (131, 73, 'S'),\n", + " (131, 74, 'S'),\n", + " (131, 75, 'S'),\n", + " (131, 75, 'E'),\n", + " (132, 75, 'E'),\n", + " (133, 75, 'E'),\n", + " (134, 75, 'E'),\n", + " (135, 75, 'E'),\n", + " (136, 75, 'E'),\n", + " (137, 75, 'E'),\n", + " (138, 75, 'E'),\n", + " (139, 75, 'E'),\n", + " (139, 75, 'N'),\n", + " (139, 74, 'N'),\n", + " (139, 73, 'N'),\n", + " (139, 73, 'W'),\n", + " (138, 73, 'W'),\n", + " (137, 73, 'W'),\n", + " (137, 73, 'N'),\n", + " (137, 72, 'N'),\n", + " (137, 71, 'N'),\n", + " (137, 71, 'W'),\n", + " (136, 71, 'W'),\n", + " (135, 71, 'W'),\n", + " (134, 71, 'W'),\n", + " (133, 71, 'W'),\n", + " (133, 71, 'N'),\n", + " (133, 70, 'N'),\n", + " (133, 69, 'N'),\n", + " (133, 68, 'N'),\n", + " (133, 67, 'N'),\n", + " (133, 67, 'W'),\n", + " (132, 67, 'W'),\n", + " (131, 67, 'W'),\n", + " (131, 67, 'N'),\n", + " (131, 66, 'N'),\n", + " (131, 65, 'N'),\n", + " (131, 65, 'E'),\n", + " (132, 65, 'E'),\n", + " (133, 65, 'E'),\n", + " (133, 65, 'N'),\n", + " (133, 64, 'N'),\n", + " (133, 63, 'N'),\n", + " (133, 63, 'W'),\n", + " (132, 63, 'W'),\n", + " (131, 63, 'W'),\n", + " (131, 63, 'N'),\n", + " (131, 62, 'N'),\n", + " (131, 61, 'N'),\n", + " (131, 61, 'W'),\n", + " (130, 61, 'W'),\n", + " (129, 61, 'W'),\n", + " (128, 61, 'W'),\n", + " (127, 61, 'W'),\n", + " (127, 61, 'S'),\n", + " (127, 62, 'S'),\n", + " (127, 63, 'S'),\n", + " (127, 64, 'S'),\n", + " (127, 65, 'S'),\n", + " (127, 65, 'E'),\n", + " (128, 65, 'E'),\n", + " (129, 65, 'E'),\n", + " (129, 65, 'S'),\n", + " (129, 66, 'S'),\n", + " (129, 67, 'S'),\n", + " (129, 67, 'W'),\n", + " (128, 67, 'W'),\n", + " (127, 67, 'W'),\n", + " (127, 67, 'S'),\n", + " (127, 68, 'S'),\n", + " (127, 69, 'S'),\n", + " (127, 69, 'W'),\n", + " (126, 69, 'W'),\n", + " (125, 69, 'W'),\n", + " (124, 69, 'W'),\n", + " (123, 69, 'W'),\n", + " (122, 69, 'W'),\n", + " (121, 69, 'W'),\n", + " (121, 69, 'N'),\n", + " (121, 68, 'N'),\n", + " (121, 67, 'N'),\n", + " (121, 66, 'N'),\n", + " (121, 65, 'N'),\n", + " (121, 64, 'N'),\n", + " (121, 63, 'N'),\n", + " (121, 63, 'W'),\n", + " (120, 63, 'W'),\n", + " (119, 63, 'W'),\n", + " (119, 63, 'N'),\n", + " (119, 62, 'N'),\n", + " (119, 61, 'N'),\n", + " (119, 61, 'E'),\n", + " (120, 61, 'E'),\n", + " (121, 61, 'E'),\n", + " (121, 61, 'N'),\n", + " (121, 60, 'N'),\n", + " (121, 59, 'N'),\n", + " (121, 58, 'N'),\n", + " (121, 57, 'N'),\n", + " (121, 56, 'N'),\n", + " (121, 55, 'N'),\n", + " (121, 54, 'N'),\n", + " (121, 53, 'N'),\n", + " (121, 53, 'W'),\n", + " (120, 53, 'W'),\n", + " (119, 53, 'W'),\n", + " (118, 53, 'W'),\n", + " (117, 53, 'W'),\n", + " (117, 53, 'N'),\n", + " (117, 52, 'N'),\n", + " (117, 51, 'N'),\n", + " (117, 51, 'E'),\n", + " (118, 51, 'E'),\n", + " (119, 51, 'E'),\n", + " (119, 51, 'N'),\n", + " (119, 50, 'N'),\n", + " (119, 49, 'N'),\n", + " (119, 49, 'W'),\n", + " (118, 49, 'W'),\n", + " (117, 49, 'W'),\n", + " (117, 49, 'N'),\n", + " (117, 48, 'N'),\n", + " (117, 47, 'N'),\n", + " (117, 47, 'E'),\n", + " (118, 47, 'E'),\n", + " (119, 47, 'E'),\n", + " (120, 47, 'E'),\n", + " (121, 47, 'E'),\n", + " (121, 47, 'N'),\n", + " (121, 46, 'N'),\n", + " (121, 45, 'N'),\n", + " (121, 44, 'N'),\n", + " (121, 43, 'N'),\n", + " (121, 42, 'N'),\n", + " (121, 41, 'N'),\n", + " (121, 40, 'N'),\n", + " (121, 39, 'N'),\n", + " (121, 38, 'N'),\n", + " (121, 37, 'N'),\n", + " (121, 37, 'E'),\n", + " (122, 37, 'E'),\n", + " (123, 37, 'E'),\n", + " (124, 37, 'E'),\n", + " (125, 37, 'E'),\n", + " (125, 37, 'N'),\n", + " (125, 36, 'N'),\n", + " (125, 35, 'N'),\n", + " (125, 35, 'E'),\n", + " (126, 35, 'E'),\n", + " (127, 35, 'E'),\n", + " (127, 35, 'N'),\n", + " (127, 34, 'N'),\n", + " (127, 33, 'N'),\n", + " (127, 33, 'E'),\n", + " (128, 33, 'E'),\n", + " (129, 33, 'E'),\n", + " (130, 33, 'E'),\n", + " (131, 33, 'E'),\n", + " (132, 33, 'E'),\n", + " (133, 33, 'E'),\n", + " (134, 33, 'E'),\n", + " (135, 33, 'E'),\n", + " (136, 33, 'E'),\n", + " (137, 33, 'E'),\n", + " (138, 33, 'E'),\n", + " (139, 33, 'E'),\n", + " (139, 33, 'N'),\n", + " (139, 32, 'N'),\n", + " (139, 31, 'N'),\n", + " (139, 31, 'W'),\n", + " (138, 31, 'W'),\n", + " (137, 31, 'W'),\n", + " (137, 31, 'N'),\n", + " (137, 30, 'N'),\n", + " (137, 29, 'N'),\n", + " (137, 28, 'N'),\n", + " (137, 27, 'N'),\n", + " (137, 27, 'E'),\n", + " (138, 27, 'E'),\n", + " (139, 27, 'E'),\n", + " (139, 27, 'N'),\n", + " (139, 26, 'N'),\n", + " (139, 25, 'N'),\n", + " (139, 24, 'N'),\n", + " (139, 23, 'N'),\n", + " (139, 22, 'N'),\n", + " (139, 21, 'N'),\n", + " (139, 21, 'W'),\n", + " (138, 21, 'W'),\n", + " (137, 21, 'W'),\n", + " (137, 21, 'S'),\n", + " (137, 22, 'S'),\n", + " (137, 23, 'S'),\n", + " (137, 24, 'S'),\n", + " (137, 25, 'S'),\n", + " (137, 25, 'W'),\n", + " (136, 25, 'W'),\n", + " (135, 25, 'W'),\n", + " (135, 25, 'N'),\n", + " (135, 24, 'N'),\n", + " (135, 23, 'N'),\n", + " (135, 22, 'N'),\n", + " (135, 21, 'N'),\n", + " (135, 20, 'N'),\n", + " (135, 19, 'N'),\n", + " (135, 19, 'E'),\n", + " (136, 19, 'E'),\n", + " (137, 19, 'E'),\n", + " (138, 19, 'E'),\n", + " (139, 19, 'E'),\n", + " (139, 19, 'N'),\n", + " (139, 18, 'N'),\n", + " (139, 17, 'N'),\n", + " (139, 16, 'N'),\n", + " (139, 15, 'N'),\n", + " (139, 14, 'N'),\n", + " (139, 13, 'N'),\n", + " (139, 12, 'N'),\n", + " (139, 11, 'N'),\n", + " (139, 10, 'N'),\n", + " (139, 9, 'N'),\n", + " (139, 8, 'N'),\n", + " (139, 7, 'N'),\n", + " (139, 7, 'W'),\n", + " (138, 7, 'W'),\n", + " (137, 7, 'W'),\n", + " (137, 7, 'N'),\n", + " (137, 6, 'N'),\n", + " (137, 5, 'N'),\n", + " (137, 5, 'E'),\n", + " (138, 5, 'E'),\n", + " (139, 5, 'E'),\n", + " (139, 5, 'N'),\n", + " (139, 4, 'N'),\n", + " (139, 3, 'N'),\n", + " (139, 2, 'N'),\n", + " (139, 1, 'N')],\n", + " 135512)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import networkx as nx\n", + "\n", + "# Define directions and corresponding movements\n", + "DIRECTIONS = ['N', 'E', 'S', 'W']\n", + "MOVEMENTS = {\n", + " 'N': (0, -1), # Move up\n", + " 'E': (1, 0), # Move right\n", + " 'S': (0, 1), # Move down\n", + " 'W': (-1, 0) # Move left\n", + "}\n", + "\n", + "# Parse the ASCII map into a graph with movement and turning costs\n", + "def parse_ascii_map_with_costs(ascii_map):\n", + " graph = nx.DiGraph() # Directed graph for handling edge weights\n", + " rows = ascii_map.strip().split(\"\\n\")\n", + " height, width = len(rows), len(rows[0])\n", + "\n", + " start, end = None, None\n", + " for y, row in enumerate(rows):\n", + " for x, char in enumerate(row):\n", + " if char != '#': # Walkable space\n", + " for direction in DIRECTIONS: # Add a node for each direction\n", + " graph.add_node((x, y, direction))\n", + " if char == 'S': # Starting point\n", + " start = (x, y, 'E') # Assume starting direction is North\n", + " elif char == 'E': # Ending point\n", + " end = (x, y)\n", + "\n", + " # Add edges for moving forward\n", + " for direction in DIRECTIONS:\n", + " dx, dy = MOVEMENTS[direction]\n", + " nx_new, ny_new = x + dx, y + dy\n", + " if 0 <= nx_new < width and 0 <= ny_new < height and rows[ny_new][nx_new] != '#':\n", + " graph.add_edge((x, y, direction), (nx_new, ny_new, direction), weight=1)\n", + "\n", + " # Add edges for turning (clockwise and counterclockwise)\n", + " for i, direction in enumerate(DIRECTIONS):\n", + " next_dir = DIRECTIONS[(i + 1) % 4] # Clockwise\n", + " prev_dir = DIRECTIONS[(i - 1) % 4] # Counterclockwise\n", + " graph.add_edge((x, y, direction), (x, y, next_dir), weight=1000)\n", + " graph.add_edge((x, y, direction), (x, y, prev_dir), weight=1000)\n", + " return graph, start, end\n", + "\n", + "# Find the shortest path with the new graph\n", + "def find_shortest_path_with_costs(graph, start, end):\n", + " try:\n", + " # Extract all possible end states (any direction at the endpoint)\n", + " end_nodes = [(end[0], end[1], d) for d in DIRECTIONS]\n", + " shortest_cost = float('inf')\n", + " best_path = None\n", + "\n", + " # Evaluate paths to all possible orientations at the endpoint\n", + " for end_node in end_nodes:\n", + " try:\n", + " path = nx.shortest_path(graph, source=start, target=end_node, weight='weight')\n", + " cost = nx.shortest_path_length(graph, source=start, target=end_node, weight='weight')\n", + " if cost < shortest_cost:\n", + " shortest_cost = cost\n", + " best_path = path\n", + " except nx.NetworkXNoPath:\n", + " continue\n", + " return best_path, shortest_cost\n", + " except nx.NetworkXNoPath:\n", + " return None, float('inf')\n", + "\n", + "# Example ASCII map\n", + "with open('input','r') as infile:\n", + " ascii_map = infile.read()\n", + "\n", + "# Parse the map and solve\n", + "graph, start, end = parse_ascii_map_with_costs(ascii_map)\n", + "path, cost = find_shortest_path_with_costs(graph, start, end)\n", + "\n", + "# Output the results\n", + "path, cost\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Minimum Cost to Reach the End: 135512\n" + ] + } + ], + "source": [ + "import heapq\n", + "\n", + "# Define directions and corresponding movements\n", + "DIRECTIONS = ['N', 'E', 'S', 'W']\n", + "MOVEMENTS = {\n", + " 'N': (0, -1), # Move up\n", + " 'E': (1, 0), # Move right\n", + " 'S': (0, 1), # Move down\n", + " 'W': (-1, 0) # Move left\n", + "}\n", + "\n", + "def solve_maze_with_costs(ascii_map):\n", + " rows = ascii_map.strip().split(\"\\n\")\n", + " height, width = len(rows), len(rows[0])\n", + "\n", + " # Find start and end positions\n", + " start, end = None, None\n", + " for y, row in enumerate(rows):\n", + " for x, char in enumerate(row):\n", + " if char == 'S':\n", + " start = (x, y, 'E') # Start facing North\n", + " elif char == 'E':\n", + " end = (x, y)\n", + " \n", + " # Priority queue for Dijkstra's algorithm\n", + " pq = []\n", + " heapq.heappush(pq, (0, start)) # (cost, (x, y, direction))\n", + "\n", + " # Visited states: {(x, y, direction): cost}\n", + " visited = {}\n", + "\n", + " while pq:\n", + " cost, (x, y, direction) = heapq.heappop(pq)\n", + "\n", + " # Goal check: If we reach the endpoint\n", + " if (x, y) == end:\n", + " return cost\n", + "\n", + " # Avoid revisiting with higher cost\n", + " if (x, y, direction) in visited and visited[(x, y, direction)] <= cost:\n", + " continue\n", + " visited[(x, y, direction)] = cost\n", + "\n", + " # 1. Move forward\n", + " dx, dy = MOVEMENTS[direction]\n", + " nx, ny = x + dx, y + dy\n", + " if 0 <= nx < width and 0 <= ny < height and rows[ny][nx] != '#':\n", + " heapq.heappush(pq, (cost + 1, (nx, ny, direction)))\n", + "\n", + " # 2. Rotate clockwise\n", + " next_direction = DIRECTIONS[(DIRECTIONS.index(direction) + 1) % 4]\n", + " heapq.heappush(pq, (cost + 1000, (x, y, next_direction)))\n", + "\n", + " # 3. Rotate counterclockwise\n", + " prev_direction = DIRECTIONS[(DIRECTIONS.index(direction) - 1) % 4]\n", + " heapq.heappush(pq, (cost + 1000, (x, y, prev_direction)))\n", + " \n", + " return float('inf') # No path found\n", + "\n", + "# Example ASCII map\n", + "with open('input','r') as infile:\n", + " ascii_map = infile.read()\n", + "\n", + "# Solve the maze\n", + "cost = solve_maze_with_costs(ascii_map)\n", + "print(\"Minimum Cost to Reach the End:\", cost)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pdf", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/16/input b/16/input new file mode 100644 index 0000000..e2f1a83 --- /dev/null +++ b/16/input @@ -0,0 +1,141 @@ +############################################################################################################################################# +#...................#...#...#.......#.........#.......#.........#...#.....#.............#.........#.....#.....#...............#............E# +#.#################.#.#.#.#.#.#.###.#.#.#.#####.###.###.#.#####.#.#.###.#.#.#.#########.###.#.###.###.###.###.#.#######.#####.###.#######.#.# +#.........#.#.....#.#.#.#.#...#.#.#.#.#.......#.#.#.....#...#.....#.....#...#.#...#...#...#.#.#.#...#.......#...#.#...#.#...#.....#...#...#.# +#.#######.#.#.#.###.#.#.#.#####.#.#.#.###.###.#.#.#######.#.#########.#.#####.#.#.#.#.###.###.#.###.#######.###.#.#.#.#.#.#########.###.###.# +#.#...#...#.#.#...#.#.#...#.....#.#.#.....#.......................#.#.#...#...#.#...#...#.....#...#.......#.#.....#.#.#.#...................# +#.###.#.###.#.###.#.#######.#####.#.#####.#.###.#.#.#############.#.#.###.#.#.#.#######.#########.#######.#.#.###.#.#.#.###.#.#####.#.#.#.### +#.#...#...#.#.#...#.........#...........#.#.....#.#.............#.#.#...#...#.....#.#...#...............#.#...#...#.#.#...#.#.......#...#...# +#.#.#####.#.#.#.###.###################.#.#.#############.#######.#.###.#####.###.#.#.#####.#.###.#.###.#.#########.#.###.#.#############.#.# +#.#.....#.#...#...#.#.................#...#...........#...#...#...#.....#...#...#.#.#.#.....#.#...#...#.#...........#...#.#...#.........#.#.# +#.#.#.#.#.#####.#.#.#.###############.###.###########.#.###.#.#.###.#####.#.#.#.#.#.#.#.###.#.#.#####.#.#############.#.#.###.#.#######.###.# +#.#.#.#.#.....#.#...#...........#.....#.#.#.....#.....#...#.#...#.#.#.....#...#.#...#.#...#...#.....#.#...#...#...#...#.#.#...#.......#.#...# +#.###.#.#####.###.#############.#.#####.#.#.#.###.#.#####.#.#####.#.#.###.#####.#####.#.#.#.#######.#.###.#.#.#.#.#.#.#.#.#.###.#####.#.#.#.# +#.....#...#.#...#.#.............#.........................#.#.....#...#.......#.....#.#.#.#...............................#.#.#...#.#.#...#.# +#.#######.#.###.#.###.#.#.#.#.#.#.#.#.#.#.#################.#.###.###.#######.#####.#.#.#.#.###########.#.#####.#.#.#.#####.#.###.#.#.#####.# +#...#...#.#...#.#.....#.#.#.#...#...#.#.#...................#.#...#...........#...#...#.#.....#...#.#.........#.#...#.....#.#.......#.......# +#.#.#.#.#.###.#.#####.#.#.#.#######.#.#.###.#################.#.###.#.###.#####.#.#.#######.#.#.#.#.#.#####.#.###########.#.#.#######.#.#.#.# +#.#...#.#.#...#.#.....#.#...#.......#.#...#...........#...#...#.....#...#.......#...#.....#.#...#.#.#.#...............#...#.#.#.......#.#.#.# +#.###.###.#.#.#.#####.#.#####.#.#.#######.#.#.#######.###.#.###.#######.###.#.#######.###.#######.#.#.#.#.###########.#.#.#.###.#######.###.# +#...........#.#.....#...#.#...#...#.....#.#.#.#.....#.#.....#.........#.......#.........#...#.....#...#.#...#...#...#...#.#.....#.....#.....# +#.#####.###.#######.#.#.#.#.#######.###.#.#.#.#.###.#.#.###.#.#########.#######.#.#########.#.#########.###.#.#.#.#.#.###############.#.##### +#.....#.#.#.......#...#...#.#.....#...#.#...#.#.#...#.#.......#.......#...#...#...#...#.....#.#...#.......#.#.#...#.#...........#.....#.#...# +#.###.#.#.#.###.#.#####.#.#.#.###.###.#.#.###.#.#.#.#.#########.#####.#####.#.###.#.#.#.#####.#.#.#.#######.#.#####.#.#######.#.#.###.#.#.#.# +#...#...#...#...#.......#.#.....#.....#.#...#...#...#.........#...#.#.......#.....#.#.#.....#...#.....#...#...#.#...#.#.......#...#...#.#.#.# +#.#.#######.#.#####.#####.#########.#.#.#.#########.#########.###.#.###########.###.#.###.#.###.#######.#.###.#.#.#.#.#.#.#########.###.#.#.# +#.#.......................#...#.....#...#.......#...#...#...#...#.#.......#...#.#...#...#.#...#.....#...#...#...#.#.#.#...#.....#.#.#.#...#.# +#.###.#.#.###.#.###.#######.#.#.###.#.###.#.###.#.###.#.#.#.###.#.#####.###.#.###.###.#.#.###.#####.#.#####.#####.###.#.###.###.#.#.#.#####.# +#...#...#...#.#...#.#.....#.#.#.#...#...#.#.#.#.#.#.....#.#...#...#.....#...#.....#.#...#...#.....#.....#.#.....#.....#.........#.#.#...#...# +#.#.#######.#####.#.###.#.###.#.###.###.#.#.#.#.#.#####.#.###.#####.#####.#########.#.#########.#.#.###.#.#####.###.#######.#.###.#.#.#.#.### +#.#...#...#.......#.....#.....#...#.....#.#.#.#...#...#.....#...........#...#...#.#.......#...#.#.#.#...#.....#.............#...#.#.#.#.#.#.# +#.#####.#.###################.###.#######.#.#.###.#.#.#.###############.###.#.#.#.#.###.#.#.#.###.###.###.###.#########.###.###.#.#.###.#.#.# +#.#...#.#.....#.................#...#...#.#.#...#...#.#.#.#...............#...#.#.#.....#...#...#.......#.................#...#.#...#...#...# +#.#.#.#.###.###.#######.#######.###.#.#.#.#.#.#.###.#.#.#.#.#####.#########.###.#.#############.#######.#.###########.#######.#.#.###.#####.# +#...#.....#.....#.....#.#.....#...#.#.#.#.#.#.#.....#.#...#.#...#.....#.........#.....#.......#.....#...#...#.......#.#.....................# +#################.###.###.###.#.###.#.###.#.#.#######.#####.#.#.#.#.#.#.#########.###.#.#####.#####.#.#####.#.#####.#.#.#######.#.###.#.##### +#.......#...#...#.#.#.#...#.#.#.#...#...#.#.#.....#.........#.#...#.#...#.....#.....#.......#...#...#.#.....#.....#.#.#.#...#...#.....#.#...# +#.#####.#.#.#.#.#.#.#.#.###.#.#.#.#####.#.#.#.###.#######.#.###.###.#####.#.#.#.###########.#.#.#.###.#.###.#####.#.#.#.#.###.#.#######.#.### +#.#.....#.#.#.#...#.#.#.#.....#.#.....#...#.#...#.....#.#.#...#.#.#.#...#.#.#.........#...#.#.#.#.......#...#.....#.#...#.....#.........#...# +#.#.#####.#.#.#####.#.#.#.#####.#####.#.###.#.#.#####.#.#.###.#.#.#.###.#.#.#########.#.#.#.#.#####.#####.###.#####.#.###.#.#############.#.# +#.#.....#.#.........#...#.#...#...#...#...#.#.....#...#.#.....#...#.#...#.#...#.....#...#...#.#...#.#...#.#...#.....#...#.#.#...#.......#.#.# +#.#####.#.#.#.#.###.#####.###.###.#.#####.#.#.#.###.#.#.#####.#.###.#.#.#.###.#.###.#####.###.#.#.#.#.###.#.###.#######.#.#.#.#.#.#.#.#.#.#.# +#.#...............#.....#...#.#...#...#.....#...#...#...#.....#.#...#.#.#...#...#.#...#.#...#.#.#...#.....#...#.#...........#.#...#.#.#...#.# +#.#.#.#.#.#.#.###.#########.#.#.#####.#.#######.#.###.#.#.#.###.#.###.#####.#####.###.#.###.#.#.#######.#####.#.#.#.#####.###.#####.#.#####.# +#...#.#...#.#.#...#...........#.....#...#.....#.#.#.#.#.#.#.#...#.#...#...............#.....#.#.#.....#.......#.#.#.#...#.#.....#...#.......# +#####.#####.#.#.#.#.#####.###.#.#.#.#####.#.#.#.#.#.#.#.#.#.#.###.###.#.#########.#.#.###.###.#.###.#.#######.#.###.###.#.#.#####.###.#.###.# +#...#...#.#.#.#.#.#.......#.....#.#.......#.#.#.#.#.#.#...#.....#...#...#.........#.#...#.#...#.....#...........#...#...#.#.#.........#...#.# +#.#.###.#.#.#.#.#.#######.###.#############.#.###.#.#.#####.###.###.#.###.#########.###.#.#.###################.#.###.###.#.#.###.#.#####.#.# +#.#...#.#.#...#.#.#.....#...#...............#.....#.......#...#...#.......#...#.....#...#.#.#...#...#...........#...#.....#.#...............# +#.###.#.#.#####.###.#.#.###.###################.###########.#.###.#.###.###.#.#.#####.###.#.#.#.#.#.#.#############.#.#######.###.#######.### +#...#.#.#...#.#.....#.#...#.....#.......#...#.........#...#.#...#.#...#.....#.....#...#...#...#.#.....#...........#.#...#...#.....#.#...#...# +###.#.#.#.#.#.#.#####.#.#######.#.#.#####.#.#.###.###.#.#.###.#.#.###.###########.#.###.#####.#.#.#######.#####.#.#.###.#.#.#####.#.#.#.#.#.# +#...#...#.#...#.#...#.#.#...#...#.#.....#.#...#.#...#...#...#.#.#...#...........#.#.#.......#.#.#.......#.#.#...#...#...#.#.....#...#.#.....# +#.#######.###.#.#.#.#.#.#.#.#.#######.#.#.#####.###.#######.#.#####.#####.#.###.###.#####.#.###.#######.#.#.#.#######.###.#####.#.###.###.#.# +#.......#.#...#.#.#.#.#.#.#...#.....#.#...........#.#.....#.#.......#...#.#.#.....#...#.........#.....#.#.#.#...#.........#...#.#.....#...#.# +#######.#.###.#.#.###.###.#####.###.###############.#####.#.###.###.#.###.#.#####.###.#########.###.#.#.#.#.###.#.#####.#.#.###.#.#######.#.# +#.....#.#...#...#...#.#...#.....#...#.....#.........#.....#...#...#...#.....#...#.....#...#.........#.#.#.#.#...#.....#...#.#...#...#...#...# +###.###.#.#.###.###.#.#.###.#####.###.###.#.#########.#######.#.#.###.#.###.#.#.#####.#.#.#######.#####.#.#.#.#######.#.#.#.#.###.#.#.#.#.### +#...#...#.#.........#...#...#...#.....#.....#.......#.......#...#.....#.#.....#...#...#.#.......#.#...#.#.#.#.#...#...#.#.#.#.#.....#.#.....# +#.#.#.#############.#######.#.#.#####.#########.###.#####.#########.###.#########.#####.#######.#.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#####.###.#.# +#.#.#.........#...#.........#.#.......#.......#...#...#...#.......#...#.#.......#.....#...#...#.#.#.#...#...#.#.#.#.#...#.#.#.#.......#.#...# +#.###########.#.#.#########.###########.#####.#.#.###.#.###.###.#.###.#.#.#####.#.###.###.###.#.###.#########.#.#.#.#####.#.#.#######.#.#.### +#.#.....#.....#.#...........#...#...........#.#.#.#.#.#.#...#...#...#.#.#.....#.#.#.#.........#...#.#.........#.#...#.....#.#.#.....#...#...# +#.#.#.###.###################.#.#.###########.###.#.#.#.#.###.###.###.#.###.#.#.#.#.#############.#.#.#########.#.#.#.#.###.#.#.###.#####.#.# +#...#...#...........#.........#...#...#.......#...#.#...#...#.#...#...#.......#.#.....#.....#.....#.#.#.......#.#.#.#.#.....#.#.#.....#.....# +#.#####.#######.###.#.###############.#.#######.###.#.###.###.#.###.###########.#####.#.#.#.#.###.#.#.#.#####.#.###.#.###.#.#.#.#####.#.#.#.# +#.#...#...........#...#...#...........#...#.....#.....#...#...#.....#.........#.#.....#.#.#...#.#.#.#.......#.#.....#...#.#...#...#...#...#.# +#.#.#.###.#####.#######.#.#.#####.###.###.#.###.#######.###.#####.#.#.#######.#.###.###.#.#.#.#.#.#.#########.#.#######.#.#######.#.#####.#.# +#.#.#.#.#.....#.#.......#.#.#.......#...#.#.......#...#...#.....#.#...#.....#.#...#.#...#.#...#...#.....#.....#.#.......#.#.......#...#...#.# +#.#.#.#.#####.###.#.#.###.#.#.#.###.###.#.#######.#.#.###.#####.#######.#.#.#.###.###.###.#####.#######.#.#####.###.#####.#####.#####.#.#.### +#...#.......#.#...#...#.#...#.#...#.....#.......#...#...#.....#...#.....#.#.#.....#...#.....#.#.#...#...#.#...#.....#...#.......#...#.#.....# +#####.#######.#.#######.#.#####.#.#.###########.#####.#######.###.#.#####.#########.#####.#.#.#.###.#.###.###.#######.###########.#.#.#####.# +#...#.#.......#.#...............#.#...........#...#...#.........#...#...#.........#.#.....#...#.#...#.....#.....#.........#.......#.#.....#.# +#.###.#.#####.#.#.###.#######.###.#####.#.#######.#.###.#############.#####.#.#.#.#.#.#########.#.#########.###.#.#######.#.#######.#####.#.# +#.....#...#.#.#.#.#...#...#.....#...#.....#.......#...#...#.........#.#.....#...#...#.#.......#.#...........#...#.#.......#...#...#.....#...# +#.#######.#.#.#.###.###.#.#####.#.###.#.#.#.#########.###.#.#######.#.#.#############.#.#####.#.#.###.#.#.###.###.#.###.#####.#.###.#######.# +#.#.....#.#...#.#.......#.....#...#...#...#.#.........#...#.......#.#.#.....#.........#.#...#.#.#.#...#.#...#.#...#...#.#.....#...#.........# +#.#.###.#.#####.#.###.#######.#####.#.#####.#####.#####.#####.#.###.#.#.###.#####.#####.###.#.#.###.#.#.###.###.#.###.#.#.#######.########### +#.............#.......#.......#.....#.#...#.....#.....#...#...#.#...#.#.#.#.....#...........#.#.....#.#...#...#.#...#.#.#.#.......#.......#.# +#.#.#.#.#.#.#.#.#.#####.#####.#.#.#####.#.#####.#####.###.#.###.#.###.#.#.#####.#############.#######.###.###.#.###.#.#.#.#.#####.#.#####.#.# +#.#.#.#.#...#...#.#.....#...#.#...#.....#.....#.#.....#...#.....#...#.#.#.....#...........#...#.....#...#.#.#.#...#.#.#.#...#.#...#...#.....# +#.###.#.###########.#####.###.#.###.###.###.#.#.#.#.#.#.#######.###.#.#.###.#######.#.###.#.###.#.#####.#.#.#.###.#.#.#######.#.###.#.#####.# +#.....#.#.......#...#...#.....#.#...#.....#.#.#.#...#.#.#.....#...#...#...#.......#.....#.#.....#.........#.#.....#.#.#.......#.#...#.....#.# +###.#.#.#.#.###.#.###.#.###.###.#.###.###.#.#.#.###.#.#.#.#######.#######.###.###.#######.###.###########.#.#######.#.#.###.#.#.#.###.#.#.### +#...#.#.#.#...#...#.......#...#...#.....#.#.#.#.#...#.#...#.....#.......#.#...#.#...#...#...#.#.........#.....#.....#...#...#...#...#.#.#...# +#.###.###.###.###.#.#####.###.#.###.###.#.#.###.#.#####.###.#.#####.###.#.#.###.###.#.#.###.#.###.#####.#.###.#.###########.#########.#.#.#.# +#...#.......#.#...#.#...#.#...#.....#...#.#...#.#.#.....#...#.#...#...#...#...#.....#.#.....#...#.#.....#.....#.............#.......#...#...# +###.#########.#####.#.#.#.#####.#####.###.###.#.#.#.#####.###.#.#.###.#.###.#.#.###.#.#########.###.###.#.#####.#####.#####.#.#.###.#.###.#.# +#...#.....#...#.......#.#.#.....#.....#.#.....#.#...#.....#.#...#.#...#...#.#.....#.#.#.....#.....#...#.#...#.........#...#.#...#...........# +#.###.###.#.###.#######.#.#.#####.#####.#.###.#.#.###.#####.#####.#.#####.#.#####.#.#.#.###.#####.###.#.###.###.#######.###.#.#.#.###.#.###.# +#.#...#...#.....#...#...#.#.#...#.#...#...#...#.#.#...#.........#...#.....#...#...#.#.....#...#.#...#.#...#.....#.....#.....#.#.#.......#...# +#.#.###.#######.#.#.#.###.#.#.#.#.#.#.#.###.###.###.###.#.###.#.#####.#######.#.###.#####.###.#.###.#.###########.###.#.#######.###########.# +#...............#.#.#...#...#.#...#.#.#.#...#...#...#...#...#.....#...#...#...#...#.#...#.#...#...#.#...........#.#.#...#.....#.....#.....#.# +#####.#.#.#.#.#.#.#.#######.#.###.#.#.#.#.###.#.#.#.###.###.#####.#.###.#.#.#####.###.#.###.#.#.###.#.#########.#.#.###.#.###.#.###.#.###.#.# +#.....#.#.#.#.....#.........#.#.....#.#.#...#.#.#...#...#...#.....#...#.#...#...#...#.#.....#...#...#.......#.....#.......#.#.#.#...#.#.#.#.# +#.#####.###.#############.###.#.#####.###.#.#.#.###.#.###.###.#######.#.#####.#.#.#.#.#######.###.#######.###.###.#.###.#.#.#.###.###.#.#.#.# +#.#...#.....#.....#.....#.....#.#...#.......#.#.......#.#.#...#.....#.#...#...#.#...#.#.#.......#.......#.#...#...#.#.#...#.......#.....#.#.# +#.#.#.#######.###.#.#.#####.###.#.#.#####.#.#.#.#######.#.#.#.#.###.#.#####.###.###.#.#.#.#####.#######.###.#.#.###.#.###.#########.#####.#.# +#...#.....#...#.#.#.#.......#...#.#.....#.#...#.#.........#.#.#.#...........#.#.....#.#.#.....#.......#.....#.#...#.....#...........#...#.#.# +#.#####.###.###.#.#.#########.###.#####.#.#.#####.###########.#.#.#.#########.###.###.#.#####.#######.#######.###.#####.#############.#.#.#.# +#.#...#...#.....#.#.......#...#.......#.#.#...#...#...#.......#.#.#.......#...#...#...#.....#.......#.....#...#.#...#.#...#.................# +#.#.#.###.###.###.###.#.#.#.###.#####.###.###.#.#.#.###.#.#####.#.#####.###.#.#.#.#.#####.#####.#####.#####.###.###.#.###.#.###.#.#.######### +#.#.#...#.....#.....#.#.#.#.#.#.#...#.#...#...#...#...#.#.......#.....#.....#.....#.....#.......#...#.#.....#.....#.#.....#.#.#.#.#.#.......# +#.###.#.#######.#####.###.#.#.#.#.#.#.#.###.#####.#.#.#.#######.#.#.#.#################.#########.#.#.#.#######.#.#.#######.#.#.#.###.#####.# +#.....#.#...#...#.......#.#.#...#.#.#.....#.#.....#.#...#.#.......#.#...#...............#.........#...#...#.....#.#.#...#...#.#.#.#...#...#.# +#######.#.#.#.###.#####.#.#.#.###.#.#####.#.#.#####.#.###.#.#######.###.#.#.#############.#######.#######.#.#####.#.#.#.#.###.#.#.#.###.#.#.# +#.....#.#.#.#.....#.......#.#...#.#...#...#.#...#.#...#.#...#.#.....#.#.#.#.#.........#...#.....#.#.......#.#...#.#...#.#...#...#.#.........# +#.#####.#.#########.#.#.###.#.###.###.#.###.###.#.###.#.#.###.#.#####.#.#.###.#######.#.#####.###.#.#######.#.###.#####.###.#.###.#####.###.# +#.......#.#.........#.#.#...#.#.....#.#...#...#.#.....#.......#.....#.#.#...#.......#.#.#.....#...#.....#...#...#.#...#.....#.#.........#...# +#.#######.#.#########.#.#.###.#.#####.###.#.###.#.#########.#######.#.#.###.#.#######.#.#.#####.#######.#.###.#.#.###.#.#.###.#######.###.#.# +#...#.....#.....#...#.#.#.#...#.#.....#...#...#.#.......#...#.......#.#.#.#...#...#...#.#...#.......#...#.#...#...#...#.#.#...............#.# +###.#.#.#######.###.#.###.#.###.#.###.#######.#.#######.#.###.#######.#.#.#####.#.#.###.###.#.#######.###.###.#####.#.#.#.#.#########.#####.# +#...#.#.......#.#...#.....#.#.#.#...#.#.........#.....#.#...#.#...#.....#.....#.#.#.#.....#.....#.....#.#...#.#.....#.#.#.#.#.....#.......#.# +#.###.###.###.#.#.###.#.###.#.#.###.###.#.#########.#.#.#####.###.#.#####.#####.#.#.#.###.###.###.#####.#.#.#.#####.#.#.#.###.###.###.###.#.# +#...#...#.#...#.#.....#.#.....#.#.#.....#...........#.#.#...#.#...#.#.......#...#.#.#...#...#.#...#.#.....#.#.......#.#.#.....#...#...#...#.# +###.#####.#.###.#.#####.#####.#.#.#############.#######.#.#.#.#.#.#.#######.#.###.#.###.###.###.###.#.#####.###.###.###.#.#####.###.#.#####.# +#.#...#...#.#...#.....#...#...#...#.........#...#.....#.#.#...#.#...........#...#...#...#.#.....#...#.....#.#.....#.#...#...#...#.........#.# +#.###.#.#####.#####.#.###.#######.#.###.#####.###.###.#.#.#####.#.#######.#.###.#####.###.#######.#####.###.#.###.###.#####.#.#######.###.#.# +#...#...#.....#.#.......#.......#.#...#.#...#.........#.#.#.....#.........#...#.#.....#.........#.#.....#...#.#.#.#...#...#.#.......#...#...# +#.#####.#.#####.#.#####.###.###.#.###.#.#.#.#######.###.#.#.###############.###.#.#########.###.#.#.#####.#.#.#.#.#.###.###.#######.###.#.### +#.....#.#.#...#...#...#.........#...#.#.#.#.....#...#...#.......#...........#...#.........#.#...#.#.#...#...#.#.#...#.............#.#.#...#.# +#.#.###.#.#.#.#####.#.#############.#.#.#.#.#####.#.#.###.#####.#.###########.#####.#.###.#.#.###.#.#.#.#.#.#.#.#####.###.#####.###.#.###.#.# +#.#.....#.#.#.......#...........#...#.#...#.#.....#.#...#.....#.#.#.....#.............#...#.#...#...#.#.....#.#...#...........#.#...#...#.#.# +#.#######.#.###################.#.###.#####.#.#########.#####.#.#.###.#.#.#.###.#######.###.###.###.#.#####.#.#.###.###.#####.#.#.###.#.#.#.# +#.#.......#.#.........#.....#...#.#.#.....#.#.........#.......#...#...#.#.#.......#...#.#...#.....#.#.#...#...#.....#...#...#.#.#...#.#.#...# +#.#.#.#####.#.#######.#.###.#.###.#.#.#####.#########.#########.###.###.#.###.###.#.#.#.###.#####.###.#.#.#.###.#.###.###.#.#.#####.###.###.# +#.#.#.#...#...#.....#.#.#...#.....#...#.....#...........#.....#.#.#...#.#...#.#.#.#.#.#...#.....#.....#.#.#...#...#.#.#...#.#.....#...#.....# +###.###.#.#####.#.#.#.#.#.#########.###.###.#.###########.###.#.#.#.#.#.###.#.#.#.#.#.###.#####.#######.#.###.###.#.#.#.#########.###.#####.# +#...#...#.......#...#...#.#...#...............................#.#...#.#...#.#.#.#...#...#.......#...#.........#.....#.#.........#...#.....#.# +#.###.#######.###.###.###.#.#.#.###.#####.#.#######.#.#.#.#.###.#.###.#####.#.#.#######.#######.#.#.#.#####.#.###.###.#.#####.#.###.###.#.#.# +#...#.......#...#.......#.#.#.....#.#.....#.....#...#.#.#.#.....#.#.#...#...#.#.....#...#...#...#.#.#.#...#.#.#.......#.#...#.#.#.#.....#.#.# +###.#######.###.#.###.###.###.#####.#.#########.#.###.#.#.#######.#.#.#.#.###.#.###.#.#.#.###.###.#.#.###.#.#.#.#.#####.###.#.#.#.#####.#.#.# +#.....#...#.#.#...#.#.....#...................#.#.....#.#.#.....#.#.#...#.....#.#.#.#...#.#...#...#.#.....#...#.#.....#.....#.#.#...#.#...#.# +#.###.#.#.#.#.###.#.#.#####.#.#.###.#.#####.#.#.#######.#.#.#.###.#.#.#########.#.#.###.#.#.#.#.###.#####.###.#.#.###.#######.#.#.#.#.#.###.# +#...#...#.#...........................#...#.#.#.#.....#...#.#.....#.#.............#.#...#...#...#.#.#...#.#.....#.#.#.#.......#...#.........# +###.#####.#######.###.#####.#.###.#.#.#.#.#.###.#.###.#########.###.#.#############.#.#.#####.###.#.#.#.#.###.###.#.#.#.#######.#######.###.# +#...#...........#.#.....#...#.....#...#.#.#.....#.#.#.#.......#.#...........#.......#.....#...#...#.#.#.#...#...#.#.#...#.......#...#.......# +#.###############.#.###.#.###.###.#.###.#.#######.#.#.#.#.###.#.#.#.#.#######.#####.###.#.#.#.###.#.#.#.###.###.#.#.#####.#######.#.#.#.#.### +#.#...#.....#...#.#...#.#.#...#.#...#...#.#.......#.#.#.#.#...#...#.............#...#...#...#.....#...#...#.....#.#.......#.......#...#.#...# +#.#.#.#.###.#.#.#.###.#.#.#.#.#.###.#.###.###.#####.#.#.#.#.#########.#########.#.#####.#####.###.#######.#######.#########.###########.###.# +#S..#.....#...#.......#...#...........#.......#...........#...........#...............................................................#.....# +############################################################################################################################################# diff --git a/16/testinput b/16/testinput new file mode 100644 index 0000000..6a5bb85 --- /dev/null +++ b/16/testinput @@ -0,0 +1,15 @@ +############### +#.......#....E# +#.#.###.#.###.# +#.....#.#...#.# +#.###.#####.#.# +#.#.#.......#.# +#.#.#####.###.# +#...........#.# +###.#.#####.#.# +#...#.....#.#.# +#.#.#.###.#.#.# +#.....#...#.#.# +#.###.#.#.#.#.# +#S..#.....#...# +############### \ No newline at end of file