diff --git a/2018/day17/day17.go b/2018/day17/day17.go
index 579da1b..066c13f 100644
--- a/2018/day17/day17.go
+++ b/2018/day17/day17.go
@@ -11,9 +11,18 @@ import (
)
const (
- MaxInt = int(^uint(0) >> 1)
- MinInt = -MaxInt - 1
- ClearScreen = "\033[H\033[2J"
+ MAX_INT = int(^uint(0) >> 1)
+ MIN_INT = -MAX_INT - 1
+ CLEAR_SCREEN = "\033[H\033[2J"
+ DEBUG = true
+ SLOW_IT_DOWN = true
+
+ FLOW_NO = iota
+ FLOW_D
+ FLOW_LR
+ FLOW_L
+ FLOW_R
+ FLOW_ERR
)
func main() {
@@ -22,9 +31,9 @@ func main() {
//part2(input)
}
-var scan [1000][1000]byte
-var minX, maxX int = MaxInt, MinInt
-var minY, maxY int = MaxInt, MinInt
+var scan [2000][2000]byte
+var minX, maxX int = MAX_INT, MIN_INT
+var minY, maxY int = MAX_INT, MIN_INT
func part1(input []string) {
for _, v := range input {
@@ -36,103 +45,109 @@ func part1(input []string) {
if fst[0] == "x" {
x = Atoi(fst[1])
for y = Atoi(scdRange[0]); y <= Atoi(scdRange[1]); y++ {
- minmax(x, y)
- scan[x][y] = '#'
+ if y < 50 && x > 450 && x < 550 {
+ minmax(x, y)
+ scan[x][y] = '#'
+ }
}
} else if fst[0] == "y" {
y = Atoi(fst[1])
for x := Atoi(scdRange[0]); x <= Atoi(scdRange[1]); x++ {
- minmax(x, y)
- scan[x][y] = '#'
+ if y < 50 && x > 450 && x < 550 {
+ minmax(x, y)
+ scan[x][y] = '#'
+ }
}
}
}
- printScan()
// The water starts at 500, 0
- fillDown(500, 0)
+ for {
+ printScan()
+ if SLOW_IT_DOWN {
+ time.Sleep(time.Millisecond * 250)
+ }
+ if !fillSpot(500, 1) {
+ break
+ }
+ }
+ printScan()
}
func part2(input []string) {
}
-// The 'fill
' functions return the x, y that was filled
-// or MinInt, MinInt, if x, y can't be filled
+func fillSpot(x, y int) bool {
+ if y > maxY {
+ return false
+ } else if !canFill(x, y) {
+ return false
+ }
-// fillDown will check down, then left, then right
-func fillDown(x, y int) (int, int) {
- fx, fy := fillSpot(x, y)
- if !gud(fx, fy) {
- return fx, fy
+ if scan[x][y] == 0 {
+ scan[x][y] = '|'
+ return true
}
- // Try to fill the spot below it
- dx, dy := fillDown(x, y+1)
- if dx == MinInt && dy == MinInt {
- // We couldn't go down
- lx, ly := fillLeft(x-1, y) // left?
- rx, ry := fillRight(x+1, y) // right?
- if !gud(lx, ly) || !gud(rx, ry) {
- return MinInt, MinInt // Off to infinity
- }
- if ly == y && ry == y {
- scan[lx][y] = '~'
- scan[rx][y] = '~'
- }
+
+ if canFill(x, y+1) {
+ return fillSpot(x, y+1)
+ } else if canFill(x-1, y) && canFill(x+1, y) {
+ return fillLeft(x-1, y) || fillRight(x+1, y)
+ } else if canFill(x-1, y) {
+ return fillLeft(x-1, y)
+ } else if canFill(x+1, y) {
+ return fillRight(x+1, y)
}
- return dx, dy
+
+ scan[x][y] = '~'
+ return true
}
-func fillLeft(x, y int) (int, int) {
- fx, fy := fillSpot(x, y)
- if !gud(fx, fy) {
- return fx, fy
+func fillLeft(x, y int) bool {
+ if !canFill(x, y) {
+ return false
}
- // This spot can be filled, try to go down
- rx, ry := fillDown(fx, fy+1)
- if gud(rx, ry) {
- return rx, ry
+
+ if scan[x][y] == 0 {
+ scan[x][y] = '|'
+ return true
}
- // Couldn't go down, try to go left
- rx, ry = fillLeft(fx-1, y)
- if gud(rx, ry) {
- return rx, ry
+
+ if canFill(x, y+1) {
+ return fillSpot(x, y+1)
+ } else if canFill(x-1, y) {
+ return fillLeft(x-1, y)
}
- return x, y
+
+ scan[x][y] = '~'
+ return true
}
-func fillRight(x, y int) (int, int) {
- fx, fy := fillSpot(x, y)
- if !gud(fx, fy) {
- return fx, fy
+func fillRight(x, y int) bool {
+ if !canFill(x, y) {
+ return false
}
- // This spot can be filled, try to go down
- rx, ry := fillDown(fx, fy+1)
- if gud(rx, ry) {
- return rx, ry
- }
- // Couldn't go down, try to go left
- rx, ry = fillRight(fx+1, y)
- if gud(rx, ry) {
- return rx, ry
- }
- return x, y
-}
-func fillSpot(x, y int) (int, int) {
- time.Sleep(time.Millisecond * 250)
- printScan()
- if y > maxY || !canFill(x, y) {
- return MinInt, MinInt
+ if scan[x][y] == 0 {
+ scan[x][y] = '|'
+ return true
}
- scan[x][y] = '|'
- return x, y
+
+ if canFill(x, y+1) {
+ return fillSpot(x, y+1)
+ } else if canFill(x+1, y) {
+ return fillRight(x+1, y)
+ }
+
+ scan[x][y] = '~'
+ return true
}
func gud(x, y int) bool {
- return x != MinInt && y != MinInt
+ return x != MIN_INT && y != MIN_INT
}
func printScan() {
- fmt.Print(ClearScreen)
+ fmt.Print(CLEAR_SCREEN)
for y := minY; y <= maxY; y++ {
for x := minX; x <= maxX; x++ {
if scan[x][y] == 0 {