test_input = """
forward 5
down 5
forward 8
up 3
down 8
forward 2
"""

puzzle_input = """
forward 7
down 2
forward 7
down 6
forward 1
forward 7
down 3
up 5
forward 7
forward 6
down 8
down 1
up 5
up 1
down 2
forward 8
forward 3
down 8
down 9
down 1
forward 4
down 8
down 7
forward 3
up 5
up 3
forward 9
forward 5
forward 5
down 9
up 2
down 4
up 4
down 9
forward 7
down 9
up 7
forward 4
down 2
down 6
up 3
down 2
down 4
up 5
forward 7
up 8
down 4
forward 8
down 5
forward 1
forward 3
up 9
forward 5
down 4
forward 6
forward 2
up 3
down 5
down 6
forward 8
up 6
up 9
down 8
down 2
down 6
forward 2
forward 8
forward 1
forward 5
forward 3
down 8
down 5
forward 3
up 7
down 9
up 9
forward 7
forward 6
forward 4
down 5
forward 1
down 9
forward 9
forward 6
down 8
down 5
forward 5
forward 4
forward 3
up 6
up 7
forward 2
up 2
up 9
forward 8
up 3
forward 8
down 8
forward 1
forward 7
forward 4
down 5
forward 8
down 2
down 2
down 3
forward 3
forward 3
up 3
forward 4
up 9
up 8
forward 1
down 8
up 6
down 5
up 3
up 2
forward 1
up 8
down 7
up 5
down 2
forward 5
down 3
down 1
forward 2
forward 6
forward 7
forward 1
forward 5
forward 4
down 9
forward 6
down 9
up 8
forward 9
forward 5
up 2
up 7
up 2
down 1
down 7
down 1
forward 2
down 8
down 3
forward 1
down 5
forward 7
forward 5
forward 6
up 6
forward 6
forward 1
down 2
forward 5
down 7
up 1
down 5
down 4
down 8
up 2
down 2
up 6
forward 2
down 2
up 9
down 7
down 3
down 6
forward 5
up 5
forward 2
forward 7
down 9
up 3
forward 4
forward 4
down 6
down 2
down 4
forward 6
down 2
down 8
up 2
forward 9
down 8
forward 4
down 2
up 4
down 6
forward 3
forward 2
forward 7
down 7
forward 3
forward 7
down 9
up 6
down 4
forward 4
down 6
down 8
down 4
forward 3
up 5
up 4
up 9
forward 9
down 1
forward 3
forward 9
up 3
down 5
forward 2
down 9
down 9
forward 1
forward 4
forward 8
forward 9
down 4
forward 3
down 3
forward 9
down 1
down 3
down 9
down 3
down 2
down 1
up 2
down 3
up 7
forward 7
down 9
up 6
down 1
down 7
down 7
up 7
forward 8
down 1
down 7
down 8
up 4
down 6
down 7
forward 5
down 9
forward 2
down 6
down 8
down 5
down 4
forward 8
down 4
forward 8
down 3
down 6
forward 6
forward 1
up 5
down 2
down 2
forward 7
forward 1
up 3
down 6
down 3
down 9
up 6
forward 4
down 1
forward 4
up 3
forward 6
down 7
down 2
up 3
down 1
up 7
down 7
forward 5
up 9
up 1
up 2
forward 4
forward 9
up 3
down 8
up 2
down 9
forward 8
up 2
down 5
up 5
down 2
up 8
down 6
down 8
up 7
forward 9
forward 6
forward 5
forward 8
forward 7
down 2
forward 1
forward 6
down 3
down 7
up 1
forward 7
up 7
down 2
down 9
up 4
forward 2
down 3
up 8
up 3
down 9
down 2
forward 4
forward 9
forward 8
forward 2
up 2
forward 3
forward 8
down 2
down 4
up 8
up 2
forward 4
forward 7
up 8
forward 8
forward 1
forward 9
down 9
up 3
forward 9
down 5
down 9
down 2
forward 1
forward 6
forward 3
up 7
down 8
down 2
up 6
down 5
forward 4
up 7
down 5
down 3
forward 5
forward 5
up 4
down 7
down 5
up 1
down 4
down 6
forward 6
forward 3
down 9
forward 6
forward 4
down 8
up 5
down 7
forward 6
forward 7
down 9
forward 3
forward 3
forward 4
down 6
forward 2
forward 9
up 2
forward 7
up 5
forward 6
down 8
down 7
forward 1
down 6
forward 3
down 9
forward 7
forward 2
forward 1
down 9
down 2
up 8
down 1
down 3
up 6
down 5
up 2
down 2
down 8
forward 7
down 8
forward 6
up 5
down 8
down 4
down 1
forward 1
forward 9
down 3
forward 9
up 2
down 2
forward 9
up 2
up 2
down 8
down 1
up 4
down 9
down 6
up 7
down 6
forward 7
forward 3
forward 9
forward 2
down 9
down 8
down 5
forward 4
forward 1
forward 3
forward 3
forward 1
forward 6
forward 7
down 7
down 1
up 4
up 2
forward 9
up 7
down 1
forward 5
down 8
forward 3
down 9
up 4
up 1
forward 7
down 1
forward 4
up 6
down 9
forward 2
forward 7
down 1
forward 2
forward 1
down 2
forward 6
down 4
up 7
down 6
forward 1
down 9
up 8
up 6
forward 4
down 5
up 8
down 5
up 9
forward 1
forward 6
down 4
up 5
forward 4
forward 2
down 6
forward 9
down 7
down 2
forward 1
up 2
forward 4
forward 4
forward 7
down 5
up 1
down 7
down 1
forward 3
forward 6
forward 7
down 5
down 4
down 2
down 3
up 3
forward 7
down 3
up 2
forward 7
down 9
up 4
forward 9
forward 4
forward 2
down 9
forward 1
down 5
forward 3
forward 5
up 7
down 9
up 7
down 5
down 2
up 5
up 1
forward 8
forward 3
up 5
forward 2
down 2
forward 5
forward 3
forward 4
up 4
forward 3
up 4
forward 1
down 2
forward 5
down 9
forward 8
forward 2
forward 5
forward 1
up 3
up 8
forward 2
forward 9
down 7
up 5
up 2
forward 1
forward 4
up 4
forward 5
down 5
forward 5
down 2
down 8
forward 4
down 3
forward 7
down 7
forward 6
down 9
down 2
up 4
up 5
down 2
down 7
forward 3
down 1
down 5
down 6
forward 8
forward 7
down 3
forward 4
forward 8
forward 2
down 8
down 3
forward 8
down 2
up 2
forward 3
up 2
down 7
down 4
forward 8
forward 7
down 9
forward 7
down 8
up 3
forward 1
up 5
forward 6
down 7
forward 8
forward 3
forward 1
forward 5
down 8
up 8
forward 9
down 7
up 8
up 8
forward 9
up 6
forward 2
down 8
forward 6
down 6
down 6
forward 8
up 9
forward 9
down 8
down 8
forward 3
forward 3
down 8
up 7
down 1
forward 5
up 6
forward 6
up 8
down 7
down 3
down 4
forward 7
down 2
forward 4
forward 6
down 2
down 6
up 2
down 9
down 8
forward 6
up 8
up 4
forward 1
forward 2
down 8
forward 6
down 2
down 7
down 1
down 2
forward 9
forward 5
down 2
down 8
down 9
up 6
forward 6
up 2
down 9
down 4
down 9
up 7
forward 2
up 9
down 7
forward 2
down 7
up 6
down 3
up 1
down 8
down 4
forward 1
up 5
up 4
down 2
down 8
forward 8
forward 7
up 1
down 8
forward 2
forward 7
down 4
forward 4
down 3
down 7
forward 8
down 7
down 3
down 3
forward 8
forward 8
up 1
forward 8
forward 6
down 9
up 1
down 7
down 7
forward 7
forward 7
up 5
down 7
down 6
down 6
forward 8
down 3
forward 8
down 8
forward 7
forward 2
up 6
down 6
down 8
forward 1
forward 8
down 9
down 7
up 5
down 1
forward 6
down 9
forward 5
up 2
up 9
down 6
down 8
down 6
up 1
forward 7
down 9
up 2
forward 3
down 7
up 5
forward 3
forward 8
up 2
forward 1
down 6
down 7
up 4
down 5
up 8
forward 9
forward 5
up 7
down 3
forward 2
up 7
up 2
down 3
up 9
down 9
down 8
up 8
down 6
forward 9
up 7
forward 4
forward 7
up 7
down 6
forward 5
up 2
up 4
down 1
down 2
down 9
forward 5
forward 3
forward 9
up 7
forward 7
down 5
down 2
up 9
forward 4
forward 4
up 5
up 3
forward 5
forward 9
forward 4
forward 8
down 2
up 4
down 1
forward 9
forward 9
up 7
down 3
forward 2
forward 4
down 6
up 1
forward 6
down 4
up 9
down 4
forward 3
down 9
up 9
down 8
up 6
forward 9
forward 1
forward 2
up 2
forward 8
forward 9
forward 3
forward 5
down 5
down 7
forward 7
forward 5
down 3
up 2
forward 4
down 3
up 6
down 6
up 6
forward 1
forward 2
down 5
down 8
down 3
forward 5
up 4
forward 6
forward 9
forward 6
forward 1
forward 4
up 1
forward 3
forward 3
up 3
forward 9
forward 1
forward 7
forward 8
forward 1
forward 9
forward 7
up 9
forward 9
up 4
down 4
up 9
down 5
down 8
down 3
forward 6
down 7
forward 5
forward 6
forward 8
forward 7
down 7
down 5
forward 4
down 6
down 4
down 6
down 1
forward 3
down 3
down 7
forward 6
forward 3
up 2
forward 1
forward 8
down 9
down 3
down 3
up 6
down 7
down 3
forward 2
down 7
down 2
forward 1
down 7
down 3
forward 9
down 4
down 3
forward 9
up 2
up 4
forward 4
down 4
up 2
down 2
forward 8
down 1
up 9
down 5
down 7
forward 3
forward 9
forward 7
forward 1
forward 7
forward 1
forward 7
up 7
down 6
forward 6
forward 4
forward 6
up 3
down 5
down 5
down 3
down 6
down 3
down 3
up 2
down 4
up 8
down 4
up 2
down 7
forward 9
up 9
down 1
forward 8
forward 7
forward 6
forward 8
up 6
up 6
down 5
forward 6
down 3
forward 6
forward 9
down 2
down 6
down 4
down 5
forward 7
forward 4
up 3
down 6
down 6
forward 1
forward 4
down 6
up 3
forward 1
down 3
down 7
down 4
down 8
down 8
up 8
down 2
up 8
down 3
down 3
forward 3
down 3
down 7
up 6
forward 8
down 4
forward 1
down 7
down 3
forward 5
forward 8
up 1
forward 2
down 7
down 7
forward 1
up 7
down 3
up 3
forward 5
forward 9
down 3
down 7
down 5
forward 7
"""

def parse_positions(pos):
    lines =  [line.split() for line in pos.strip().splitlines()]
    return [(i, int(j)) for i, j in lines]

def move(positions):
    x, y = 0, 0
    for dir, X in positions:
        if dir == 'forward':
            x += X
        elif dir == 'down':
            y += X
        elif dir == 'up':
            y -= X
        else:
            raise ValueError(f"Invalid direction {dir}")

    return x, y

def move2(positions):
    x, y, aim = 0, 0, 0

    for dir, X in positions:
        if dir == 'forward':
            x += X
            y += aim*X
        elif dir == 'down':
            aim += X
        elif dir == 'up':
            aim -= X
        else:
            raise ValueError(f"Invalid direction {dir}")

    return x, y

print("Day 2")
print("Part 1")
print("Test input")
test_positions = parse_positions(test_input)
print(test_positions)
test_x, test_y = move(test_positions)
print(test_x, test_y)
print(test_x*test_y)

print("Puzzle input")
positions = parse_positions(puzzle_input)
# print(positions)
x, y = move(positions)
print(x, y)
print(x*y)

print("Part 2")
print("Test input")
test_positions = parse_positions(test_input)
test_x, test_y = move2(test_positions)
print(test_x, test_y)
print(test_x*test_y)

print("Puzzle input")
x, y = move2(positions)
print(x, y)
print(x*y)
