Day 10 with colored show :D
This commit is contained in:
1 parent
62dd0c0e52
commit
b6da96e170
3 files changed
+227
No files matched your search
Executable
+87
@@ -0,0 +1,87 @@
|
||||
#!/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")
|
||||
|
||||
Reference in new issue
Block a user