From 85b64b3ef699c9c6b52046f1e9973282ba9d28e7 Mon Sep 17 00:00:00 2001 From: Nick Thomas Date: Tue, 13 Dec 2022 00:13:15 +0000 Subject: [PATCH] 2022 day 12 --- 2022/12/input | 41 +++++++++++++++++++++++++++++++ 2022/12/part1 | 63 +++++++++++++++++++++++++++++++++++++++++++++++ 2022/12/part2 | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 4 +-- 4 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 2022/12/input create mode 100755 2022/12/part1 create mode 100755 2022/12/part2 diff --git a/2022/12/input b/2022/12/input new file mode 100644 index 0000000..4994f18 --- /dev/null +++ b/2022/12/input @@ -0,0 +1,41 @@ +abccccccccccccccccaaccccccccccccccccccccaaaaaaaaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa +abcccccccccccccaaaaaccccccccccccccccccccaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaa +abccccccccccccccaaaaaccccccccccccccaaaaacccaaaaaacccccaaccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaa +abccccccccccccccaaaaacccccccccaacccaaaaacccaaaaaaaccccaaaacaacaaccccccccccccccccccccccccaaaccccaaaccccccccccccaaaa +abcccccccccccccaaaaacccccccaaaaaccaaaaaacccaaaaaaaacaaaaaacaaaaaccccccccccccccccccccccccaaacccaaaaccccccccccccaaac +abccccccaacaaaccccaaccccccccaaaaacaaaaaaccaaaacaaaacaaaaaccaaaaaaccccccccccccccccccccccccaaaaaaaacccccccccccccaacc +abccccccaaaaaaccccccccccccccaaaaacaaaaaaccaaaaccaaaacaaaaacaaaaaacccccccccccccccccccccccaaaaaaaaaccccccccccccccccc +abccccccaaaaaacccccccccccccaaaaaccccaaccccaacccccaaccaacaacaaaaaccccccccccccccccccccccccccaaakkkkllllcccaaaccccccc +abccccccaaaaaaacccccccccccccccaaccccaacccccccccccccccccccccccaaaccccccaaaacccccccccjjjjkkkkkkkkkkllllccccaacaccccc +abcccccaaaaaaaacccccaaccccccccccccccaaaaaaccccccccccccccccccaaccccccccaaaaccccccccjjjjjkkkkkkkkkppllllcccaaaaacccc +abcccccaaaaaaaaccaaaacccccccccccccccaaaaaccccccccccccccccaacaaccccccccaaaacccccccjjjjjjjkkkkkppppppplllccaaaaacccc +abccccccccaaaccccaaaaaacccccccccccaaaaaaaccccccccccccccccaaaaacccccccccaacccccccjjjjoooooooppppppppplllcccaaaccccc +abccccccccaaccccccaaaaaccccaacccccaaaaaaaaccccaaacccccccccaaaaaaacccccccccccccccjjjooooooooppppuuppppllcccaaaccccc +abccccccaacccccccaaaaacccccaaaccaaaaaaaaaaccaaaaaaccccccaaaaaaaaaacaaaccccccccccjjjoooouuuoopuuuuupppllcccaaaccccc +abacccccaaccccccccccaacccccaaaaaaaccaaaaaaccaaaaaaccccccaaaaaccaaaaaaaccccaaccccjjoootuuuuuuuuuuuuvpqlllcccccccccc +abaccaaaaaaaacccccccccccccccaaaaaaccaacccccccaaaaacccccccacaaaccaaaaaaccaaaacaccjjooottuuuuuuuxyuvvqqljjccddcccccc +abcccaaaaaaaaccccccccccccaaaaaaaaacaacaaccccaaaaaccccccccccaaaaaaaaaacccaaaaaacciijootttxxxuuxyyyvvqqjjjjdddcccccc +abcccccaaaaccccaaacccccccaaaaaaaaacaaaaaccccaaaaaccccccccccccaaaaaaaaacccaaaaccciiinntttxxxxxxyyvvqqqqjjjddddccccc +abccccaaaaaccccaaaaacccccaaaaaaaaaaaaaaaaccccccccccccccccccccaaaaaaaaaaccaaaaccciiinntttxxxxxxyyvvvqqqqjjjdddccccc +abccccaaaaaaccaaaaaccccccccaaaaaaaaaaaaaacccccccccccccccccccccccaaacaaacaacaaccciiinnnttxxxxxyyyvvvvqqqqjjjdddcccc +SbccccaaccaaccaaaaacccccccccaaaaaaaaaaaaacccccccccccccccccccccccaaacccccccccccciiinnntttxxxEzzyyyyvvvqqqjjjdddcccc +abcccccccccccccaaaaacccccccaaaaaaaaacaaaccccccccccccccccccccccccaaccccccccccccciiinnnttxxxxyyyyyyyyvvvqqqjjjdddccc +abcccccccccccccaaccccccccccaaaaaaaaccccccccccccccccccccccccccccccccccccccccccciiinnntttxxyyyyyyyyyvvvvqqqjjjdddccc +abccccccccccccccccccccccccaaaaaaaacccccccccccccccccccccccccccccccccccccccccccciiinntttxxxwwwyyywwvvvvrqqjjjjdddccc +abcccccccccccccccccccccccccccaaaaaaccccccccccccccccccccccccccccccccccccccccccciinnntttxwwwwwyyywwvvvrrrqkkkeddcccc +abcccccccccccccccccccccccccccaaaaaaccccccccccccccccccccccccccccccccccccccccccchhnnntttsswwswwyywwrrrrrrkkkkeeecccc +abcccccccccccccccccccccccccccaaaaaacccccccccccccccccccaccccccccccccaaacccccccchhhnmmssssssswwwwwwrrrkkkkkeeeeecccc +abcccccccccccccccccccccccccccccaaacccccccccccccccccccaaccccccccccaaaaaacccccaahhhmmmmmsssssswwwwrrrkkkkkeeeeeccccc +abaacccccccccccccaccccccccccccccccccccccccccccccccaaaaacaacccccccaaaaaacaaaaaahhhhmmmmmmmmssswwwrrkkkkeeeeeacccccc +abacccccccccccccaaaaaaaaccccccccaaacccccccaaccccccaaaaaaaacccccccaaaaaacaaaaaaahhhhmmmmmmmmsssrrrrkkkeeeeeaacccccc +abaaaccccaaccccccaaaaaacccccccccaaacccaacaaaccccccccaaaacccccccccaaaaacccaaaaaaahhhhhhhmmmmlsssrrllkfeeeeaaaaacccc +abaaaccaaaaccccccaaaaaacccccccccaaaaaaaaaaaaaacccccaaaaacccccccccaaaaacccaaaaaaachhhhhgggmllsssrrllkffeaaaaaaacccc +abaacccaaaaaacccaaaaaaaacccccaaaaaaaaaaaaaaaaacccccaacaaacccccccccccccccaaaaaacccccchggggglllllllllfffaaaaaaaacccc +abaaccccaaaacccaaaaaaaaaaccccaaaaaaaaacaaaaaaaccaccaccaaacccccccccccccccaaaaaacccccccccgggglllllllffffaaaaaacccccc +abcccccaaaaacccaaaaaaaaaacccccaaaaaaaccaaaaacccaaaccccccccccccccccccccccccccaacccccccccagggglllllffffccccaaacccccc +abcccccaacaaccccccaaaaacaccaacccaaaaaaaaaaaaaccaaacccccccccccccccccccccccccccccccccccccaagggggffffffcccccccccccccc +abcccccccccccaaaaaaaaacccccaaccaaaaaaaccaaaaacaaaaccccccccccccccccccccccccccccccccccccaaaacgggfffffccccccccccccccc +abcccccccccccaaaaacaacccaaaaaaaaaaccaacccaaaaaaaacccaaccccccccccccccccccccccccccccccccccccccggfffccccccccccccaaaca +abccccccccccaaaaaaccccccaaaaaaaaacccccccccaaaaaaaaaaaacccccccccccccaaaccccccccccccccccccccccaaaccccccccccccccaaaaa +abccccccccccaaaaaaccccccccaaaacccccccccccccaaaaaaaaaaaaccccccccccccaaaaccccccccccccccccccccccaaaccccccccccccccaaaa +abcccccccccccaaaaacccccccaaaaaaccccccccccaaaaaaaaaaaaaaccccccccccccaaaaccccccccccccccccccccccccccccccccccccccaaaaa diff --git a/2022/12/part1 b/2022/12/part1 new file mode 100755 index 0000000..5b21626 --- /dev/null +++ b/2022/12/part1 @@ -0,0 +1,63 @@ +#!/usr/bin/env python + +import math + +MAP = [] +START = (0, 0) +END = (0, 0) +DISTANCES = {} + +def possible(x, y): + global MAP + + threshold = MAP[y][x] + 1 # Can't go higher than this, can always go lower + points = [(x-1,y),(x+1,y),(x,y-1),(x,y+1)] + + out = [] + for (x,y) in points: + if x < 0 or y < 0: + continue + if len(MAP) < y+1 or len(MAP[y]) < x+1: + continue + if MAP[y][x] > threshold: + continue + + out.append((x,y)) + + return out + +with open('input') as f: + for y, line in enumerate(f): + row = [] + for x, byte in enumerate(line.rstrip()): + DISTANCES[(x,y)] = math.inf + if byte == 'S': + byte = 'a' + START = (x,y) + DISTANCES[START] = 0 + elif byte == 'E': + byte = 'z' + END = (x,y) + row.append(ord(byte) - ord('a')) + MAP.append(row) + + +visited = set([]) +queue = [START] + +while len(queue) > 0: + pos = queue.pop(0) + visited.add(pos) + + for neighbour in possible(*pos): + if neighbour == END: + print(DISTANCES[pos] + 1) + quit() + + if DISTANCES[neighbour] > DISTANCES[pos] + 1: + DISTANCES[neighbour] = DISTANCES[pos] + 1 + + if neighbour not in visited and neighbour not in queue: + queue.append(neighbour) + +print("Couldn't find it!") diff --git a/2022/12/part2 b/2022/12/part2 new file mode 100755 index 0000000..85a9315 --- /dev/null +++ b/2022/12/part2 @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +import math +from collections import defaultdict + +MAP = [] +END = (0, 0) + +def possible(x, y): + global MAP + + threshold = MAP[y][x] + 1 # Can't go higher than this, can always go lower + points = [(x-1,y),(x+1,y),(x,y-1),(x,y+1)] + + out = [] + for (x,y) in points: + if x < 0 or y < 0: + continue + if len(MAP) < y+1 or len(MAP[y]) < x+1: + continue + if MAP[y][x] > threshold: + continue + out.append((x,y)) + return out + +with open('input') as f: + for y, line in enumerate(f): + row = [] + for x, byte in enumerate(line.rstrip()): + if byte == 'S': + byte = 'a' + elif byte == 'E': + byte = 'z' + END = (x,y) + row.append(ord(byte) - ord('a')) + MAP.append(row) + +def search(start): + distances = defaultdict(lambda: math.inf) + distances[start] = 0 + visited = set([]) + queue = [start] + + while len(queue) > 0: + pos = queue.pop(0) + visited.add(pos) + + for neighbour in possible(*pos): + if neighbour == END: + return distances[pos] + 1 + + if distances[neighbour] > distances[pos] + 1: + distances[neighbour] = distances[pos] + 1 + + if neighbour not in visited and neighbour not in queue: + queue.append(neighbour) + + return None # Some start positions may not have a valid path + +results = [] +for y, row in enumerate(MAP): + for x, height in enumerate(row): + if height == 0: + result = search((x,y)) + if result != None: + results.append(result) + +print(sorted(results)[0]) diff --git a/README.md b/README.md index 14b5cc9..c7dd4d5 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ a programming language I'm interested in learning more about. 2018, 2019, and 2020 were in their own separate repositories, but have been `git subtree`'d into this one - no point creating a new repository every year. -* [2022](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2022) 🌟 `22` - Python +* [2022](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2022) 🌟 `24` - Python * [2021](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2021) 🌟 ` 5` - Python * [2020](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2020) 🌟 `20` - Javascript * [2019](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2019) 🌟 `22` - Zig @@ -18,6 +18,6 @@ a programming language I'm interested in learning more about. * 2016 🌟 `16` - LISP? * 2015 🌟 ` 9` - Ruby? -Total: 🌟 `100` +Total: 🌟 `102` Maybe I'll backfill some of the old years one day.