@@ -29,7 +29,7 @@ func boundingBox(_ canvas: Dictionary<Point, Character>) -> (Point, Point) {
29
29
minX = min ( minX, k. x)
30
30
minY = min ( minY, k. y)
31
31
}
32
- return ( Point ( x: minX - 1 , y: minY - 1 ) , Point ( x: maxX + 1 , y: maxY + 1 ) )
32
+ return ( Point ( x: minX, y: minY) , Point ( x: maxX, y: maxY) )
33
33
}
34
34
35
35
func makeCanvas( _ lines: [ [ Point ] ] ) -> Dictionary < Point , Character > {
@@ -60,8 +60,8 @@ func makeCanvas(_ lines: [[Point]]) -> Dictionary<Point, Character> {
60
60
func canvasAsString( _ canvas: Dictionary < Point , Character > ) -> String {
61
61
var result = [ Character] ( )
62
62
let bounds = boundingBox ( canvas)
63
- for y in ( bounds. 0 . y) ... ( bounds. 1 . y) {
64
- for x in ( bounds. 0 . x) ... ( bounds. 1 . x) {
63
+ for y in ( bounds. 0 . y - 1 ) ... ( bounds. 1 . y + 1 ) {
64
+ for x in ( bounds. 0 . x - 1 ) ... ( bounds. 1 . x + 1 ) {
65
65
if let ch = canvas [ Point ( x: x, y: y) ] {
66
66
result. append ( ch)
67
67
} else {
@@ -103,7 +103,23 @@ public func part1() -> Int {
103
103
var canvas = makeCanvas ( inputData ( ) )
104
104
let bounds = boundingBox ( canvas)
105
105
var result = 0
106
- while dropSand ( at: Point ( x: 500 , y: 0 ) , maxY: bounds. 1 . y, in: & canvas) {
106
+ while dropSand ( at: Point ( x: 500 , y: 0 ) , maxY: bounds. 1 . y + 2 , in: & canvas) {
107
+ result += 1
108
+ }
109
+ return result
110
+ }
111
+
112
+ public func part2( ) -> Int {
113
+ var canvas = makeCanvas ( inputData ( ) )
114
+ let bounds = boundingBox ( canvas)
115
+ for x in - 1000 ... 1000 {
116
+ let q = Point ( x: x, y: bounds. 1 . y + 2 )
117
+ canvas [ q] = " # "
118
+ }
119
+ let origin = Point ( x: 500 , y: 0 )
120
+ var result = 0
121
+ while nil == canvas [ origin] {
122
+ _ = dropSand ( at: origin, maxY: bounds. 1 . y + 3 , in: & canvas)
107
123
result += 1
108
124
}
109
125
return result
0 commit comments