#!/usr/bin/env python3 import sys from copy import deepcopy from termcolor import colored def show(pipes, marked): for y in range(len(pipes)): for x in range(len(pipes[y])): if marked[y][x] == 'x': print(colored(pipes[y][x], 'blue'), end = '') elif marked[y][x] == 'I': print(colored(pipes[y][x], 'green'), end = '') else: print(colored(pipes[y][x], 'grey'), end = '') print('\n', end = '') def count_vert(pipe, marked, x): p = '' t = 0 for i in range(x): if marked[i] == 'x': p += pipe[i] p = p.replace('-', '') t += p.count('L7') p = p.replace('L7', '') t += p.count('FJ') p = p.replace('FJ', '') t += len(p) return t def next_step(pos, pipes): y, x = pos tile = pipes[y][x] east = pipes[y][x+1] if x != len(pipes[y]) - 1 else 'x' west = pipes[y][x-1] if x != 0 else 'x' north = pipes[y-1][x] if y != 0 else 'x' south = pipes[y+1][x] if y != len(pipes) - 1 else 'x' if tile in ['-', 'L', 'F'] and east in ['-', '7', 'J']: return (y, x+1) elif tile in ['|', '7', 'F'] and south in ['|', 'J', 'L']: return (y+1, x) elif tile in ['|', 'J', 'L'] and north in ['|', '7', 'F']: return (y-1, x) elif tile in ['-', '7', 'J'] and west in ['-', 'L', 'F']: return (y, x-1) def measure_loop(start, p): pipes = deepcopy(p) position = next_step(start,pipes) prev_position = position position = next_step(position,pipes) loop = 2 while position != start: pipes[prev_position[0]][prev_position[1]] = 'x' prev_position = position position = next_step(position, pipes) loop += 1 pipes[start[0]][start[1]] = 'x' return loop, pipes if __name__ == '__main__': pipes = [list(line.strip('\n')) for line in open(sys.argv[1])] start = (0,0) for i,p in enumerate(pipes): if 'S' in p: start = (i, p.index('S')) pipes[i][p.index('S')] = '-' break length, marked_loop = measure_loop(start, pipes) # challenge 2 res2 = 0 for y in range(len(pipes)): for x in range(len(pipes[y])): if not marked_loop[y][x] == 'x': c = count_vert(pipes[y], marked_loop[y], x) if (c%2) == 1: res2 += 1 marked_loop[y][x] = 'I' show(pipes, marked_loop) # challenge 1 res1 = str(int(length/2)) print(f"challenge 1:\n{res1}\n") res2 = str(res2) print(f"challenge 2:\n{res2}\n")