Sean McLemon | Advent of Code

Home | Czech | Blog | GitHub | Advent Of Code | Notes


2016-12-01 - No Time for a Taxicab

(original .ipynb)
puzzle_input_str = open("puzzle_input/day1.txt").read()


def left(dr, dc):
    return (-dc, dr)


def right(dr, dc):
    return (dc, -dr)


def turn(direction, dr, dc):
    if direction == "R":
        return right(dr, dc)
    else:
        return left(dr, dc)

    
def parse_input(input_str):
    for line in input_str.split(", "):
        yield line[0], int(line[1:])
    

def part_one(input_str):
    r, c = 0, 0
    dr, dc = -1, 0

    for direction, distance in parse_input(input_str):
        dr, dc = turn(direction, dr, dc)
        r += (distance * dr)
        c += (distance * dc)
        
    return abs(r) + abs(c)


assert 5 == part_one("R2, L3")
assert 2 == part_one("R2, R2, R2")
assert 12 == part_one("R5, L5, R5, R3")

print("part one:", part_one(puzzle_input_str))
part one: 234
def part_two(input_str):
    commands = input_str.split(", ")
    r, c = 0, 0
    dr, dc = -1, 0
    visited = set()
    
    for direction, distance in parse_input(input_str):
        dr, dc = turn(direction, dr, dc)
        while distance > 0:
            distance -= 1
            r += dr
            c += dc
            if (r,c) in visited:
                return abs(r) + abs(c)
            visited.add((r,c))
    
    raise Exception("No point was hit more than once")

    
assert 4 == part_two("R8, R4, R4, R8")

print("part two:", part_two(puzzle_input_str))
part two: 113