Created
December 20, 2017 02:22
-
-
Save kageru/f240c28be58e7c6f059463554d11b013 to your computer and use it in GitHub Desktop.
Day 19 of the Advent of Code in nim (both parts)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sequtils | |
import future | |
import nre except toSeq | |
type | |
Direction = enum | |
up = 0, left = 1, down = 2, right = 3 | |
Grid = seq[seq[char]] | |
const directions = [up, left, down, right] | |
proc indexOf(hay: seq[char], needle: char): int = | |
# It almost seems weird that this doesn’t already exist... | |
# It probably does, and I just missed it. Whatever, no error handling because :lul: | |
var i = 0 | |
while hay[i] != needle: | |
i += 1 | |
return i | |
proc gridGet(g: Grid, p: array[2, int]): char = | |
return g[p[0]][p[1]] | |
proc changePosition(current: array[2, int], dir: Direction): array[2, int] = | |
if dir == up: | |
return [current[0]-1, current[1]] | |
if dir == left: | |
return [current[0], current[1]-1] | |
if dir == down: | |
return [current[0]+1, current[1]] | |
if dir == right: | |
return [current[0], current[1]+1] | |
proc oppositeDirection(d: Direction): Direction = | |
# the better solution would be something like | |
# mod(getEnumOrdinal(direction, $direction) + 2, 4) | |
# but that doesn’t quite work because I’m bad at this whole thing | |
case d | |
of up: return down | |
of left: return right | |
of down: return up | |
of right: return left | |
else: discard | |
proc changeDirection(g: Grid, pos: array[2, int], direction: Direction): Direction = | |
for d in directions: | |
if d != oppositeDirection(direction) and gridGet(g, changePosition(pos, d)) != ' ': | |
return d | |
let grid = lc[toSeq(line.items()) | (line <- lines("input.txt")), seq[char]] | |
var position = [0, indexOf(grid[0], '|')] | |
var direction = down | |
var done = false | |
var visited = "" | |
var newchar: char | |
var steps = 1 | |
while not done: | |
#echo position[0], ", ", position[1] | |
#echo direction | |
var newpos = changePosition(position, direction) | |
newchar = gridGet(grid, newpos) | |
#echo(newchar) | |
if newchar in ['|', '-']: | |
inc steps | |
elif newchar == '+': | |
inc steps | |
direction = changeDirection(grid, newpos, direction) | |
elif nre.contains($newchar, re"[A-Z]"): | |
inc steps | |
visited &= newchar | |
elif newchar == ' ': | |
done = true | |
position = newpos | |
echo(visited) | |
echo(steps) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment