aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAn0nSaiko <porfeas12@gmail.com>2022-12-12 16:32:32 +0200
committerAn0nSaiko <porfeas12@gmail.com>2022-12-12 16:32:32 +0200
commit1cb3dcd5ee41d5ce3646c1165cb875629cc4d6e2 (patch)
tree3f9187b04d94f6b79c0a16f0682aeae2ca3f8470
parentDay 11 (diff)
downloadaoc22-1cb3dcd5ee41d5ce3646c1165cb875629cc4d6e2.tar.gz
aoc22-1cb3dcd5ee41d5ce3646c1165cb875629cc4d6e2.zip
Day 12
-rw-r--r--day12/example.txt5
-rw-r--r--day12/input.txt41
-rw-r--r--day12/solution.nim80
3 files changed, 126 insertions, 0 deletions
diff --git a/day12/example.txt b/day12/example.txt
new file mode 100644
index 0000000..86e9cac
--- /dev/null
+++ b/day12/example.txt
@@ -0,0 +1,5 @@
1Sabqponm
2abcryxxl
3accszExk
4acctuvwj
5abdefghi
diff --git a/day12/input.txt b/day12/input.txt
new file mode 100644
index 0000000..bac8753
--- /dev/null
+++ b/day12/input.txt
@@ -0,0 +1,41 @@
1abccccccccccccccccccaaaaaaaaacccccccccccccccccccccccccccccccccccccaaaa
2abcccccccccccccccaaaaaaaaaaacccccccccccccccccccccccccccccccccccccaaaaa
3abcaaccaacccccccccaaaaaaaaaacccccccccccccccccccccaaacccccccccccccaaaaa
4abcaaaaaaccccccccaaaaaaaaaaaaacccccccccccccccccccaacccccccccccccaaaaaa
5abcaaaaaacccaaacccccaaaaaaaaaaaccccccccccccccccccaaaccccccccccccccccaa
6abaaaaaaacccaaaaccccaaaaaacaaaacccccccccccaaaacjjjacccccccccccccccccca
7abaaaaaaaaccaaaaccccaaaaaaccccccaccccccccccaajjjjjkkcccccccccccccccccc
8abaaaaaaaaccaaacccccccaaaccccccaaccccccccccajjjjjjkkkaaacccaaaccaccccc
9abccaaacccccccccccccccaaccccaaaaaaaacccccccjjjjoookkkkaacccaaaaaaccccc
10abcccaacccccccccccccccccccccaaaaaaaaccccccjjjjoooookkkkcccccaaaaaccccc
11abcccccccaacccccccccccccccccccaaaacccccccijjjoooooookkkkccaaaaaaaccccc
12abccaaccaaaccccccccccccccccccaaaaacccccciijjooouuuoppkkkkkaaaaaaaacccc
13abccaaaaaaaccccccccccaaaaacccaacaaaccciiiiiooouuuuupppkkklllaaaaaacccc
14abccaaaaaacccccccccccaaaaacccacccaaciiiiiiqooouuuuuupppkllllllacaccccc
15abcccaaaaaaaacccccccaaaaaaccccaacaiiiiiqqqqoouuuxuuupppppplllllccccccc
16abccaaaaaaaaaccaaaccaaaaaaccccaaaaiiiiqqqqqqttuxxxuuuppppppplllccccccc
17abccaaaaaaaacccaaaaaaaaaaacccaaaahiiiqqqttttttuxxxxuuuvvpppplllccccccc
18abcaaaaaaacccaaaaaaaaaaacccccaaaahhhqqqqtttttttxxxxuuvvvvvqqlllccccccc
19abcccccaaaccaaaaaaaaaccccccccacaahhhqqqttttxxxxxxxyyyyyvvvqqlllccccccc
20abcccccaaaccaaaaaaaacccccccccccaahhhqqqtttxxxxxxxyyyyyyvvqqqlllccccccc
21SbcccccccccccaaaaaaaaaccccccccccchhhqqqtttxxxxEzzzyyyyvvvqqqmmlccccccc
22abcccccccccccaaaaaaaacccaacccccccchhhppptttxxxxyyyyyvvvvqqqmmmcccccccc
23abccccccccccaaaaaaaaaaccaacccccccchhhpppptttsxxyyyyyvvvqqqmmmccccccccc
24abcaacccccccaaaaaaacaaaaaaccccccccchhhppppsswwyyyyyyyvvqqmmmmccccccccc
25abaaaacccccccaccaaaccaaaaaaacccccccchhhpppsswwyywwyyyvvqqmmmddcccccccc
26abaaaaccccccccccaaaccaaaaaaacccccccchhhpppsswwwwwwwwwvvqqqmmdddccccccc
27abaaaacccccccccaaaccaaaaaaccccccccccgggpppsswwwwrrwwwwvrqqmmdddccccccc
28abccccccaaaaaccaaaacaaaaaaccccccaacccggpppssswwsrrrwwwvrrqmmdddacccccc
29abccccccaaaaaccaaaacccccaaccccaaaaaacggpppssssssrrrrrrrrrnmmdddaaccccc
30abcccccaaaaaaccaaaccccccccccccaaaaaacggppossssssoorrrrrrrnnmdddacccccc
31abcccccaaaaaaccccccccaaaaccccccaaaaacgggoooossoooonnnrrnnnnmddaaaacccc
32abccccccaaaaaccccccccaaaacccccaaaaaccgggoooooooooonnnnnnnnndddaaaacccc
33abccccccaaaccccccccccaaaacccccaaaaacccgggoooooooffennnnnnnedddaaaacccc
34abcccccccccccccccccccaaacccccccaacccccggggffffffffeeeeeeeeeedaaacccccc
35abccccccccccccccccccaaacccccaccaaccccccggfffffffffeeeeeeeeeecaaacccccc
36abccccccccccccccccccaaaacccaaaaaaaaaccccfffffffaaaaaeeeeeecccccccccccc
37abccccccccaacaaccccaaaaaacaaaaaaaaaaccccccccccaaaccaaaaccccccccccccccc
38abccccccccaaaaacccaaaaaaaaaaacaaaaccccccccccccaaaccccaaccccccccccaaaca
39abcccccccaaaaaccccaaaaaaaaaaacaaaaacccccccccccaaaccccccccccccccccaaaaa
40abcccccccaaaaaacccaaaaaaaaaacaaaaaacccccccccccaaccccccccccccccccccaaaa
41abcccccccccaaaaccaaaaaaaaaaaaaaccaaccccccccccccccccccccccccccccccaaaaa
diff --git a/day12/solution.nim b/day12/solution.nim
new file mode 100644
index 0000000..20f42b3
--- /dev/null
+++ b/day12/solution.nim
@@ -0,0 +1,80 @@
1import strutils
2import sequtils
3import sugar
4import sets
5
6type
7 Position = tuple
8 row: int
9 col: int
10
11 Input = tuple
12 grid: seq[seq[int]]
13 S: Position
14 E: Position
15
16proc parseFile(content: seq[string]): Input =
17 var content = content
18 for r, row in content:
19 for c, e in row:
20 case e:
21 of 'S':
22 result.S = (r, c)
23 content[r][c] = chr(ord('a') - 1)
24 of 'E':
25 result.E = (r, c)
26 content[r][c] = chr(ord('z') + 1)
27 else:
28 discard
29
30 result.grid = map(
31 content,
32 (line) => map(
33 line,
34 (ch) => ord(ch) - ord('a')
35 )
36 )
37
38let dpos = [[0, 1], [1, 0], [0, -1], [-1, 0]]
39var part1 = true
40proc bfs(input: Input): int =
41 var q: seq[(Position, int)]
42 var visited: HashSet[Position]
43 if part1:
44 q = @[(input.S, 0)]
45 visited = toHashSet(@[input.S])
46 else:
47 q = @[(input.E, 0)]
48 visited = toHashSet(@[input.E])
49
50 let H = input.grid.len()
51 let W = input.grid[0].len()
52
53 while q.len() > 0:
54 let cur = q[0][0]
55 let pathLen = q[0][1]
56 let curH = input.grid[cur.row][cur.col]
57 q.delete(0)
58
59 if part1:
60 if cur == input.E:
61 return pathLen
62 else:
63 if curH == 0:
64 return pathLen
65
66 for d in dpos:
67 let next = Position((cur.row + d[0], cur.col + d[1]))
68 if next.row < 0 or next.row >= H or next.col < 0 or next.col >= W:
69 continue
70 let nextH = input.grid[next.row][next.col]
71 let gap = if part1: (nextH - curH) else: (curH - nextH)
72 if gap <= 1 and next notin visited:
73 q.add((next, pathLen+1))
74 visited.incl(next)
75
76let content = readFile("./input.txt").strip().splitLines()
77let input = parseFile(content)
78echo bfs(input)
79part1 = false
80echo bfs(input)