commit 7732ec3c80ee414dad6b88aa7e8a14bb64b4b106
parent f23ede1b9a424b85bf48bccb95ed15399a2cb27a
Author: bsandro <email@bsandro.tech>
Date: Wed, 14 Dec 2022 11:57:09 +0000
Day 14 part 2
Diffstat:
M | day14/main.go | | | 90 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------ |
1 file changed, 70 insertions(+), 20 deletions(-)
diff --git a/day14/main.go b/day14/main.go
@@ -16,30 +16,27 @@ type Pos struct {
type Shape []Pos
type Shapes []Shape
-func (ss Shapes) GetMinX() int {
- x := -1
+func (ss Shapes) GetLeftmost() Pos {
+ p := Pos{x: -1}
for _, s := range ss {
for _, e := range s {
- if x == -1 {
- x = e.x
- }
- if e.x < x {
- x = e.x
+ if p.x == -1 || e.x < p.x {
+ p = e
}
}
}
- return x
+ return p
}
-func (ss Shapes) GetMaxX() int {
- x := 0
+func (ss Shapes) GetRightmost() Pos {
+ var p Pos
for _, s := range ss {
for _, e := range s {
- if e.x > x {
- x = e.x
+ if e.x > p.x {
+ p = e
}
}
}
- return x
+ return p
}
func (ss Shapes) GetMaxY() int {
y := 0
@@ -61,7 +58,7 @@ func (grid Grid) String() string {
for x := 0; x < len(grid[y]); x++ {
switch grid[y][x] {
case 0:
- s += "."
+ s += " "
case 1:
s += "#"
case 2:
@@ -147,14 +144,14 @@ func day14(input_file string) {
}
height := shapes.GetMaxY() + 1
- offsetX := shapes.GetMinX()
- width := shapes.GetMaxX() - offsetX + 2
+ offsetX := shapes.GetLeftmost().x
+ width := shapes.GetRightmost().x - offsetX + 2
var grid Grid
grid.Init(width, height)
for _, s := range shapes {
grid.AddShape(s, offsetX)
}
- fmt.Printf("%v\n", grid)
+ //fmt.Printf("%v\n", grid)
i := 0
for {
@@ -169,7 +166,6 @@ func day14(input_file string) {
p.y += 1
p.x += 1
} else {
- //log.Fatal("invalid point")
break
}
}
@@ -181,6 +177,60 @@ func day14(input_file string) {
i++
//fmt.Printf("%v\n", grid)
}
- fmt.Printf("%v\n", grid)
- fmt.Println("grains of sand:", i)
+ //fmt.Printf("%v\n", grid)
+ fmt.Println("grains of sand 1:", i)
+
+ var grid2 Grid
+ height += 2
+ leftmost := shapes.GetLeftmost()
+ rightmost := shapes.GetRightmost()
+ minx := leftmost.x - (height - leftmost.y)
+ maxx := rightmost.x + (height - rightmost.y)
+ if minx > 500-height {
+ minx = 500 - height
+ }
+ if maxx < 500+height {
+ maxx = 500 + height
+ }
+ offsetX = minx
+ width = maxx - minx + 2
+ ///fmt.Printf("minx:%d, maxx:%d,offsetx:%d,width:%d,height:%d\n",minx,maxx,offsetX,width,height)
+ if offsetX < 0 {
+ offsetX = 0
+ }
+ grid2.Init(width, height)
+ for _, s := range shapes {
+ grid2.AddShape(s, offsetX)
+ }
+ floor := Shape{}
+ floor = append(floor, Pos{x: 0, y: height - 1})
+ floor = append(floor, Pos{x: width - 1, y: height - 1})
+ grid2.AddShape(floor, 0)
+ //fmt.Printf("%v\n", grid2)
+ i = 0
+ for {
+ p := Pos{x: 500 - offsetX, y: 0}
+ for p.x > 0 && p.x < width-1 && p.y < height-1 {
+ if grid2[p.y+1][p.x] == 0 {
+ p.y += 1
+ } else if grid2[p.y+1][p.x-1] == 0 {
+ p.y += 1
+ p.x -= 1
+ } else if grid2[p.y+1][p.x+1] == 0 {
+ p.y += 1
+ p.x += 1
+ } else {
+ break
+ }
+ }
+ if p.y < height-1 && grid2[p.y][p.x] == 0 {
+ grid2[p.y][p.x] = 2
+ } else {
+ break
+ }
+ i++
+ //fmt.Printf("%v\n", grid2)
+ }
+ //fmt.Printf("%v\n", grid2)
+ fmt.Println("grains of sand 2:", i)
}