Day 10: Hoof It
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
Nim
As many others today, I’ve solved part 2 first and then fixed a ‘bug’ to solve part 1. =)
type Vec2 = tuple[x,y:int] const Adjacent = [(x:1,y:0),(-1,0),(0,1),(0,-1)] proc path(start: Vec2, grid: seq[string]): tuple[ends, trails: int] = var queue = @[@[start]] var endNodes: HashSet[Vec2] while queue.len > 0: let path = queue.pop() let head = path[^1] let c = grid[head.y][head.x] if c == '9': inc result.trails endNodes.incl head continue for d in Adjacent: let nd = (x:head.x + d.x, y:head.y + d.y) if nd.x < 0 or nd.y < 0 or nd.x > grid[0].high or nd.y > grid.high: continue if grid[nd.y][nd.x].ord - c.ord != 1: continue queue.add path & nd result.ends = endNodes.len proc solve(input: string): AOCSolution[int, int] = let grid = input.splitLines() var trailstarts: seq[Vec2] for y, line in grid: for x, c in line: if c == '0': trailstarts.add (x,y) for start in trailstarts: let (ends, trails) = start.path(grid) result.part1 += ends result.part2 += trails
Codeberg Repo