AdventOfCode/2023/day18/part1.py

135 lines
2.4 KiB
Python

import sys
import os
from pprint import pprint
import time
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
from matplotlib.path import Path
#colors
from termcolor import colored
def p(x,inside):
for idx,i in enumerate(x):
for jdx,j in enumerate(i):
#if j == '#':
# print(colored(j,'red'),end='')
#elif (idx,jdx) in steps:
# print(colored(j,'green'),end='')
if (idx,jdx) in inside:
print(colored(j,'green'),end='')
else:
print(j,end='')
print()
input_f = ''
if len(sys.argv) == 1:
input_f = 'test'
else:
input_f = sys.argv[1]
grid = []
with open(input_f) as file:
for line in file:
grid.append(line.rstrip().split())
pprint(grid)
size = 1000
pit = [ ['.']*size for i in range(size)]
cur = (int(size/2),int(size/2))
#p(pit)
print()
steps = []
for i in grid:
direction,length,color = i
#print(cur)
length = int(length)
#print(direction,length)
if direction == 'R':
for x in range(cur[1],cur[1]+length+1):
pit[cur[0]][x] = '#'
steps.append((cur[0],x))
#print(cur[0],x)
cur = (cur[0],cur[1]+length)
if direction == 'D':
for x in range(cur[0],cur[0]+length):
pit[x][cur[1]] = '#'
steps.append((x,cur[1]))
# print(x,cur[1])
cur = (cur[0]+length,cur[1])
if direction == 'L':
for x in range(cur[1],cur[1]-length-1,-1):
pit[cur[0]][x] = '#'
steps.append((cur[0],x))
# print(cur[0],x)
cur = (cur[0],cur[1]-length)
if direction == 'U':
for x in range(cur[0],cur[0]-length,-1):
pit[x][cur[1]] = '#'
steps.append((x,cur[1]))
# print(x,cur[1])
cur = (cur[0]-length,cur[1])
#print(steps)
#p(pit,(0,0))
#input()
#pprint(steps)
ground = []
path = Path(steps)
s_ground = []
m_ground = []
polygon = Polygon(steps)
count = 0
for ydx,y in enumerate(pit):
for xdx,x in enumerate(y):
if path.contains_point((ydx,xdx)):
m_ground.append((ydx,xdx))
if polygon.contains(Point(ydx,xdx)):
s_ground.append((ydx,xdx))
#p(pit,s_ground)
pprint(len(s_ground))
pprint(len(m_ground))
print(len(m_ground)+len(set(steps)))
print('Part 1: ' + str(len(set(steps))))
print('Part 1.2: ' + str(len(s_ground)+len(set(steps))))
print(len(ground) + len(set(steps)))
# 12835
# 13134
# 17440
# Part 1: 4306
# Part 1.2: 17141
# 4306