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 {