diff options
| author | An0nSaiko <porfeas12@gmail.com> | 2022-12-12 16:32:32 +0200 |
|---|---|---|
| committer | An0nSaiko <porfeas12@gmail.com> | 2022-12-12 16:32:32 +0200 |
| commit | 1cb3dcd5ee41d5ce3646c1165cb875629cc4d6e2 (patch) | |
| tree | 3f9187b04d94f6b79c0a16f0682aeae2ca3f8470 | |
| parent | Day 11 (diff) | |
| download | aoc22-1cb3dcd5ee41d5ce3646c1165cb875629cc4d6e2.tar.gz aoc22-1cb3dcd5ee41d5ce3646c1165cb875629cc4d6e2.zip | |
Day 12
| -rw-r--r-- | day12/example.txt | 5 | ||||
| -rw-r--r-- | day12/input.txt | 41 | ||||
| -rw-r--r-- | day12/solution.nim | 80 |
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 @@ | |||
| 1 | Sabqponm | ||
| 2 | abcryxxl | ||
| 3 | accszExk | ||
| 4 | acctuvwj | ||
| 5 | abdefghi | ||
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 @@ | |||
| 1 | abccccccccccccccccccaaaaaaaaacccccccccccccccccccccccccccccccccccccaaaa | ||
| 2 | abcccccccccccccccaaaaaaaaaaacccccccccccccccccccccccccccccccccccccaaaaa | ||
| 3 | abcaaccaacccccccccaaaaaaaaaacccccccccccccccccccccaaacccccccccccccaaaaa | ||
| 4 | abcaaaaaaccccccccaaaaaaaaaaaaacccccccccccccccccccaacccccccccccccaaaaaa | ||
| 5 | abcaaaaaacccaaacccccaaaaaaaaaaaccccccccccccccccccaaaccccccccccccccccaa | ||
| 6 | abaaaaaaacccaaaaccccaaaaaacaaaacccccccccccaaaacjjjacccccccccccccccccca | ||
| 7 | abaaaaaaaaccaaaaccccaaaaaaccccccaccccccccccaajjjjjkkcccccccccccccccccc | ||
| 8 | abaaaaaaaaccaaacccccccaaaccccccaaccccccccccajjjjjjkkkaaacccaaaccaccccc | ||
| 9 | abccaaacccccccccccccccaaccccaaaaaaaacccccccjjjjoookkkkaacccaaaaaaccccc | ||
| 10 | abcccaacccccccccccccccccccccaaaaaaaaccccccjjjjoooookkkkcccccaaaaaccccc | ||
| 11 | abcccccccaacccccccccccccccccccaaaacccccccijjjoooooookkkkccaaaaaaaccccc | ||
| 12 | abccaaccaaaccccccccccccccccccaaaaacccccciijjooouuuoppkkkkkaaaaaaaacccc | ||
| 13 | abccaaaaaaaccccccccccaaaaacccaacaaaccciiiiiooouuuuupppkkklllaaaaaacccc | ||
| 14 | abccaaaaaacccccccccccaaaaacccacccaaciiiiiiqooouuuuuupppkllllllacaccccc | ||
| 15 | abcccaaaaaaaacccccccaaaaaaccccaacaiiiiiqqqqoouuuxuuupppppplllllccccccc | ||
| 16 | abccaaaaaaaaaccaaaccaaaaaaccccaaaaiiiiqqqqqqttuxxxuuuppppppplllccccccc | ||
| 17 | abccaaaaaaaacccaaaaaaaaaaacccaaaahiiiqqqttttttuxxxxuuuvvpppplllccccccc | ||
| 18 | abcaaaaaaacccaaaaaaaaaaacccccaaaahhhqqqqtttttttxxxxuuvvvvvqqlllccccccc | ||
| 19 | abcccccaaaccaaaaaaaaaccccccccacaahhhqqqttttxxxxxxxyyyyyvvvqqlllccccccc | ||
| 20 | abcccccaaaccaaaaaaaacccccccccccaahhhqqqtttxxxxxxxyyyyyyvvqqqlllccccccc | ||
| 21 | SbcccccccccccaaaaaaaaaccccccccccchhhqqqtttxxxxEzzzyyyyvvvqqqmmlccccccc | ||
| 22 | abcccccccccccaaaaaaaacccaacccccccchhhppptttxxxxyyyyyvvvvqqqmmmcccccccc | ||
| 23 | abccccccccccaaaaaaaaaaccaacccccccchhhpppptttsxxyyyyyvvvqqqmmmccccccccc | ||
| 24 | abcaacccccccaaaaaaacaaaaaaccccccccchhhppppsswwyyyyyyyvvqqmmmmccccccccc | ||
| 25 | abaaaacccccccaccaaaccaaaaaaacccccccchhhpppsswwyywwyyyvvqqmmmddcccccccc | ||
| 26 | abaaaaccccccccccaaaccaaaaaaacccccccchhhpppsswwwwwwwwwvvqqqmmdddccccccc | ||
| 27 | abaaaacccccccccaaaccaaaaaaccccccccccgggpppsswwwwrrwwwwvrqqmmdddccccccc | ||
| 28 | abccccccaaaaaccaaaacaaaaaaccccccaacccggpppssswwsrrrwwwvrrqmmdddacccccc | ||
| 29 | abccccccaaaaaccaaaacccccaaccccaaaaaacggpppssssssrrrrrrrrrnmmdddaaccccc | ||
| 30 | abcccccaaaaaaccaaaccccccccccccaaaaaacggppossssssoorrrrrrrnnmdddacccccc | ||
| 31 | abcccccaaaaaaccccccccaaaaccccccaaaaacgggoooossoooonnnrrnnnnmddaaaacccc | ||
| 32 | abccccccaaaaaccccccccaaaacccccaaaaaccgggoooooooooonnnnnnnnndddaaaacccc | ||
| 33 | abccccccaaaccccccccccaaaacccccaaaaacccgggoooooooffennnnnnnedddaaaacccc | ||
| 34 | abcccccccccccccccccccaaacccccccaacccccggggffffffffeeeeeeeeeedaaacccccc | ||
| 35 | abccccccccccccccccccaaacccccaccaaccccccggfffffffffeeeeeeeeeecaaacccccc | ||
| 36 | abccccccccccccccccccaaaacccaaaaaaaaaccccfffffffaaaaaeeeeeecccccccccccc | ||
| 37 | abccccccccaacaaccccaaaaaacaaaaaaaaaaccccccccccaaaccaaaaccccccccccccccc | ||
| 38 | abccccccccaaaaacccaaaaaaaaaaacaaaaccccccccccccaaaccccaaccccccccccaaaca | ||
| 39 | abcccccccaaaaaccccaaaaaaaaaaacaaaaacccccccccccaaaccccccccccccccccaaaaa | ||
| 40 | abcccccccaaaaaacccaaaaaaaaaacaaaaaacccccccccccaaccccccccccccccccccaaaa | ||
| 41 | abcccccccccaaaaccaaaaaaaaaaaaaaccaaccccccccccccccccccccccccccccccaaaaa | ||
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 @@ | |||
| 1 | import strutils | ||
| 2 | import sequtils | ||
| 3 | import sugar | ||
| 4 | import sets | ||
| 5 | |||
| 6 | type | ||
| 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 | |||
| 16 | proc 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 | |||
| 38 | let dpos = [[0, 1], [1, 0], [0, -1], [-1, 0]] | ||
| 39 | var part1 = true | ||
| 40 | proc 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 | |||
| 76 | let content = readFile("./input.txt").strip().splitLines() | ||
| 77 | let input = parseFile(content) | ||
| 78 | echo bfs(input) | ||
| 79 | part1 = false | ||
| 80 | echo bfs(input) | ||
