Skip to content

Commit 362c1bd

Browse files
committed
2022 day 12
1 parent a8e4906 commit 362c1bd

File tree

3 files changed

+178
-0
lines changed

3 files changed

+178
-0
lines changed

2022/go/day12/day12.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
)
8+
9+
func main() {
10+
input, _ := os.ReadFile("../../input/day12.txt")
11+
height, start, end := readMap(string(input))
12+
13+
part1 := shortestPath(height, map[xy]int{}, visit{start, 0},
14+
func(dh int) bool { return dh <= 1 },
15+
func(p xy) bool { return end == p })
16+
17+
part2 := shortestPath(height, map[xy]int{}, visit{end, 0},
18+
func(dh int) bool { return dh >= -1 },
19+
func(p xy) bool { return height[p] == 'a' })
20+
21+
fmt.Printf("part1: %v\npart2: %v\n", part1, part2)
22+
}
23+
24+
func shortestPath(height map[xy]int, visits map[xy]int, loc visit, ok func(d int) bool, target func(xy) bool) int {
25+
min := 9999
26+
if target(loc.xy) {
27+
return loc.distance
28+
} else if old, visited := visits[loc.xy]; visited && old <= loc.distance {
29+
return min
30+
}
31+
visits[loc.xy] = loc.distance
32+
for _, m := range []xy{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} {
33+
next := visit{xy{loc.x + m.x, loc.y + m.y}, loc.distance + 1}
34+
if h, inside := height[next.xy]; inside {
35+
deltaH := h - height[loc.xy]
36+
if !ok(deltaH) {
37+
continue
38+
}
39+
d := shortestPath(height, visits, next, ok, target)
40+
if d < min {
41+
min = d
42+
}
43+
}
44+
}
45+
return min
46+
}
47+
48+
func readMap(input string) (height map[xy]int, start, end xy) {
49+
rows := strings.Split(input, "\n")
50+
height = map[xy]int{}
51+
for y, row := range rows {
52+
for x, c := range row {
53+
if c == 'S' {
54+
start = xy{x, y}
55+
c = 'a'
56+
} else if c == 'E' {
57+
end = xy{x, y}
58+
c = 'z'
59+
}
60+
height[xy{x, y}] = int(c)
61+
}
62+
}
63+
return height, start, end
64+
}
65+
66+
type visit struct {
67+
xy
68+
distance int
69+
}
70+
71+
type xy struct {
72+
x, y int
73+
}

2022/input/day12.txt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
abaaaaaccccccccaaaaaaaaaaccccaaaaaaaaaccccaacccccccccccccccccccccaaaaaaaaaaaccaaaaaaaaaccccccccccaaaaaaaacaaaaaaccccccccccccccccccccccccccccccccccccccccccaaaaa
2+
abaaaaaaaccccccaaaaaaaaaacccccaaaaaacccccaaaacccccccccccccaacccccaaaaaaaaaaaacaaaaaaaaacccccccccaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccccccccaaaa
3+
abacaaaaaccccccccaaaaaacccccccaaaaaacccccaaaacccccccccccccaacccaaaaaaaaaaaaaacaaaaaaaaccccccccccaaaaaaaaaaaaaaaaccccccccccccccccccccccccccaaaccccccccccccccaaaa
4+
abccaacccccccccccaaaaaaccccccaaaaaaacccccaaaacccaacccccaaaaaaaaaaaaaaaaaaaaacaaaaaaaccccccccccccacaaaaaccaaaaaaaccccccccccccccccccccccccccaaccccccccccccccaaaaa
5+
abcaaccccccccaaaaaaaaaaccccccaaacaaaccccccccccccaaaaaccaaaaaaaaaaaaaaaaaaaaaccaccaaacccccccccccccccaaaacccaaaaaaccccccccccccccccccccccccccaaacccccccccccccaaaca
6+
abcccccccccccaaaaaaaaaaaaacccccccccacccccccccccaaaaacccccaaaacaaaaaaaaaaaaccccaaaaaaccccccccaaacccccaaccccaacccccccccccccccccccccccaaaaccaaaccccccccccccccccccc
7+
abccccccccccaaaaaaccccaaaacccccccccccccccccccccaaaaaaccccaaaaaaaaaaaaaacaaacccaaaaaaaacccccaaaaaacccccccccccccccccccccccccccccccccccaaaaaaaaacccccccccccccccccc
8+
abacccccccccaaaaaacccccaaacaaacccccccccacccaaccccaaaacccaaacaaaaaaaaaaacccccccaaaaaaaacccccaaaaaaccccccccccccccccccccccccccccccccjjjjjjjaaaaaaaaaccccaacccccccc
9+
abaccccccccccaaaaaccaaaaaaaaaaccaccccccaacaaacccaaccccccaacccaaaaaaaaaaacccccccaaaaaaacccccaaaaaccccccccccccccccccccccccccccccccijjjjjjjjjhhhhhhhhhcaaaaaaccccc
10+
abaacccccccccaaaccccaaaaaaaaaaaaaccccccaaaaacccccccccccccccccccccaaaaaaacccccccaaaaaccccccccaaaaacccccccccccccccaaaaccccccccccciijjjjjjjjjhhhhhhhhhhcaaaaaccccc
11+
abaaccccccccccccccccccaaaaaacaaaaaacccccaaaaaacccccccccccaaacccccaaaccccccccccaaaaaaccccccccaacaacccccccccccccccaaaaccccccccccciiioooooojjhhhhpphhhhhaaaaaccccc
12+
abacccccccccccccccccccaaaaaaccaaaaacccaaaaaaaacccccccccccaaaaaaccaacccccccccccccccaaccccccccacccccccccccccccccccaaaaccccccccccciiioooooooooopppppphiiaaaaaacccc
13+
abaccccccccccaaaaaccccaaaaaaaaaaaaccccaaaaaaaacccccccccaaaaaaaaccccccccccccaaaaccccccccccccaaacccccccccccccccccccaaccccccccccciiinnoouuooooopppppppiiaaaaaacccc
14+
abcccccccccccaaaaaccccaaacaaaaccaacccccccaaccccccccccccaaaaaaaaccccccccccccaaaaccccccccaaacaaacccccccccccccccccccccccccccccccciiinnotuuuuoopuuuupppiiaaacaccccc
15+
abccccccccccaaaaaaccccaccccccccccccccccccaaccccccccccccaaaaaaacccccccaaacccaaaaccccccccaaaaaaaaaacccaacccccccccccccccccccccccciiinntttuuuuuuuuuuuppiiiaaccccccc
16+
abaaccccccccaaaaaaccccccccccccccccccaaaacccccccccccccccccaaaaaacccccaaaaccccaaccccccccccaaaaaaaaacccaaacaaacaaaccccccccccaaccciiinntttxxuuuuuuuuuppiiiccccccccc
17+
abaacccccccccaaaaaccccccccccccccccccaaaaccccccccaccccccccaaaaaacccccaaaaccccccccccccccccccaaaaacccccaaaaaaacaaaacccccccccaaaaiiiinnttxxxxuuyyyuvvppiiiccccccccc
18+
abaacccccccccaaaccccccccccccccccccccaaaaccaaacaaaacccccccaaccccccccccaaacccccccccccccccccaaaaaaccccccaaaaaacaaaacccccccccaaaaiiinnnttxxxxxxyyyvvppqiiiccccccccc
19+
abaccccccccccccccccccccaaccccccccccccaacccaaaaaaaacccccccccccccccccccccccccccccccccccaacaaaaaaacccaaaaaaaaccaaaccccccccaaaaahhhinnntttxxxxxyyyvvqqqiiiccccccccc
20+
abcccccccccccccccccccaaaaaaccccccccccccccccaaaaaaaaaccccccccccccccccccccccccccccccaaaaaaaaacaaacccaaaaaaaaaccccccccccccaaaaahhhnnnttttxxxxyyyvvvqqqiiiccccccccc
21+
SbcccccccccccccccccccaaaaaaccccccccccccccccaaaaaaaaaccccccccccccccccccccccccccccccaaaaacccccccacccaaaaaaaaaacccccccccccccaahhhnnntttxxxEzzzyyyvvvqqqjjjcccccccc
22+
abcccccccccccccccccccaaaaacccccccccccccaaaaaaaaaaaacccccccccccccccccccccccccccccccaaaaaaaccccccccccccaaacaaacccccccccccccahhhmmmtttxxxxxyyyyyyyvvvqqqjjjccccccc
23+
abccccccccccccccccccccaaaaacccccccccaacaaaaaaaaaaaaccccaccaaaccccccccccccccccccccaaaaaaaaccccccccccccaaacccccccccccccaaccahhhmmmtttxxxyywyyyyyyvvvqqqjjjccccccc
24+
abccccccccccccccccccccaaaaacccccccccaaaaaaaacaaacccccccaaaaaaccccaccaaaccccccccccaaaaaaaaccccccccccccaacccccccccccccaaaccchhhmmmsssxxwwwyyywyyvvvvqqqjjjccccccc
25+
abccaacccccccccccccccccccccccccccccccaaaaaaccaaacccccccaaaaaaccccaacaaacccccccccccacaaacccccccccccccccccccccccccaaaaaaaccchhhmmmssssswwwwyywwvvvvvqqqjjjdcccccc
26+
abccaaaccaaccccccccccccccccccccccccaaaaaaaaccaaccccccccaaaaaaacccaaaaaccccccccccccccaaacccccccccccccccccccccccccaaaaaaaaaahhhmmmmsssssswwywwwrvvqqqqqjjjdddcccc
27+
abccaaaaaaacccccaaaccccccccccccccccaaaaacaacccccccccccaaaaaaaaccccaaaaaaccccccccaaaccccccccccccccccccccccccccccccaaaaaaaaahhhgmmmmmsssswwwwwrrrrrqqqjjjjdddcccc
28+
abcccaaaaaacccccaaacacccccccccccccccccaaaccaacccccccccaaaaaaaaccaaaaaaaacaaccccaaaacccccccccccccccccccccccccccccccaaaaaaaccggggmmmmmmssswwwwrrrrrkjjjjjddddcccc
29+
abaaaaaaaaccccaacaaaaaccccaaacccccccccaaaccaaccccccccccccaaaccccaaaaacaaaaaccccaaaacccccccccccaacccccccccccaaccccaaaaaacccccgggggmmmllssswwrrrkkkkkjjjddddacccc
30+
abaaaaaaaaacccaaaaaaaaccccaaaacccccccccaaaaaaccccccccccccaaacccccccaacccaaacaaacaaaccccccccccaaaacccccccaaaaaacccaaaaaaacccccgggggglllsssrrrrrkkkkkkdddddaacccc
31+
abaaaaaaaaaacccaaaaaccccccaaaaccccccccccaaaaaaaccccccaaccccccccccccaaaaaaaaaaaaccccccccccccccaaaacccccccaaaaaccccaaccaaacccccccggggglllsrrrrrkkkeeedddddaaccccc
32+
abaacaaaaaaaccccaaaaacccccaaaccccccccccccaaaaaaccccaaaaccccccccccccccaaaaaaaaacccccccccccccccaaaacccccccaaaaaaacccccccaacccccccccgggglllrrrrkkkeeeeeddaaaaccccc
33+
abaaaaaacccccccaaacaacccccccccccccccccccaaaaaccccccaaaaaaccccccccaaacccaaaaacccccccccccccccccccccccccccaaaaaaaacccccccccccccccccccggfllllllkkkeeeeeccaaaaaacccc
34+
abaaaaacccccccccaacccccccccccccccccccccaaaaaacccccccaaaacccccacccaaccccaaaaaaccccccccccccccccccccccccccaaaaaaaacccccccccccaacccccccffflllllkkkeeeccccaaaaaacccc
35+
abaaaaacccccccccccccccccccccccccccaacccccccaaccccccaaaaacccccaaaaaaaccaaaaaaaaaaccccccccccccccccccccccccacaaacccccccccaaccaaccccccccfffllllkeeeecccccaacccccccc
36+
abaaaacccccccccccccccccccccccccccaaacccccccccccccccaacaacccccaaaaaaccaaaaacaaaaaccccccccccccccccccccccccccaaacccccccccaaaaaaccccccccffffffffeeeeccccccccccccccc
37+
abaaaccccccccccccccccccccccccccccaaaaacacccccccccccccccccccccaaaaaaaaaaaaccaaaaaaaaccccccaaccccccccccaaaaacccccccccccccaaaaaaacccccccfffffffeeaaccccccccccccaaa
38+
abaacccccaacaacccccccccccccaacaaaaaaaaaacccccccaaccccccccccccaaaaaaaaaaacccaaaaaaaacccccaaacaacccccccaaaaaccccccccccaaccaaaaaaccccccccafffffeaacccccccccccccaaa
39+
abaaaccccaaaaacccccccccccccaacaaaaaaaaaaccccccaaaccccccccccccaaaaaaaaaaaccccaaaaaccccccccaaaaaccccccaaaaaacccccccaacaaaaaaaaccccccccccaaacccccccccccccccccccaaa
40+
abccccccccaaaaacccccccccaaaaaaaaaaaaaacccccaaaaacaaccccccaaaaaaaaaaaaaaaaaaaaaaaaacccccaaaaaacccccccaaaaaacccccccaaaaaaaacaaccccccccccaaaccccccccccccccccaaaaaa
41+
abcccccccaaaaaacccccccccaaaaaaaaaaaaaacccccaaaaaaaaccccccaaaaacaaaaaaaaaaaaaaaaaaacccccaaaaaaaacccccaaaaaaccccccaaaaaaaaccaacccccccccccccccccccccccccccccaaaaaa

2022/java/Day12.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import java.nio.file.Files;
2+
import java.nio.file.Path;
3+
import java.util.HashMap;
4+
import java.util.LinkedList;
5+
import java.util.List;
6+
import java.util.Map;
7+
import java.util.function.Function;
8+
9+
class Day12 {
10+
11+
public static void main(String ... args) throws Exception {
12+
var map = readMap(Files.readString(Path.of("../input/day12.txt")));
13+
XY start = map.keySet().stream().filter(k -> map.get(k) == 'S').findFirst().get();
14+
XY end = map.keySet().stream().filter(k -> map.get(k) == 'E').findFirst().get();
15+
map.put(start, (byte) 'a');
16+
map.put(end, (byte) 'z');
17+
18+
System.out.printf("part1: %d\n",
19+
shortestPath(map, new HashMap<>(), start, dh -> dh <= 1, p -> p.equals(end)));
20+
System.out.printf("part2: %d\n",
21+
shortestPath(map, new HashMap<>(), end, dh -> dh >= -1, p -> map.get(p) == 'a'));
22+
}
23+
24+
static int shortestPath(Map<XY,Byte> map, Map<XY,Integer> visits, XY start,
25+
Function<Byte,Boolean> ok, Function<XY,Boolean> target) {
26+
var visited = new HashMap<XY,Integer>();
27+
var toVisit = new LinkedList<Visit>();
28+
toVisit.add(new Visit(start, 0));
29+
while(!toVisit.isEmpty()) {
30+
var c = toVisit.removeFirst();
31+
if (!visited.containsKey(c.xy) || visited.get(c.xy) > c.distance) { // not visited or longer distance
32+
visited.put(c.xy, c.distance); // visit
33+
moves.stream().map(m -> c.move(m)) // next location
34+
.filter(n -> map.containsKey(n.xy)) // is inside map
35+
.filter(n -> ok.apply((byte) (map.get(n.xy) - map.get(c.xy)))) // ok to climb
36+
.forEach(n -> toVisit.add(n)); // add to visit list
37+
}
38+
}
39+
40+
return visited.keySet().stream()
41+
.filter(p -> target.apply(p)) // match or target
42+
.map(p -> visited.get(p)) // map to distance
43+
.sorted().findFirst().get(); // get minimum
44+
}
45+
46+
static Map<XY,Byte> readMap(String input) {
47+
Map<XY,Byte> map = new HashMap<>();
48+
var lines = input.lines().toList();
49+
for (int y = 0; y < lines.size(); y++) {
50+
for (int x = 0; x < lines.get(y).length(); x++) {
51+
map.put(new XY(x,y), (byte) lines.get(y).charAt(x));
52+
}
53+
}
54+
return map;
55+
}
56+
57+
record Visit(XY xy, int distance) {
58+
Visit move(XY v) { return new Visit(new XY(xy.x+v.x, xy.y+v.y), distance + 1); }
59+
}
60+
61+
record XY(int x, int y) {}
62+
63+
static List<XY> moves = List.of(new XY(1,0), new XY(-1,0), new XY(0,1), new XY(0,-1));
64+
}

0 commit comments

Comments
 (0)