79 lines
2.4 KiB
Python
Executable File
79 lines
2.4 KiB
Python
Executable File
#!/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)
|