From 8919f4caaeb41990fc2f7c517b4961cf7f9d5cf7 Mon Sep 17 00:00:00 2001 From: Luke Hubmayer-Werner Date: Mon, 12 Dec 2022 17:05:09 +1030 Subject: [PATCH] 2022 Day 12 Python --- 2022/day12.py | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ 2022/helpers.py | 2 ++ 2022/input/12 | 41 +++++++++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 2022/day12.py create mode 100644 2022/input/12 diff --git a/2022/day12.py b/2022/day12.py new file mode 100644 index 0000000..bb90cf9 --- /dev/null +++ b/2022/day12.py @@ -0,0 +1,82 @@ +from helpers import * +input_stripped = read_day(day) +lines = input_stripped.split('\n') + +sample_lines = ''' +Sabqponm +abcryxxl +accszExk +acctuvwj +abdefghi'''.strip().split('\n') + +def make_heightmap(lines: list[str]) -> tuple[ArrayLike, ArrayLike, ArrayLike]: + heightmap = np.zeros((len(lines[0]), len(lines)), dtype=dtype) + for y, line in enumerate(lines): + for x, c in enumerate(line): + if c == 'S': + heightmap[x,y] = 0 + start = np.array([x,y], dtype=dtype) + elif c == 'E': + heightmap[x,y] = 25 + end = np.array([x,y], dtype=dtype) + else: + heightmap[x,y] = ord(c) - ord('a') + return heightmap, start, end + +# def make_cell_costs(position, heightmap): +# init_val = 9_999_999 +# costs = np.full_like(heightmap, init_val) +# pos_t = tuple(position) +# costs[pos_t] = 0 +# curr_positions = {pos_t} +# while (costs == init_val).any() and len(curr_positions) > 0: +# next_positions = set() +# for pos_t in curr_positions: +# n_h_limit = heightmap[pos_t] + 1 +# n_cost = costs[pos_t] + 1 +# for d in directions_array: +# next_t = (pos_t[0] + d[0], pos_t[1] + d[1]) +# if (0 <= next_t[0] < heightmap.shape[0]) and (0 <= next_t[1] < heightmap.shape[1]): +# hn = heightmap[next_t] +# if n_h_limit >= hn and costs[next_t] > n_cost: +# costs[next_t] = n_cost +# next_positions.add(next_t) +# curr_positions = next_positions +# return costs + +def make_reversed_cell_costs(position, heightmap): + init_val = 9_999_999 + costs = np.full_like(heightmap, init_val) + pos_t = tuple(position) + costs[pos_t] = 0 + curr_positions = {pos_t} + while (costs == init_val).any() and len(curr_positions) > 0: + next_positions = set() + for pos_t in curr_positions: + n_h_limit = heightmap[pos_t] - 1 + n_cost = costs[pos_t] + 1 + for d in directions_array: + next_t = (pos_t[0] + d[0], pos_t[1] + d[1]) + if (0 <= next_t[0] < heightmap.shape[0]) and (0 <= next_t[1] < heightmap.shape[1]): + hn = heightmap[next_t] + if n_h_limit <= hn and costs[next_t] > n_cost: + costs[next_t] = n_cost + next_positions.add(next_t) + curr_positions = next_positions + return costs + +# heightmap, start, end = make_heightmap(sample_lines) +heightmap, start, end = make_heightmap(lines) +rev_costs = make_reversed_cell_costs(end, heightmap) + +start_score = rev_costs[*start] +print(f'Part 1: {start_score}') +start_candidates = {tuple(pos) for pos in np.transpose(np.nonzero(heightmap == 0))} +best_candidate = start +best_score = start_score +for candidate in start_candidates: + score = rev_costs[*candidate] + if score < best_score: + best_candidate = candidate + best_score = score +print(f'Part 2: start at {best_candidate}: cost of {best_score}') diff --git a/2022/helpers.py b/2022/helpers.py index bced7c4..0795d4a 100644 --- a/2022/helpers.py +++ b/2022/helpers.py @@ -2,6 +2,8 @@ from numpy.typing import ArrayLike import numpy as np import re import requests +import sys +sys.setrecursionlimit(100000) try: import datetime diff --git a/2022/input/12 b/2022/input/12 new file mode 100644 index 0000000..d469653 --- /dev/null +++ b/2022/input/12 @@ -0,0 +1,41 @@ +abcccaaaaaaccccccccaaaaaccccccaaaaaaccccccaaaaaaaacccaaaaaaaccaaaacccccccccccccccccccccccccaaaaaacccccccccccccccccccccccccccccaaaaaa +abcccaaaaaacccccccaaaaaaccccaaaaaaaacccccccaaaaaaaaaaaaaaaaccaaaaacccccccccccccccccccccccccaaaaaacccccccccccccccccccccccccccccaaaaaa +abccccaaaaacaaaccaaaaaaaacccaaaaaaaaacccccccaaaaaaaaaaaaaaaacaaaaaacccccccccaaacccccccccccaaaaaaaaccccccccccaaccccccccccccccccaaaaaa +abccccaaaaccaaaaaaaaaaaaacccaaaaaaaaaacccccaaaaaaaaaaaaaaaaaaacaaaacccccccccaaaacccccccccaaaaaaaaaacccccccccaaaccccccccccccccccccaaa +abcccccccccaaaaaacccaacccccccccaaacaaaccccccaacccccccaaaaaaaaacaacccccccccccaaaacccccccccaaaaaaaaaacccccccccaaaccacaaccccccccccccaaa +abcccccccccaaaaaacccaacccccccccaaacccccccccccccccccccaaaacaaaacccccccaacaaccaaaccccccccccaccaaaaacacccccccccaaaacaaaaccccccccccccaac +abccccccccccaaaaacccccccccccccccacccaaaacccccccccccccaaaacccccccccccccaaaacccccccccccaacccccaaaaccccccccjjjjaaaaaaaaaccccccccccccccc +abccccccccccaaaacccccccccccccccccccaaaaacccccccccccccaaaccccccccccccccaaaaacccccccccaaaaaacccaaccccccccjjjjjjkkaaaacccccccccaacccccc +abcccccaaccccccccccccccccccccccccccaaaaaacccccccccccccaacccccccccccccaaaaaaccccccccccaaaaaccccccccccccjjjjjjjkkkkaacccccaacaaacccccc +abccaaaacccccccccccccccccccccccccccaaaaaaccccccccccccccccccccccccccccaaaacaccccccccaaaaaaaccccaacccccjjjjoooookkkkkkkklllaaaaaaacccc +abccaaaaaacccccccccccccccccccccccccaaaaacccccccccccccccccccccccccccccccaaccccccccccaaaaaaaaccaaaaccccjjjoooooookkkkkkkllllaaaaaacccc +abcccaaaaacccccccccccccccccccccccccccaaaccccccccaaaacccccccccccccccccccccccccccccccaaaaaaaaccaaaaccccjjooooooooppkkppplllllaccaacccc +abccaaaaaccccccccccccaccccccccccccccccccccccccccaaaacccccccccccccccccccccccccccccccccaaacacccaaaacccijjooouuuuoppppppppplllccccccccc +abcccccaacccccccccccaaaaaaaaccccccccccccccccccccaaaaccccaaccccccccaaacccccccccccccaacaaccccccccccccciijoouuuuuuppppppppplllcccaccccc +abcccccccccccccccccccaaaaaaccccccccccccccccccccccaaccccaaaacccccccaaaaccccccccccaaaaaaccccccccccccciiiiootuuuuuupuuuvvpppllccccccccc +abcccccccccccccccccccaaaaaaccaaaaacccccccccccccccccccccaaaacccccccaaaaccccccccccaaaaaaccccccccccccciiinnotuuxxxuuuuvvvpppllccccccccc +abccccccccccccccacccaaaaaaaacaaaaaaacccccccccccccccccccaaaacccccccaaacccccaaaaccaaaaaccccaaccccccciiiinnnttxxxxuuyyyvvqqqllccccccccc +abcccccccccccaaaaccaaaaaaaaaaaaaaaaaaccaacccccccccccccccccccccccccccccccccaaaacccaaaaaccaaacccccciiinnnnnttxxxxxyyyyvvqqqllccccccccc +abaaaacccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccccccccaaaacccaaaaaacaaaccccciiinnnnttttxxxxxyyyyvvqqmmmccccccccc +abaaaaccccccccaaaaacccaaaaacaaaaaacaaaaaaccccccccccccccccaaccccccccccccccccaacccccccaaaaaaaaaaciiinnnnttttxxxxxyyyyvvqqqmmmccccccccc +SbaaaacccccccaaaaaccccaaaaaccaaaaaaaaaaaccccccccccccccccaaacaacccccccccccccccccccccccaaaaaaaaachhhnnntttxxxEzzzzyyvvvqqqmmmccccccccc +abaaaacccccccaacaacccccaaaaaaaacaaaaaaaaaccccccccccccccccaaaaaccccccccccccccccccccccccaaaaaaacchhhnnntttxxxxxyyyyyyvvvqqmmmdddcccccc +abaaaacccccccccccccccccccaaaaaacaaaaaaaaaacccccccccccccaaaaaaccccccccaaaccccccccccccccaaaaaaccchhhnnntttxxxxywyyyyyyvvvqqmmmdddccccc +abaacccccccccccccccccccaaaaaaacccccaaaaaaacccccccccccccaaaaaaaacccccaaaacccccccccccccaaaaaaacaahhhmmmttttxxwwyyyyyyyvvvqqmmmdddccccc +abcccccccccccccccccccccaaaaaaacaaccaaacccccccccccccccccaacaaaaacccccaaaacccccccccccccaaacaaaaaahhhmmmmtsssswwyywwwwvvvvqqqmmdddccccc +abcccccccccccccccaaaccccaaaaaaaaaacaaccaaccccccccccccccccaaacaccccccaaaacccccccccccccccccaaaaacahhhmmmmmsssswwywwwwwvvrrqqmmdddccccc +abcccccccccccccaaaaaaccccaaaaaaaaaccaaaacccccccccccccccccaacccccccccccccccccccccccaaaccccaaaaaaahhhhhmmmmssswwwwwrrrrrrrrmmmmddccccc +abcccccccccccccaaaaaaccccaaaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccaaaaaacccccaaaaachhhhhmmmmsswwwwrrrrrrrrrkkmdddccccc +abccccccccccccccaaaaaccccccaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccaaaaaaccccaaaaacccchhggmmmssswwrrrrrkkkkkkkkdddacccc +abccaaaacccccccaaaaacccccccccaaaaaacaaaaacccccccccccccccccccccccccccccccccccccccaaaaaaccccaacaaaccccggggmmsssssrrlkkkkkkkkkdddaccccc +abccaaaacccccccaaaaacccccccccaaaaaaccccaacccccccccccccccccccccccccccccccccccccccaaaaaccccccccaaccccccgggmllssssrllkkkkkkkeeeddaccccc +abccaaaacccccccaaacccccccccccaaaaaacccccccccccccccccccaacccccccccccccccccccccccaaaaaacccccccccccccccccggllllssslllkkeeeeeeeeeaaacccc +abcccaaccccccccaaacaaaccccccaaaaaaaaaaacccccccccccccaaaaaacccccccccccccccccccccaaacaaacccccaacccccccccggglllllllllfeeeeeeeeaaaaacccc +abccccccccccaaaaaaaaaaccccccccccccaccaaaccacccccccccaaaaaaccccaaccaacccaaccccccaaaaaaacccccaaccccccccccggglllllllfffeeecccaaaaaacccc +abccccccccccaaaaaaaaacccccccccccccccaaaaaaaccccccccccaaaaaccccaaaaaacccaaaaaaccaaaaaacccaaaaaaaacccccccggggllllfffffccccccaacccccccc +abcccccccccccaaaaaaacccccccccccccccccaaaaaaccaacccccaaaaaccccccaaaaacccaaaaaacaaaaaaacccaaaaaaaaccccccccgggffffffffccccccccccccccccc +abccccccccccccaaaaaaacccccccccccccaaaaaaaaacaaaaccccaaaaacaaaaaaaaaacaaaaaaacaaaaaaaaaccccaaaacccccccccccggffffffacccccccccccccccaaa +abccccccccccccaaaaaaacaaccccccccccaaaaaaaaacaaaacccccaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaacccaaaaacccccccccccaffffaaaaccccccccccccccaaa +abccccccccccccaaacaaaaaacccccccccccaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaacccaaacaaaccaaaaaacccccccccccccccccaaaccccccccccccccaaa +abccccccccccccaaccaaaaaccccccccccccccaaaaaaaccccaaaaaaaaaaaaccccaacccccaaaaaacccaaaccccccaaccaacccccccccccccccccaaacccccccccccaaaaaa +abcccccccccccccccaaaaaaaaccccccccccccaacccacccccccaaaaaaaaaaccccaacccccaaccccccccaccccccccccccccccccccccccccccccccccccccccccccaaaaaa