#!/usr/bin/env python # Remove all instances of ### from the code # to view Part 1 interactively my_plane = None with open("/home/login/bin/advent17/input19.txt") as f: my_plane = f.readlines() #(x,y) on my_plane is my_plane[-y][x] plane_width = len(my_plane[0]) plane_height = len(my_plane) direction_guide = {'|': (0,1), '-':(1,0)} neighbour_guide = (lambda x,y: [(y,x),(-y,-x)]) def direction_change(plane_yx, current_position, current_direction, current_character, letter_list, stop_flag): global direction_guide, neighbour_guide check_position = None for item in neighbour_guide(*current_direction): check_position = tuple(map(lambda x,y: x+y, current_position, item)) if plane_yx[-check_position[1]][check_position[0]] in direction_guide: current_direction[0],current_direction[1] = tuple(x*sum(item) for x in direction_guide[plane_yx[-check_position[1]][check_position[0]]]) ###print(">\tDirection changed to " + str(current_direction)) move(plane_yx, current_position, current_direction, current_character, letter_list, stop_flag) return def move(plane_yx, current_position, current_direction, current_character, letter_list, stop_flag): current_position[0] += current_direction[0] current_position[1] += current_direction[1] def stop(plane_yx, current_position, current_direction, current_character, letter_list, stop_flag): stop_flag[0] = True def add_letter(plane_yx, current_position, current_direction, current_character, letter_list, stop_flag): letter_list.append(current_character) move(plane_yx, current_position, current_direction, current_character, letter_list, stop_flag) navigate = {' ': stop,'|': move, '-': move, '+': direction_change, 'A': add_letter, 'B': add_letter, 'C': add_letter, 'D': add_letter, 'E': add_letter, 'F': add_letter, 'G': add_letter, 'H': add_letter, 'I': add_letter, 'J': add_letter, 'K': add_letter, 'L': add_letter, 'M': add_letter, 'N': add_letter, 'O': add_letter, 'P': add_letter, 'Q': add_letter, 'R': add_letter, 'S': add_letter, 'T': add_letter, 'U': add_letter, 'V': add_letter, 'W': add_letter, 'X': add_letter, 'Y': add_letter, 'Z': add_letter} letters = [] # to store alphabets seen on path current_position = [0,0] #[x,y] current_direction = [0,-1] #[x,y] # Finding starting position for x in range(0, plane_width): if my_plane[0][x]=='|': current_position = [x,0] break stop_flag = [False] steps = 0 while not stop_flag[0]: navigate[my_plane[-current_position[1]][current_position[0]]](plane_yx=my_plane, current_position=current_position, current_direction=current_direction, current_character=my_plane[-current_position[1]][current_position[0]], letter_list=letters, stop_flag=stop_flag) steps+=1 ###print((steps, current_position, current_direction, my_plane[-current_position[1]][current_position[0]], letters, stop_flag)) ###print("(Press enter key to continue...)") ###raw_input() ###print(" ") steps-=1 # to uncount stepping into " " in the end print("Letters seen: " + ''.join(letters)) print("Steps taken: " + str(steps))