2017-12-11 - Hex Ed
(original .ipynb)from advent import GrowableGrid puzzle_input_str = open("puzzle_input/day11.txt").read().strip() move = { "n": lambda g: g.hex_n("."), "nw": lambda g: g.hex_nw("."), "sw": lambda g: g.hex_sw("."), "s": lambda g: g.hex_s("."), "se": lambda g: g.hex_se("."), "ne": lambda g: g.hex_ne("."), } def follow_directions(input_str): directions = input_str.split(",") g = GrowableGrid("x", False) for d in directions: move[d](g) return g def distance(r1, c1, r2, c2): steps = 0 while (r1, c1) != (r2, c2): if r1 == r2: inc = 1 if c2 > c1 else -1 c1 += inc elif c1 == c2: inc = 1 if r2 > r1 else -1 r1 += inc elif r1 < r2 and c1 < c2: r1 += 1 c1 += 1 elif r1 > r2 and c1 > c2: r1 -= 1 c1 -= 1 steps += 1 return steps def part_one(input_str): g = follow_directions(input_str) return distance(g.row, g.col, g.start_row, g.start_col) assert 3 == part_one("ne,ne,ne") assert 0 == part_one("ne,ne,sw,sw") assert 2 == part_one("ne,ne,s,s") assert 3 == part_one("se,sw,se,sw,sw") print("part one:", part_one(puzzle_input_str))
part one: 784
def part_two(input_str): g = follow_directions(input_str) distances = [] max_rows = len(g.grid) sr, sc = g.start_row, g.start_col for r, row in enumerate(g.grid): # check all the first and last rows if r == 0 or r == max_rows - 1: for c, col in enumerate(row): if col == ".": distances.append(distance(sr, sc, r, c)) # otherwise check first or last cols else: if row[0] == ".": distances.append(distance(sr, sc, r, 0)) elif row[-1] == ".": distances.append(distance(sr, sc, r, len(row)-1)) return max(distances) print("part two:", part_two(puzzle_input_str))
part two: 1558