2022 day 12

This commit is contained in:
2022-12-13 00:13:15 +00:00
parent 762f9b0700
commit 85b64b3ef6
4 changed files with 174 additions and 2 deletions

41
2022/12/input Normal file
View File

@@ -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

63
2022/12/part1 Executable file
View File

@@ -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!")

68
2022/12/part2 Executable file
View File

@@ -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])

View File

@@ -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.