#!/usr/bin/env python import re import argparse import copy DIRECTIONS = [ {'dir': 'N', 'V': 1, "H": 0 }, {'dir': 'W', 'V': 0, "H": -1 }, {'dir': 'S', 'V': -1, "H": 0 }, {'dir': 'E', 'V': 0, "H": 1 } ] DIRECTION_CHANGE = { 'L': -1, 'R': 1 } MAPS_VISITED = [] def load_file(filename): with open(filename) as f: data = f.read() return data def main(args): DIRECTION_INDEX = 0 MAP_POSITION_B = [0, 0] MAP_POSITION_A = None TWICE = None MAPS_VISITED = {0: [0]} for INDICE in load_file(args.input).split(','): INDICE = INDICE.strip() TURN = INDICE[0] STEP = int(INDICE[1:].strip()) DIRECTION_INDEX = DIRECTION_INDEX + DIRECTION_CHANGE[TURN] if DIRECTION_INDEX < 0: DIRECTION_INDEX = len(DIRECTIONS) - 1 if DIRECTION_INDEX >= len(DIRECTIONS): DIRECTION_INDEX = 0 MAP_POSITION_A = copy.copy(MAP_POSITION_B) MAP_POSITION_B[0] = MAP_POSITION_A[0] + DIRECTIONS[DIRECTION_INDEX]['V']*STEP MAP_POSITION_B[1] = MAP_POSITION_A[1] + DIRECTIONS[DIRECTION_INDEX]['H']*STEP if bool(DIRECTIONS[DIRECTION_INDEX]['V']): step = DIRECTIONS[DIRECTION_INDEX]['V'] for x in range(MAP_POSITION_A[0]+step, MAP_POSITION_B[0]+step, step): if x not in MAPS_VISITED: MAPS_VISITED[x] = [] if MAP_POSITION_A[1] in MAPS_VISITED[x]: TWICE = [x, MAP_POSITION_A[1]] break MAPS_VISITED[x].append(MAP_POSITION_A[1]) if TWICE: break if bool(DIRECTIONS[DIRECTION_INDEX]['H']): step = DIRECTIONS[DIRECTION_INDEX]['H'] for y in range(MAP_POSITION_A[1]+step, MAP_POSITION_B[1]+step, step): if MAP_POSITION_A[0] not in MAPS_VISITED: MAPS_VISITED[MAP_POSITION_A[0]] = [] if y in MAPS_VISITED[MAP_POSITION_A[0]]: TWICE = [MAP_POSITION_A[0], y] break MAPS_VISITED[MAP_POSITION_A[0]].append(y) if TWICE: break if TWICE: print("%d" % (abs(TWICE[0]) + abs(TWICE[1]))) if __name__ == "__main__": parser = argparse.ArgumentParser(description='AdventOfCode 2016 Day 01') parser.add_argument('--input', '-i', action='store', required=True, help='input file') args = parser.parse_args() main(args)