2022 day 12
This commit is contained in:
41
2022/12/input
Normal file
41
2022/12/input
Normal 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
63
2022/12/part1
Executable 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
68
2022/12/part2
Executable 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])
|
@@ -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.
|
||||
|
Reference in New Issue
Block a user