#!/usr/bin/env python3 # import numpy as np from functools import reduce from re import findall from copy import deepcopy import sys import time animate = False # filename = "in/day09.ref" # filename = "in/day09_2.ref" filename = "in/day09.pzl" data = open(filename).read() lines = [line for line in data.rstrip('\n').split('\n')] moves = [] for a in lines: m = [0, 0] direction, count = a.split(' ') if direction == 'R': m = [1, 0] elif direction == 'U': m = [0, 1] elif direction == 'D': m = [0, -1] elif direction == 'L': m = [-1, 0] # m = [int(count)*i for i in m] for _ in range(int(count)): moves.append(m) # print(moves) res1 = 0 h = [0,0] t = [0,0] visited = set() visited.add(tuple(t)) for m in moves: h = [hi + mi for hi,mi in zip(h,m)] dx = h[0] - t[0] dy = h[1] - t[1] if abs(dx) > 1 or (abs(dx) > 0 and abs(dy) > 1): t[0] += dx//abs(dx) if abs(dy) > 1 or (abs(dy) > 0 and abs(dx) > 1): t[1] += dy//abs(dy) visited.add(tuple(t)) res2 = 0 ht = [[0,0] for i in range(10)] visited9 = set() visited9.add(tuple(ht[9])) def print_grid(arr, c=''): lx = 100 ly = 40 grid = [['.' for _ in range(lx)] for _ in range(ly)] for i, (x, y) in enumerate(arr): try: grid[-y+ly//2][x+lx//2] = c if c!='' else str(i) except: pass grid[ly//2][lx//2] = "s" print('\x1b[2J') for line in grid: for c in line: print(c, end="") print("") time.sleep(1/20) for m in moves: ht[0] = [hi + mi for hi,mi in zip(ht[0],m)] for i,_ in enumerate(ht): if i == 0: continue dx = ht[i-1][0] - ht[i][0] dy = ht[i-1][1] - ht[i][1] if abs(dx) > 1 or (abs(dx) > 0 and abs(dy) > 1): ht[i][0] += dx//abs(dx) if abs(dy) > 1 or (abs(dy) > 0 and abs(dx) > 1): ht[i][1] += dy//abs(dy) # print(ht) visited9.add(tuple(ht[9])) if animate: print_grid(ht) # print(visited9) res1 = len(visited) res2 = len(visited9) if animate == True: print_grid(visited9, c='#') else: print('res1:', res1) print('res2:', res2)