adventofcode-2016/01/part02.py

79 lines
2.4 KiB
Python
Raw Normal View History

2018-01-15 23:53:47 +01:00
#!/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)