summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Vink <mike1994vink@gmail.com>2022-12-23 20:18:39 +0100
committerMike Vink <mike1994vink@gmail.com>2022-12-23 20:18:39 +0100
commit611ee045b7e7d3822be021d5ea2cbf77306cb343 (patch)
treeabd4766cea08ab86e37f7ef0502c871207a46e2b
parentdf7e686f243cf5b177e74e1aa67d97b0893c3b60 (diff)
day14: could be less lines go?
-rw-r--r--day14.go178
-rw-r--r--day14.txt131
2 files changed, 296 insertions, 13 deletions
diff --git a/day14.go b/day14.go
index c1babe6..a7527e3 100644
--- a/day14.go
+++ b/day14.go
@@ -9,12 +9,138 @@ import (
"strings"
)
+const (
+ rock byte = '#'
+ air byte = '.'
+ abyss byte = '~'
+)
+
+func abs(n int) int {
+ if n < 0 {
+ return -n
+ }
+ return n
+}
+
type coord struct {
x, y int
}
type cave struct {
- scan []byte
+ scan []byte
+ width, height, xmin int
+}
+
+func (c *cave) stringify() string {
+ cave := ""
+ for i := 0; i < len(c.scan); i += c.height {
+ cave += string(c.scan[i:i+c.height]) + "\n"
+ }
+ return cave
+}
+
+func (c *cave) setCoord(co coord, value byte) {
+ c.scan[(co.x-c.xmin)*c.height+co.y] = value
+}
+
+func (c *cave) getCoord(x, y int) byte {
+ nx, ny := (x-c.xmin)*c.height, y
+ if (x-c.xmin) >= c.width || y >= c.height {
+ return abyss
+ }
+ if nx+ny < 0 {
+ return abyss
+ }
+ return c.scan[nx+ny]
+}
+
+func (c *cave) drawRocks(c1, c2 coord) {
+ draw := func(co coord, x1, x2 int, up func(i int) coord) {
+ dx := x2 - x1
+ di := 1
+ if dx != 0 {
+ if dx < 0 {
+ dx = -dx
+ di = -di
+ }
+ for i := 0; abs(i) < dx+1; i += di {
+ c.setCoord(up(i), rock)
+ }
+ }
+ }
+ draw(c1, c1.x, c2.x, func(i int) coord { return coord{c1.x + i, c1.y} })
+ draw(c1, c1.y, c2.y, func(i int) coord { return coord{c1.x, c1.y + i} })
+}
+
+func (c *cave) rockFormations(rockFormations [][]coord) {
+ for _, r := range rockFormations {
+ for j, co := range r {
+ if j > 0 {
+ c.drawRocks(r[j-1], co)
+ }
+ }
+ }
+}
+
+func (c *cave) newFloor() []byte {
+ floor := make([]byte, c.height)
+ for i := range floor {
+ floor[i] = air
+ }
+ floor[len(floor)-1] = rock
+ return floor
+}
+
+type sand byte
+
+func (s sand) fall(cave *cave, floor bool) bool {
+ co := &coord{500, 0}
+ left, beneath, right := s.options(cave, co.x, co.y)
+ if left != air && beneath != air && right != air {
+ return false
+ }
+ for {
+ left, beneath, right := s.options(cave, co.x, co.y)
+ if beneath == air {
+ co.y++
+ continue
+ }
+ if left == air {
+ co.x--
+ co.y++
+ continue
+ }
+ if right == air {
+ co.x++
+ co.y++
+ continue
+ }
+ if left == abyss || beneath == abyss || right == abyss {
+ if floor {
+ cave.scan = append(cave.newFloor(), cave.scan...)
+ cave.xmin = cave.xmin - 1
+ cave.width = cave.width + 1
+
+ cave.scan = append(cave.scan, cave.newFloor()...)
+ cave.width = cave.width + 1
+ continue
+ }
+ return false
+ }
+
+ if beneath == rock || beneath == byte(s) {
+ cave.setCoord(*co, byte(s))
+ return true
+ }
+ }
+ fmt.Println("Something went wrong")
+ return false
+}
+
+func (s sand) options(cave *cave, x, y int) (byte, byte, byte) {
+ return cave.getCoord(x-1, y+1),
+ cave.getCoord(x, y+1),
+ cave.getCoord(x+1, y+1)
}
func main() {
@@ -24,12 +150,13 @@ func main() {
}
s := bufio.NewScanner(f)
- coords := []coord{}
- xmin, xmax := 1<<31, 0
- ymin, ymax := 1<<31, 0
+ rockFormations := [][]coord{}
+ xmin, xmax, ymax := 1<<31, 0, 0
for s.Scan() {
line := s.Text()
- for _, coordString := range strings.Split(line, "->") {
+ coordStrings := strings.Split(line, "->")
+ coords := make([]coord, len(coordStrings))
+ for i, coordString := range coordStrings {
nums := strings.Split(strings.Trim(coordString, " "), ",")
x, err := strconv.Atoi(nums[0])
if err != nil {
@@ -48,13 +175,42 @@ func main() {
if y > ymax {
ymax = y
}
- if y < ymin {
- ymin = y
- }
- coords = append(coords, coord{x, y})
+ coords[i] = coord{x, y}
}
+ rockFormations = append(rockFormations, coords)
+ }
+
+ width, height := (xmax-xmin)+1, (ymax-0)+1
+ scan := make([]byte, width*height)
+ for i := range scan {
+ scan[i] = air
}
- fmt.Println(coords, xmin, xmax, ymin, ymax)
+ c := &cave{scan, width, height, xmin}
+ c.rockFormations(rockFormations)
- cave := &cave{scan: make([]byte, (xmax-xmin)*(ymax-ymin))}
+ sandCounter := 0
+ var snd sand = 'o'
+ for snd.fall(c, false) {
+ sandCounter++
+ }
+ fmt.Println("Part 1: ", sandCounter)
+
+ correctedHeight := height + 2
+ scan = make([]byte, width*correctedHeight)
+ for i := range scan {
+ scan[i] = air
+ }
+ c = &cave{scan, width, correctedHeight, xmin}
+ floor := []coord{
+ {xmin, correctedHeight - 1},
+ {xmin + width - 1, correctedHeight - 1},
+ }
+ rockFormations = append(rockFormations, floor)
+ c.rockFormations(rockFormations)
+
+ sandCounter = 1
+ for snd.fall(c, true) {
+ sandCounter++
+ }
+ fmt.Println("Part 2: ", sandCounter)
}
diff --git a/day14.txt b/day14.txt
index 4e87bb5..59a26bb 100644
--- a/day14.txt
+++ b/day14.txt
@@ -1,2 +1,129 @@
-498,4 -> 498,6 -> 496,6
-503,4 -> 502,4 -> 502,9 -> 494,9
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+484,41 -> 484,42 -> 495,42 -> 495,41
+494,51 -> 498,51
+470,158 -> 475,158
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+458,171 -> 462,171
+473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
+492,162 -> 497,162
+494,27 -> 498,27
+471,162 -> 476,162
+480,156 -> 485,156
+498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+461,165 -> 465,165
+477,70 -> 487,70 -> 487,69
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
+462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+482,37 -> 488,37 -> 488,36
+473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+464,162 -> 469,162
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+473,173 -> 477,173
+462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
+498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
+464,167 -> 468,167
+468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+476,154 -> 481,154
+461,173 -> 465,173
+468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
+494,33 -> 498,33
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+477,70 -> 487,70 -> 487,69
+473,156 -> 478,156
+455,173 -> 459,173
+478,162 -> 483,162
+462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+467,173 -> 471,173
+498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+484,41 -> 484,42 -> 495,42 -> 495,41
+497,30 -> 501,30
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
+498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
+468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
+485,162 -> 490,162
+482,37 -> 488,37 -> 488,36
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+491,30 -> 495,30
+468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
+467,169 -> 471,169
+452,171 -> 456,171
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+464,171 -> 468,171
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+484,41 -> 484,42 -> 495,42 -> 495,41
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
+474,160 -> 479,160
+500,51 -> 504,51
+494,45 -> 498,45
+461,169 -> 465,169
+468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
+488,51 -> 492,51
+458,167 -> 462,167
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
+498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+466,137 -> 466,138 -> 484,138
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
+468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
+468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
+498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
+467,160 -> 472,160
+468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+481,160 -> 486,160
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+497,48 -> 501,48
+491,48 -> 495,48
+455,169 -> 459,169
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+500,33 -> 504,33
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+449,173 -> 453,173
+473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+470,171 -> 474,171
+477,158 -> 482,158
+468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
+473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
+466,137 -> 466,138 -> 484,138
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+484,158 -> 489,158
+462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85
+462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85
+488,33 -> 492,33
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85
+480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
+482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
+488,160 -> 493,160
+462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85