Started working on day 17

This commit is contained in:
Brian Buller 2018-12-17 16:53:07 -06:00
parent 08c6209701
commit 3f65da791c
4 changed files with 1989 additions and 1 deletions

View File

@ -42,8 +42,11 @@ func part1() {
} }
} }
var ticks int
func part2() { func part2() {
for len(cartMap) > 1 { for len(cartMap) > 1 {
ticks++
sort.Sort(ByPos(carts)) sort.Sort(ByPos(carts))
for _, c := range carts { for _, c := range carts {
if *c != 0 { if *c != 0 {
@ -54,6 +57,7 @@ func part2() {
for pos := range cartMap { for pos := range cartMap {
fmt.Printf("🔵: %0.0f,%0.0f\n", real(pos), imag(pos)) fmt.Printf("🔵: %0.0f,%0.0f\n", real(pos), imag(pos))
} }
fmt.Println("Ticks: ", ticks)
} }
type Cart struct { type Cart struct {
@ -69,7 +73,7 @@ func (c *Cart) tick() bool {
delete(cartMap, c.pos) delete(cartMap, c.pos)
c.pos += c.dir c.pos += c.dir
if cart, ok := cartMap[c.pos]; ok { if cart, ok := cartMap[c.pos]; ok {
fmt.Printf("❌: %0.0f,%0.0f\n", real(c.pos), imag(c.pos)) fmt.Printf("❌: %0.0f,%0.0f (%d ticks)\n", real(c.pos), imag(c.pos), ticks)
// Remove the cart we crashed into from the map // Remove the cart we crashed into from the map
delete(cartMap, c.pos) delete(cartMap, c.pos)
// And clear the cart's pos, we can ignore them now // And clear the cart's pos, we can ignore them now

182
2018/day17/day17.go Normal file
View File

@ -0,0 +1,182 @@
package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
"strings"
"time"
)
const (
MaxInt = int(^uint(0) >> 1)
MinInt = -MaxInt - 1
ClearScreen = "\033[H\033[2J"
)
func main() {
input := stdinToStringSlice()
part1(input)
//part2(input)
}
var scan [1000][1000]byte
var minX, maxX int = MaxInt, MinInt
var minY, maxY int = MaxInt, MinInt
func part1(input []string) {
for _, v := range input {
pts := strings.Split(v, ", ")
fst := strings.Split(pts[0], "=")
scd := strings.Split(pts[1], "=")
scdRange := strings.Split(scd[1], "..")
var x, y int
if fst[0] == "x" {
x = Atoi(fst[1])
for y = Atoi(scdRange[0]); y <= Atoi(scdRange[1]); y++ {
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] = '#'
}
}
}
printScan()
// The water starts at 500, 0
fillDown(500, 0)
}
func part2(input []string) {
}
// The 'fill<dir>' functions return the x, y that was filled
// or MinInt, MinInt, if x, y can't be filled
// 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
}
// 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] = '~'
}
}
return dx, dy
}
func fillLeft(x, y int) (int, int) {
fx, fy := fillSpot(x, y)
if !gud(fx, fy) {
return fx, fy
}
// 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 = fillLeft(fx-1, y)
if gud(rx, ry) {
return rx, ry
}
return x, y
}
func fillRight(x, y int) (int, int) {
fx, fy := fillSpot(x, y)
if !gud(fx, fy) {
return fx, fy
}
// 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
}
scan[x][y] = '|'
return x, y
}
func gud(x, y int) bool {
return x != MinInt && y != MinInt
}
func printScan() {
fmt.Print(ClearScreen)
for y := minY; y <= maxY; y++ {
for x := minX; x <= maxX; x++ {
if scan[x][y] == 0 {
fmt.Print(".")
} else {
fmt.Print(string(scan[x][y]))
}
}
fmt.Println()
}
}
func canFill(x, y int) bool {
return scan[x][y] == 0 || scan[x][y] == '|'
}
func minmax(x, y int) {
if x < minX {
minX = x
}
if x > maxX {
maxX = x
}
if y < minY {
minY = y
}
if y > maxY {
maxY = y
}
}
func stdinToStringSlice() []string {
var input []string
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
input = append(input, scanner.Text())
}
return input
}
func Atoi(i string) int {
var ret int
var err error
if ret, err = strconv.Atoi(i); err != nil {
log.Fatal("Invalid Atoi: " + i)
}
return ret
}

1794
2018/day17/input Normal file

File diff suppressed because it is too large Load Diff

8
2018/day17/testinput Normal file
View File

@ -0,0 +1,8 @@
x=495, y=2..7
y=7, x=495..501
x=501, y=3..7
x=498, y=2..4
x=506, y=1..2
x=498, y=10..13
x=504, y=10..13
y=13, x=498..504