-
Notifications
You must be signed in to change notification settings - Fork 0
/
14.py
130 lines (112 loc) · 3.66 KB
/
14.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
from collections import defaultdict
import time
from aoc import inpututil as iu
import os
class Cavesystem:
def __init__(self, rockpointdata: list) -> None:
self.points=defaultdict(lambda: '.')
for line in rockpointdata:
# Get the different points for the paths of rock
self.addpath(line.split(' -> '))
self.getmaprange()
self.sandrested=0
def addpath(self, points: list):
lastx, lasty = -1, -1
for i, point in enumerate(points):
px, py = map(int, point.split(','))
if lastx == -1:
lastx = px
if lasty == -1:
lasty = py
for x in range(min(lastx,px), max(lastx,px) + 1):
for y in range(min(lasty,py), max(lasty,py) + 1):
self.points[(x,y)] = '#'
lastx = px
lasty = py
def addsand(self, startingpoint: tuple = (500,0), step2=False):
x,y = startingpoint
falling=True
curpoint = startingpoint
self.points[curpoint] = "+"
while(falling):
x,y = curpoint
if step2:
self.points[x,self.maxY+2]='#'
self.points[x-1,self.maxY+2]='#'
self.points[x+1,self.maxY+2]='#'
if x - 1 < self.minX:
self.minX = x-1
if x > self.maxX:
self.maxX = x + 1
directions = {
"s":(x,y+1),
"sw":(x-1,y+1),
"se":(x+1, y+1)
}
moved=False
for dir in directions:
if self.points[directions[dir]] == ".":
self.points[directions[dir]] = "+"
self.points[curpoint] = "."
curpoint=directions[dir]
#self.printmap(step2)
#print("-"*10)
moved = True
break
# no direction was possible to move in
falling = moved
x,y = curpoint
# Check if we're outside the map area
if not step2 and (x < self.minX or x > self.maxX or y > self.maxY):
return False
self.points[curpoint] = "o"
self.sandrested+=1
if step2 and curpoint==(500,0):
return False
#self.printmap(step2)
#print("-"*10)
return True
def printmap(self, step2=False):
if step2:
rowrange=self.maxY+3
else:
rowrange=self.maxY+1
for y in range(0, rowrange):
line=""
for x in range(self.minX,self.maxX+1):
p=(x,y)
line += self.points[p]
print(line)
time.sleep(0.1)
def getmaprange(self):
coords = list(self.points.keys())
minx = 10000000
miny = 10000000
maxx = 0
maxy = 0
for coord in coords:
(x,y) = coord
if x < minx:
minx = x
if x > maxx:
maxx = x
if y < miny:
miny = y
if y > maxy:
maxy = y
self.minX = minx
self.minY = miny
self.maxX = maxx
self.maxY = maxy
file=os.path.basename(__file__).replace('.py','')
util = iu()
lines = util.GetLines(file, test=False)
cave = Cavesystem(lines)
cave2 = Cavesystem(lines)
while(cave.addsand(step2=False)):
pass
print(f"Step 1: {cave.sandrested}")
while(cave2.addsand(step2=True)):
pass
#cave2.printmap()
print(f"Step 2: {cave2.sandrested}")