diff options
| author | Mike Vink <mike1994vink@gmail.com> | 2022-12-23 20:18:39 +0100 |
|---|---|---|
| committer | Mike Vink <mike1994vink@gmail.com> | 2022-12-23 20:18:39 +0100 |
| commit | 611ee045b7e7d3822be021d5ea2cbf77306cb343 (patch) | |
| tree | abd4766cea08ab86e37f7ef0502c871207a46e2b | |
| parent | df7e686f243cf5b177e74e1aa67d97b0893c3b60 (diff) | |
day14: could be less lines go?
| -rw-r--r-- | day14.go | 178 | ||||
| -rw-r--r-- | day14.txt | 131 |
2 files changed, 296 insertions, 13 deletions
@@ -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) } @@ -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 |
