From d64a18280f52e655dc0703a8421fec6910c61726 Mon Sep 17 00:00:00 2001 From: Brian Buller Date: Sun, 17 Dec 2023 10:52:08 -0600 Subject: [PATCH] 2023 Day 17 Complete --- 2016/day17-add/main.go | 60 +++++----- 2016/day17/main.go | 6 +- 2016/day18/main.go | 6 +- 2016/day19/main.go | 6 +- 2016/day20/main.go | 12 +- 2016/day21/main.go | 18 +-- 2016/day22/main.go | 28 ++--- 2016/day23/main.go | 24 ++-- 2016/day24/main.go | 16 +-- 2016/day25/main.go | 34 +++--- 2023/day17/input | 141 +++++++++++++++++++++++ 2023/day17/main.go | 247 +++++++++++++++++++++++++++++++++++++++++ 2023/day17/testinput | 13 +++ 2023/day17/testinput2 | 5 + go.mod | 8 +- go.sum | 24 ---- 16 files changed, 517 insertions(+), 131 deletions(-) create mode 100644 2023/day17/input create mode 100644 2023/day17/main.go create mode 100644 2023/day17/testinput create mode 100644 2023/day17/testinput2 diff --git a/2016/day17-add/main.go b/2016/day17-add/main.go index 96eaa69..0dd291b 100644 --- a/2016/day17-add/main.go +++ b/2016/day17-add/main.go @@ -7,7 +7,7 @@ import ( termbox "github.com/nsf/termbox-go" - "../../" + h "git.bullercodeworks.com/brian/adventofcode/helpers" ) var gridWidth, gridHeight int @@ -18,8 +18,8 @@ func main() { passcode := "pvhmgsws" gridWidth, gridHeight = 4, 4 if len(os.Args) >= 3 { - gridWidth = aoc.Atoi(os.Args[1]) - gridHeight = aoc.Atoi(os.Args[2]) + gridWidth = h.Atoi(os.Args[1]) + gridHeight = h.Atoi(os.Args[2]) } run := true err := termbox.Init() @@ -83,80 +83,80 @@ func PrintState(path, passcode string) { posX, posY := currPos(path) for y := 0; y < gridHeight; y++ { for x := 0; x < gridWidth; x++ { - fmt.Print(aoc.BorderNW) + fmt.Print(h.BorderNW) if posX == x && posY == y && doorIsOpen(path, passcode, 'N') { // Current Pos w/ open door - fmt.Print(aoc.BorderSE) - fmt.Print(aoc.BorderSW) + fmt.Print(h.BorderSE) + fmt.Print(h.BorderSW) } else if y == posY+1 && x == posX && doorIsOpen(path, passcode, 'S') { // Room below, w/ open door - fmt.Print(aoc.BorderNE) - fmt.Print(aoc.BorderNW) + fmt.Print(h.BorderNE) + fmt.Print(h.BorderNW) } else { // All other cases - fmt.Print(aoc.BorderWE) - fmt.Print(aoc.BorderWE) + fmt.Print(h.BorderWE) + fmt.Print(h.BorderWE) } - fmt.Print(aoc.BorderNE) + fmt.Print(h.BorderNE) } fmt.Println() for x := 0; x < gridWidth; x++ { if posX == x && posY == y && doorIsOpen(path, passcode, 'W') { - fmt.Print(aoc.BorderSE) + fmt.Print(h.BorderSE) } else { - fmt.Print(aoc.BorderNS) + fmt.Print(h.BorderNS) } if posX == x && posY == y { - fmt.Print(aoc.BorderNW) - fmt.Print(aoc.BorderNE) + fmt.Print(h.BorderNW) + fmt.Print(h.BorderNE) } else { fmt.Print(" ") fmt.Print(" ") } if posX == x && posY == y && doorIsOpen(path, passcode, 'E') { - fmt.Print(aoc.BorderSW) + fmt.Print(h.BorderSW) } else { - fmt.Print(aoc.BorderNS) + fmt.Print(h.BorderNS) } } fmt.Println() for x := 0; x < gridWidth; x++ { if posX == x && posY == y && doorIsOpen(path, passcode, 'W') { - fmt.Print(aoc.BorderNE) + fmt.Print(h.BorderNE) } else { - fmt.Print(aoc.BorderNS) + fmt.Print(h.BorderNS) } if posX == x && posY == y { - fmt.Print(aoc.BorderSW) - fmt.Print(aoc.BorderSE) + fmt.Print(h.BorderSW) + fmt.Print(h.BorderSE) } else { fmt.Print(" ") fmt.Print(" ") } if posX == x && posY == y && doorIsOpen(path, passcode, 'E') { - fmt.Print(aoc.BorderNW) + fmt.Print(h.BorderNW) } else { - fmt.Print(aoc.BorderNS) + fmt.Print(h.BorderNS) } } fmt.Println() for x := 0; x < gridWidth; x++ { - fmt.Print(aoc.BorderSW) + fmt.Print(h.BorderSW) if posX == x && posY == y && doorIsOpen(path, passcode, 'S') { - fmt.Print(aoc.BorderNE) - fmt.Print(aoc.BorderNW) + fmt.Print(h.BorderNE) + fmt.Print(h.BorderNW) } else { - fmt.Print(aoc.BorderWE) - fmt.Print(aoc.BorderWE) + fmt.Print(h.BorderWE) + fmt.Print(h.BorderWE) } - fmt.Print(aoc.BorderSE) + fmt.Print(h.BorderSE) } fmt.Println() } } func ClearScreen() { - fmt.Print(aoc.ClearScreen) + fmt.Print(h.ClearScreen) } func printUsageAndExit() { diff --git a/2016/day17/main.go b/2016/day17/main.go index 2e3709c..9438585 100644 --- a/2016/day17/main.go +++ b/2016/day17/main.go @@ -5,7 +5,7 @@ import ( "fmt" "os" - "../../" + h "git.bullercodeworks.com/brian/adventofcode/helpers" ) var gridWidth, gridHeight int @@ -19,8 +19,8 @@ func main() { } passcode = os.Args[1] if len(os.Args) >= 4 { - gridWidth = aoc.Atoi(os.Args[2]) - gridHeight = aoc.Atoi(os.Args[3]) + gridWidth = h.Atoi(os.Args[2]) + gridHeight = h.Atoi(os.Args[3]) } foundPaths := findPaths("", passcode) if len(foundPaths) == 0 { diff --git a/2016/day18/main.go b/2016/day18/main.go index 50abe40..67c869c 100644 --- a/2016/day18/main.go +++ b/2016/day18/main.go @@ -5,15 +5,15 @@ import ( "fmt" "os" - "../../" + h "git.bullercodeworks.com/brian/adventofcode/helpers" ) func main() { if len(os.Args) < 3 { fmt.Println("Usage: ./day18 ") } - input := aoc.FileToBytes(os.Args[1]) - numRows := aoc.Atoi(os.Args[2]) + input := h.FileToBytes(os.Args[1]) + numRows := h.Atoi(os.Args[2]) room := [][]byte{input} for row := 1; row < numRows; row++ { diff --git a/2016/day19/main.go b/2016/day19/main.go index 5068fef..3a264f7 100644 --- a/2016/day19/main.go +++ b/2016/day19/main.go @@ -3,14 +3,14 @@ package main import ( "fmt" - "../../" + h "git.bullercodeworks.com/brian/adventofcode/helpers" ) // pt1 input: 3014387 func main() { - partOne := aoc.ArgIsSet("-1") + partOne := h.ArgIsSet("-1") num := 3014387 - if aoc.ArgIsSet("-test") { + if h.ArgIsSet("-test") { num = 5 // Example } firstElf := CreateElf(1) diff --git a/2016/day20/main.go b/2016/day20/main.go index 42e3cce..cfb8fe1 100644 --- a/2016/day20/main.go +++ b/2016/day20/main.go @@ -6,18 +6,18 @@ import ( "sort" "strings" - "../../" + h "git.bullercodeworks.com/brian/adventofcode/helpers" ) func main() { - part1 := aoc.ArgIsSet("-1") - justSort := aoc.ArgIsSet("-sort") - input := aoc.StdinToStringSlice() + part1 := h.ArgIsSet("-1") + justSort := h.ArgIsSet("-sort") + input := h.StdinToStringSlice() var blacklists []Blacklist for i := range input { pts := strings.Split(input[i], "-") - st := aoc.Atoi(pts[0]) - end := aoc.Atoi(pts[1]) + st := h.Atoi(pts[0]) + end := h.Atoi(pts[1]) blacklists = append(blacklists, *CreateBlacklist(st, end)) } sort.Sort(ByStart(blacklists)) diff --git a/2016/day21/main.go b/2016/day21/main.go index 79ee29f..633c99a 100644 --- a/2016/day21/main.go +++ b/2016/day21/main.go @@ -4,13 +4,13 @@ import ( "fmt" "strings" - "../../" + h "git.bullercodeworks.com/brian/adventofcode/helpers" ) func main() { pw := "fbgdceah" // Part 2 Puzzle input - input := aoc.StdinToStringSlice() - if aoc.ArgIsSet("-1") { + input := h.StdinToStringSlice() + if h.ArgIsSet("-1") { pw = "abcdefgh" // Part 1 Puzzle input pw = scramblePassword(pw, input) fmt.Println(scramblePassword(pw, input)) @@ -23,7 +23,7 @@ func unscramblePassword(pw string, inst []string) string { // Brute force it. // Just get all permutations of the runes and return the one // for which the instructions return the input - tst := aoc.StringPermutations(pw) + tst := h.StringPermutations(pw) for i := range tst { if scramblePassword(tst[i], inst) == pw { return tst[i] @@ -37,15 +37,15 @@ func scramblePassword(pw string, inst []string) string { pts := strings.Fields(inst[i]) switch pts[0] + " " + pts[1] { case "swap position": - pw = swapPos(pw, aoc.Atoi(pts[2]), aoc.Atoi(pts[5])) + pw = swapPos(pw, h.Atoi(pts[2]), h.Atoi(pts[5])) case "swap letter": pw = swapLetter(pw, pts[2], pts[5]) case "reverse positions": - pw = reverse(pw, aoc.Atoi(pts[2]), aoc.Atoi(pts[4])) + pw = reverse(pw, h.Atoi(pts[2]), h.Atoi(pts[4])) case "rotate left": - pw = rotate(pw, aoc.Atoi(pts[2])*-1) + pw = rotate(pw, h.Atoi(pts[2])*-1) case "rotate right": - pw = rotate(pw, aoc.Atoi(pts[2])) + pw = rotate(pw, h.Atoi(pts[2])) case "rotate based": rotIdx := strings.Index(pw, pts[6]) if rotIdx >= 4 { @@ -54,7 +54,7 @@ func scramblePassword(pw string, inst []string) string { rotIdx++ pw = rotate(pw, rotIdx) case "move position": - pw = move(pw, aoc.Atoi(pts[2]), aoc.Atoi(pts[5])) + pw = move(pw, h.Atoi(pts[2]), h.Atoi(pts[5])) } } return pw diff --git a/2016/day22/main.go b/2016/day22/main.go index ef332c9..71396b6 100644 --- a/2016/day22/main.go +++ b/2016/day22/main.go @@ -8,7 +8,7 @@ import ( "strings" "time" - "../../" + h "git.bullercodeworks.com/brian/adventofcode/helpers" "github.com/fatih/color" termbox "github.com/nsf/termbox-go" ) @@ -16,7 +16,7 @@ import ( func main() { var inpFn string var done bool - if inpFn = aoc.GetArgNumber(1); inpFn != "" { + if inpFn = h.GetArgNumber(1); inpFn != "" { done = true } @@ -30,7 +30,7 @@ func main() { var menuPos int cursor := color.New(color.FgBlack).Add(color.BgWhite) for !done { - fmt.Println(aoc.ClearScreen) + fmt.Println(h.ClearScreen) title := color.New(color.FgBlack).Add(color.BgYellow) title.Println(CenterText("day 22", tWidth)) if menuPos == 0 { @@ -91,7 +91,7 @@ func main() { // Create the display d := CreateDisplay(tWidth, tHeight) if inpFn != "" { - input := aoc.FileToStringSlice(inpFn) + input := h.FileToStringSlice(inpFn) d.reset(CreateNodesFromInput(input)) } else { d.reset(GenerateNodesForGrid(sizeX, sizeY)) @@ -103,7 +103,7 @@ func main() { d.nodes[iToLoc(d.goalX, d.goalY)].Used = rand.Intn(75) } - if aoc.ArgIsSet("-1") { + if h.ArgIsSet("-1") { var viablePairs []string for _, v1 := range d.nodes { for _, v2 := range d.nodes { @@ -119,7 +119,7 @@ func main() { done = false for !done { - fmt.Println(aoc.ClearScreen) + fmt.Println(h.ClearScreen) d.PrintGrid() ev := termbox.PollEvent() if d.goalX == 0 && d.goalY == 0 { @@ -199,7 +199,7 @@ func CreateNodesFromInput(input []string) (map[string]*Node, int, int) { fmt.Println(err) continue } - nodes[aoc.Itoa(n.X)+";"+aoc.Itoa(n.Y)] = n + nodes[h.Itoa(n.X)+";"+h.Itoa(n.Y)] = n if n.X > maxX { maxX = n.X } @@ -456,7 +456,7 @@ func (d *Display) PrintGrid() { } func iToLoc(x, y int) string { - return aoc.Itoa(x) + ";" + aoc.Itoa(y) + return h.Itoa(x) + ";" + h.Itoa(y) } func AddViablePair(a, b *Node, list []string) []string { @@ -503,23 +503,23 @@ func CreateNodeFromDfListing(inp string) (*Node, error) { n := new(Node) parseLoc := strings.Split(pts[0], "-") if parseLoc[1][0] == 'x' { - n.X = aoc.Atoi(parseLoc[1][1:]) + n.X = h.Atoi(parseLoc[1][1:]) } if parseLoc[2][0] == 'y' { - n.Y = aoc.Atoi(parseLoc[2][1:]) + n.Y = h.Atoi(parseLoc[2][1:]) } - n.Size = aoc.Atoi(strings.TrimSuffix(pts[1], "T")) - n.Used = aoc.Atoi(strings.TrimSuffix(pts[2], "T")) + n.Size = h.Atoi(strings.TrimSuffix(pts[1], "T")) + n.Used = h.Atoi(strings.TrimSuffix(pts[2], "T")) return n, nil } func (n *Node) GetLocString() string { - return aoc.Itoa(n.X) + ";" + aoc.Itoa(n.Y) + return h.Itoa(n.X) + ";" + h.Itoa(n.Y) } func (n *Node) ToString() string { - return fmt.Sprint("[", n.GetLocString(), "](S:", aoc.Itoa(n.Size), ";A:", aoc.Itoa(n.Size-n.Used), ";U:", aoc.Itoa(n.Used), ")") + return fmt.Sprint("[", n.GetLocString(), "](S:", h.Itoa(n.Size), ";A:", h.Itoa(n.Size-n.Used), ";U:", h.Itoa(n.Used), ")") } func CenterText(txt string, width int) string { diff --git a/2016/day23/main.go b/2016/day23/main.go index 8324875..4ee8739 100644 --- a/2016/day23/main.go +++ b/2016/day23/main.go @@ -10,7 +10,7 @@ import ( "github.com/fatih/color" termbox "github.com/nsf/termbox-go" - "../../" + h "git.bullercodeworks.com/brian/adventofcode/helpers" ) var regs = map[string]int{ @@ -30,17 +30,17 @@ func main() { var debug bool var inpFn string var done bool - if inpFn = aoc.GetArgNumber(1); inpFn == "" { + if inpFn = h.GetArgNumber(1); inpFn == "" { done = true } if inpFn != "" { - instructions = aoc.FileToStringSlice(inpFn) + instructions = h.FileToStringSlice(inpFn) } - if aoc.ArgIsSet("-d") { + if h.ArgIsSet("-d") { debug = true } - if aoc.ArgIsSet("-p") { + if h.ArgIsSet("-p") { pause = true } err := termbox.Init() @@ -119,11 +119,11 @@ func main() { // If we have a jnz c -2 it could be moving all of c into another register v, ok := regs[ins[1]] if !ok { - v = aoc.Atoi(ins[1]) + v = h.Atoi(ins[1]) } var p int if p, ok = regs[ins[2]]; !ok { - p = aoc.Atoi(ins[2]) + p = h.Atoi(ins[2]) } if v != 0 { // Subtract 1 from the jump because we incremented already @@ -142,10 +142,10 @@ func main() { } var src1I, src2I int if src1I, ok = regs[src1]; !ok { - src1I = aoc.Atoi(src1) + src1I = h.Atoi(src1) } if src2I, ok = regs[src2]; !ok { - src2I = aoc.Atoi(src2) + src2I = h.Atoi(src2) } regs[dst] = src1I * src2I case "cpy": @@ -161,7 +161,7 @@ func main() { regs[dst] = v } else { // It's not, must be an int - regs[dst] = aoc.Atoi(src) + regs[dst] = h.Atoi(src) } case "inc": if _, ok := regs[ins[1]]; !ok { @@ -179,7 +179,7 @@ func main() { if v, ok := regs[src]; ok { srcI = v } else { - srcI = aoc.Atoi(src) + srcI = h.Atoi(src) } srcI = curr + srcI if srcI < 0 || srcI > len(instructions)-1 { @@ -213,7 +213,7 @@ func main() { // Fancy State Printing func PrintState() { - fmt.Println(aoc.ClearScreen) + fmt.Println(h.ClearScreen) PrintRegs() } diff --git a/2016/day24/main.go b/2016/day24/main.go index 3decc58..6b11d63 100644 --- a/2016/day24/main.go +++ b/2016/day24/main.go @@ -9,13 +9,13 @@ import ( "github.com/fatih/color" - "../../" + h "git.bullercodeworks.com/brian/adventofcode/helpers" ) var tWidth, tHeight int func main() { - fileNm := aoc.GetArgNumber(1) + fileNm := h.GetArgNumber(1) if len(os.Args) < 2 { fmt.Println("Usage: ./day24 ") os.Exit(1) @@ -32,14 +32,14 @@ func main() { } } } - poiPerms := aoc.StringPermutations(poiString) + poiPerms := h.StringPermutations(poiString) shortest := -1 var shortestPerm string for _, perm := range poiPerms { if perm[0] != '0' { continue } - if aoc.ArgIsSet("-2") { + if h.ArgIsSet("-2") { // For part 2 we return to 0 perm = perm + "0" } @@ -79,8 +79,8 @@ type Floor struct { func CreateFloorFromFile(fileNm string) *Floor { f := new(Floor) - f.debug = aoc.ArgIsSet("-d") - f.cells = aoc.FileToStringSlice(fileNm) + f.debug = h.ArgIsSet("-d") + f.cells = h.FileToStringSlice(fileNm) for y := range f.cells { for x := range f.cells[y] { if f.cells[y][x] != '#' { @@ -101,7 +101,7 @@ func CreateFloorFromFile(fileNm string) *Floor { // Find the shortest paths between all points of interest f.shortestPaths = make(map[string]int) - if aoc.ArgIsSet("-2") { + if h.ArgIsSet("-2") { /* Output from running part 1 1;2 232 @@ -301,7 +301,7 @@ func (f *Floor) Solve(x, y, dist int) (Path, bool) { if !tPathContains { f.testedPath.Append(wrkCoord) if f.debug { - fmt.Println(aoc.ClearScreen, f.start.Name(), "=>", f.end.Name(), "\n", len(f.testedPath.coords), "/", f.cellCount, "\n", "Shortest:", shortestFound) + fmt.Println(h.ClearScreen, f.start.Name(), "=>", f.end.Name(), "\n", len(f.testedPath.coords), "/", f.cellCount, "\n", "Shortest:", shortestFound) f.PrintPath(f.testedPath) time.Sleep(time.Millisecond * 50) } diff --git a/2016/day25/main.go b/2016/day25/main.go index 2d4879d..96bba30 100644 --- a/2016/day25/main.go +++ b/2016/day25/main.go @@ -10,7 +10,7 @@ import ( "github.com/fatih/color" termbox "github.com/nsf/termbox-go" - "../../" + h "git.bullercodeworks.com/brian/adventofcode/helpers" ) var regs = map[string]int{ @@ -33,20 +33,20 @@ var outBuff string // -25 Run day 25 simulation func main() { var inpFn string - if inpFn = aoc.GetArgNumber(1); inpFn == "" { + if inpFn = h.GetArgNumber(1); inpFn == "" { done = true } if inpFn != "" { - instructions = aoc.FileToStringSlice(inpFn) + instructions = h.FileToStringSlice(inpFn) } - if aoc.ArgIsSet("-d") { + if h.ArgIsSet("-d") { debug = true } - if aoc.ArgIsSet("-p") { + if h.ArgIsSet("-p") { pause = true } - if aoc.ArgIsSet("-25") { + if h.ArgIsSet("-25") { // If running the day 25 simulation, ignore debug and pause flags fmt.Println("Running Day 25 simulation, disabling debug & pause") debug = false @@ -65,7 +65,7 @@ func main() { go readUserInput(eventChan) go sendNoneEvent(eventChan) } - if aoc.ArgIsSet("-25") { + if h.ArgIsSet("-25") { var day25Solved bool regAStart := regs["a"] regBStart := regs["b"] @@ -164,14 +164,14 @@ func ProcInstructions() { if !ok { outBuff += ins[1] } else { - outBuff += aoc.Itoa(v) + outBuff += h.Itoa(v) } - if aoc.ArgIsSet("-25") && len(outBuff) == 10 { + if h.ArgIsSet("-25") && len(outBuff) == 10 { // This should be long enough for our day 25 answer return } // If we're not debugging, just print it and reset the buffer - if !debug && !aoc.ArgIsSet("-25") { + if !debug && !h.ArgIsSet("-25") { fmt.Print(outBuff) outBuff = "" } @@ -179,11 +179,11 @@ func ProcInstructions() { // If we have a jnz c -2 it could be moving all of c into another register v, ok := regs[ins[1]] if !ok { - v = aoc.Atoi(ins[1]) + v = h.Atoi(ins[1]) } var p int if p, ok = regs[ins[2]]; !ok { - p = aoc.Atoi(ins[2]) + p = h.Atoi(ins[2]) } if v != 0 { // Subtract 1 from the jump because we incremented already @@ -202,10 +202,10 @@ func ProcInstructions() { } var src1I, src2I int if src1I, ok = regs[src1]; !ok { - src1I = aoc.Atoi(src1) + src1I = h.Atoi(src1) } if src2I, ok = regs[src2]; !ok { - src2I = aoc.Atoi(src2) + src2I = h.Atoi(src2) } regs[dst] = src1I * src2I case "cpy": @@ -221,7 +221,7 @@ func ProcInstructions() { regs[dst] = v } else { // It's not, must be an int - regs[dst] = aoc.Atoi(src) + regs[dst] = h.Atoi(src) } case "inc": if _, ok := regs[ins[1]]; !ok { @@ -239,7 +239,7 @@ func ProcInstructions() { if v, ok := regs[src]; ok { srcI = v } else { - srcI = aoc.Atoi(src) + srcI = h.Atoi(src) } srcI = curr + srcI if srcI < 0 || srcI > len(instructions)-1 { @@ -270,7 +270,7 @@ func ProcInstructions() { // Fancy State Printing func PrintState() { - fmt.Println(aoc.ClearScreen) + fmt.Println(h.ClearScreen) PrintRegs() } diff --git a/2023/day17/input b/2023/day17/input new file mode 100644 index 0000000..236abbc --- /dev/null +++ b/2023/day17/input @@ -0,0 +1,141 @@ +131521531314413165554663355645644257613274614177575564515343675763343717733131466417431176612316451651616515743463261461663563523613444154252 +254321311411454534466161643621353541657535174621665776157212576336534177224356633176673161736154621567774544771521656112526146345152542542144 +551351111513441213121553332663651663461337267643135466575723446757536642575253255533424362727626726757571773547675755535113411643655666421155 +432441114441634623124235621172721357265624163241322367515467653777221636524525344476227651326213614237251362626121272326365414252511244543235 +123446644263133636563125442513327163531257754357124723174461274634486378448662787433262446144331424545356266752331761255666153254422331442312 +445531164461411225156114224751735714616427722742152675535468555464266323232755552472777255653516754653257163141164722372651154162333652316333 +342144656363316445422515743357366245625611741277741824258248645367823568263784886374334356656335213467665443136135333431646623365511355246456 +552242522226252421251272356151666171264443651417744227455576525533885424286843432245373223424634724772576436333712761676744425361351245632312 +612551451436464246322217334227753733547232667136642536657455822665788622252375362863766734462662722253271747771377641346653653415654244224661 +353634434225211132116644241741437442465514222678864478678466525448527772774526335383726558467633287737752127763676562715531752215424315464342 +211262235215333566414164677164434362344228654467842353645887736675532724265877647772354547825677646382537456437353641734264226136666534644435 +533343166334146455664537412731425332573423823422777423632786544384636536253447666743784665378843644465827171724436345114652646734635516641633 +143123132166633162271477311632743722677843628866743256554535447473822765536762465544586458248543657864675147373475472252544262622316551126552 +332562532161613237422345157536347631248873425526288742323286432873728776732463455255258268268457875678284845331214174444512574776535662463532 +245221445436116317321453527742355273752233262374487478544854368647687784763246268852475754382258272883644568427363264216524356364415645451246 +264543412551657621637447174356572536667683464443827544447575824883472587527728326723628335774846256622433776533361432756433277152321124463512 +613364515655656321551417635422654426673422652787485555452658228388545846585323553246358357634666575525256236586351257656764751163315255643534 +435252225517227625163447742427648835382284587243867887833732445527774345547893884737537783337765433456784767872425614362473664111542112545544 +225633616513222474673555542614286826263775267486775553772485846897789589597653799376452288678852788288336585438363347456322352412632643614132 +654241553746415256745216112453885877373724675557524544347657774979337333965636458845393554432754543426628277745378341645442256777152643453121 +216464644454265454532564473624788458283825688482328729675888995368379957858787885695586869742528385637235838856547866155415164775431432235554 +622314657242364465565254745528228332727266425546547648695594689684387486798363494693848648473673727322462662585827826225211416135651164532256 +114361346312663445432743886276387267674883665537446646989959663948435849757745834494533736563555433353683625435537845262516542765435346213443 +422663644132375537643543877864767527248522473453569335759446368544846665344645434547945469746774555787268626732884624358436574642323324454325 +226341577473112443162244586222845646847552753757788658649676733985497444849695535597535697496769844745485388734243222726643422534451373117513 +215472262113561361133474334862723656256728456968496385844374433575895993449636658746788999898878788642658833734243343553485366621134175237562 +565142545162432335553645537766844326326544996936664586998736684956767697854433548688773458483663436788884768568745888732227567142551411642364 +363537234121663665278485344384667833682953653479696679589435458338545375954655673766548499774993495355372642826433385678662727353254461754734 +335541163653142161323677583264278247276648946559958844436637587834838785785453679575468599674467395935957466645432833573742617126172416334134 +317563475422251172574344727256677577634368344447864944547668836567796686494873693878458439893745998933358384886328436556234854222565272711172 +316443612746646713488784247722333786548887667668668375357656957583856756587658999343856557595585569646497874248866752358752586657245363566651 +742665262276145343647875365366373759474785987498366383695555835466747866464789467865974867958553355899576384824455556673824742521333347142314 +271521715675114643658577252753763839567865435357557853379778854559884856689986466648878877765799635783987858442278436524688655834615546116353 +363573516327262688343535534742722436488657749977985535337974556878665767764775556869495596555863845588534335376337528372644428775517625556422 +232647476772633645537644768225876674836684698367944857887884659565976886477658474569759887987398398874853799789462835538738726246523162623531 +712345444646653567657745553844267657744569954634454987657989897475868984847698797878498688487683659486867554879933545253452883652655562347221 +676716513661688827573886668724459838494548389948787896567578798978856857544987867578846496658639995958553668356364665686272442424272656656657 +714563243744275258674484426359669765395947843863878796986697547794576579979975645567454857577554393875499974684438882383374554827715172245661 +733763641216248357287546438575537339337499676434569898845474695987468764777467855984966594595874874379463878784649555685865384558224476466154 +122175543158336566874662376748875735649973573568764778997779598477757954954989574988458759895664873595565466734638458242528226373785336362332 +245463144775558287534254833967339637358996933885979587889679775584578679985649568594778984475647786589339893958684896754458774228456276124214 +757612743438282725557758249659766865595469939647467989945445479469546689454749664876785468576657476748836896895495389332624867288477646413323 +722153352662427622347825239359449948757556785558599957977767664969767684645569474796798845687576658859457333933675993868425865252888546676647 +655172344678257853883425794755679953849744849664489954896778589796459746486799656484979458684865894847475668889686433438764443366244261232656 +162462531888742232875488866567767735336657446789967885546767765569585585878985767889455874674468459445785486694798397497526632722477644716674 +242353233478824387537334694964738445464895475449878565488667855989766885785769795776765474768476484745794459435747853436273875878743561414273 +664715236735588465352229986888373699885574789677658545769846568966867885877995586767979548665677664568549576557445648664254888466854277667242 +543247622573868422872537474863958775877598674769697974668449687667558969788666997786786869848457465497697785358657948738362436233685734315554 +635516668624276843427654786688543776684996669666697956564987777575865967656995798565886787774789776765488694666845946886733754223688463413553 +726244332658246283737747437649883848645896958587858488488759757659759969996765866688768677694488444695566738883396794664936528228532658437224 +663731384784678252356373539867557655666699595956579948955789958697957596756576667998567798699447466798745658593579786357767864226285742524715 +565543444788663227462389697377874577598877984677568875797858597576985768598888865975896867694694759778745854749639556798552872656625468332424 +153325656864776582846465377559367577978448769955584455558579677685565899578959668779659876588759985648747757838633694863485344474248856336147 +536374735686762633228836739769564699869444449969458785996557789755858578789998789787965675666559568745865685583834839873854687685782833264465 +774773863338734283336634947736939687769749974559698998679767795785577765976587565996955867668799798958846855669795737335876224468444826256472 +561224576433232354749483886455637689857478557877876957565568697695866678969967867657585885996576756596686797737676679646538976386738738427143 +235423764823584788654934486537698565489955588954976667585596656788875797968796857776859586868969856864975997484565485574654937683756838425314 +356477878377755324746474936736734765775944656889979598757585665579988868799587786686987889999954784888846786659879456499857676766658364866753 +343463783884548723286545357959568655898755558749578868987898867769887798668886657878966685585885668747654655793867948788339943682533437444137 +721478685435244783563943339558694757886457669789697856685986698867789767866867979556565568697688865648746878596489456635983877677674485374171 +571274872383884835338375798745369969446445489957855578566598965887866686677979698758798578656968596694987675665346765639936774526235864842312 +441162566683346665976974596739867576945789746989695588986669597898777886896667878896898577889768599888898448859847695959545537275537742543517 +267273334848287463887834665984947565779488854497557959988776897989977987897769799958958557699565659598864695454874464988445866643562383728822 +333585242832838557448544874996398588955749757579685868796887867668869986779889877699696668696576987499756846796678897438365733268448387837721 +624624724588444535778636655556385686555489455587596795598798767879688886967678969989885766769575676664769584868838379469448882456427437777332 +342445435623444563383969633857884555985997485885867978775986976967968698796787996786679957595899965476678768666683843937378788782733578487321 +171185248322547583488847338593699554579744765766575797879786987768889898996768777887559768556756557579795467984847459833787935483868664264773 +665282632778825737797689495978874748644998956778688759896567668687999968787686976977767567897598859569489957976776537883676394557585642877876 +612255333377233543738586964773677457874877976785558895967667688869697999869987889779766795859986769997956764857457399589734398852568546223566 +145468486222328253765834868956445954658785665567789998677578978967768888789796879967657677975989899779994567596986444576439838758342622674675 +555688565735352444387589856376789895994955498575598696587667686689787969898769968887688777589856878548899475899848464896567563534547227635345 +677357723425675467383579757799699445867568477577776778556968678987879967787797769666895986598586686566869497454747434678938653233363355767461 +343568483385257574437438757565798657995855788787667787666586899979878689678896999866789755567799675797994955697746859968484855277436486656863 +326676886762328437836595893999567966488576559585666695655786686668789778666678988899669778586599855669448889967578995874367875348545575623764 +371243428277463637346789636578988747995849649857879666899777979767767969986798966877787568889568986675556557599443776345574776687868823538237 +775225382257568444896473954597499889489678766996589796897587687696779788869689887969765677796965979998644748696659877944538995664453245745713 +523343358253743468855658847849676597847985889578575766666676888787997699677979768669885756567697874758486656665473877443653899687667264868855 +643427332753365463837574885546597597755855654586897959668986898667798888678896796699959955889986798679454988485997555546787977648856858585453 +157342282823457268346378938388974764988879978957558856695866676988996686767689779869956556977665976586498675447644453988974534488672853367323 +547125787522487233446878759439477697767787846798666958759687899996689977787677789965696767755676898966587989946453634444666443827537356357417 +254287473232444758783646563945637468497764944967676877758786777776678777999779868676899678798678966968784894867483584376854346357755777563615 +554165726834468847535767685943965566857765445598565867696858658996879668998866798768899888859897874968669766487856396858488843252335428574614 +265285777545335665856578776754396844479984767788998866565659786999798777669678689998685879787887599644555497887434356499347564847486545377875 +463447737288846887363964563767956566946794698768668666769679578988998899969678586985567767778955776756878594555989946545637498337328336528445 +261518474486245283833345487479573584778948758558599568687687999996676777776986987865888665999697747687685676543856553663387534734242786656752 +635147647263678582663677689884565577447959675688756965867568785969765596768896876857899567677776476744778565664837479835966876435584855438552 +557545647383765527296379893848895364766854766956796555688659956855796759999596766658696675989774894459968947945477557797753356627275437576451 +543613286777256843584479776587398679479495546678668986866986855957767899859988796879867776658587798994898995978838665698356774475837726654322 +223747357427768788726395498953637395998687499976578559569769889997698957679869997955867766796898475858794587465646695333696855243452683736543 +126324266572355663683783669856569476689944857466884765857857875856795595985967969598877985794798546547858686499398878366738824633334545353453 +546666463268542254564365887733579495856749598984795479966977865897768755888587558999658677549659449777795578449457849378766454458867278271227 +766752328754236626825668547473844463764845755776958546666756868655758798865789867687567887978787756847765974397953956534658853274835487783462 +242677674625253274522576448565877645475794967467644589787797859877587756656978975956886685698466965448779444446545893659997624427427366615475 +113662224244372372723544453597458793589944555979549497565696995966568989586766599677665765465496454968884796765336693367488383663774673225145 +575753446257728322467895394765459734835575565857565556957777858769597798698895589886557775975798844849656389393863863653822634747827238847223 +554153776364424272764426774777676399395977866559474947589787766985557798697567965669585986854884874859855975796588655668377373286357252631174 +555244763773384488245347597965877633475846965565669789948477957598756895566668756799644955744869477656793878566746333758727886248265737755636 +511462132578858542236436694355554578853676445945997856448748646899858985975889799764955695567987556696765498687994989485246856478225226172574 +275522616565387258763578345996978993475499849674694598656845856795646869668446678689766596496445744674663453464586648878862754265574666522577 +152232356188688367332425688887946773766664879784577748499596475457559886994487644798444876998656679775788534663736654882763484835227353553552 +343737252228848383547477776879538447646893689884654494766899888495969754648886475844946555787879559474637685898974749922727287538454657662127 +252444474342645787874645678965753334547888458997778966874954579854765887658996699685459868868458666559539833535573898283343553387556441336344 +661712736574455876442864833846745865373967699557884867878495455977664559769564685785946565879496566737795635655388673547286326747723266741762 +124475116337557533256422835966367476894597469386954895876566479988545986749687449979467764988656869958474577447939556788882768256347462315262 +433454471737233374643548238449498658585479737886789557866555557994798898984866578795977485555486738583769934337569936326823442525561326461611 +541231543366377387642534526457768773693478939465647847475465956969675584576978697874498447487653936799635695638539237628842758573363364244756 +354573425252154245356873543836883355547477563889744546987574889667989448946668788587978774543397963683688469577976737356647553282474174674151 +123154734516772566258276348725837979558866478339588375595485665487756598459756756559668594798785797874467336535727737826742885867162342472512 +367165651276364244327676365568854845666585644859436767787796599864858776777688768799756558857583836585499836558266527458775282767233672416425 +132441731572413583234527458865658456647337674533938985874577755957494878486467547947466894954774446357849745853473765858765555255214464653375 +527164715264551736546338555422635575676478986439679383734844668588747986795666449789565886678865737536568958464638652557862585234773135623445 +473625123377214358878243625673256488348333495557483884763439858994688677498647866993585698378848534737439995367485285762367328326667534657353 +442431532514243627534484657636227557597479944895477544977854758949496884876898434768476364673385596964499868377222553456365768461255361637556 +317412461772761314567546567654427564785793459547789685685974586963888446554335985878447366867467589477966467757732535883765647534613145447772 +512136722424557276145657582267746274227834668466739475373867455447374536859737564594494665577387449448853887772628866435788562116752661565155 +144234437532544772134645682624352477248643747445769465349587673673336359744776597669846434537747639598447388383752557562274543565773514217133 +325635414524451217564245676352236365566675749543883949339788349878373376599496397478966888394567948966275457287763373827273665447166371675612 +556154253526567771363435622544437723757534733538439833588595636596697579886753895644834987678939483933222572577226437654783437451171637775125 +146242634575476636116238468742337248338788458676785667697553797987569747374585795697993473487974964282367753483257442868853154734626741552414 +316567527457122337416542227424577337725326464774345975345636936557445489875643739488559958667897955363647853337622776748152761514333462723411 +253216352444247441363736244682682354248766426652678476733789594788465357889577799784787449938544382835352547757743333653561221641643142664615 +143115265131671266253721675324423667877248338226389557398987356973334465745985434633884755449483432882474524457362348465717213534237666625533 +463225654541344717346262573758663336456256826757585843589995367637476393738379948886967996358527477574237657666784758714425324234117237352565 +533523555534463145375222277172236865722364656362632534663876464694566536999879476635973874373255565572677347453564347524677422257275651444426 +422162111612337777416173771154677237664625775282324875872666889397344535997987459739587634844273627475287638837524256515614712273677671341252 +145411356257217722114476717424533622534725643655474468486445468486885583679699373745455657345888562844625266632247472227623745663743213161456 +152156654514233422146645176572565685848857838673588635535356454663432632654455727677678372668756463276686647242555514673313476523656262253266 +666225453426565773663762227144571324234858554658757324475233483728657547687586582866757272587762554347556866346244441234521463655765431325112 +511136633534477724515111652715427375553642345842856457656822754425558468564583645677625385235535786884524528821133653335352326527734465231526 +143535341544163716473632713155753265747373874644725765653344348325252663478358388724827777857577282347634877163212333457436166276366611442254 +365452251135242173735434344453537644726734378234684827753877243545634427522263888664277234483544762567626131764654166452231277175236243534344 +265453353544244422172733513775235334637648856626634275787777587627864637732435678645678782253242484665451212361246275361646767613351126113446 +351164446164565347672555143725344133531222564256383333367347623324758686528454442638622425287467732385154477324351617527514553341336614326625 +635525653613153621765576657622261763533272712364863262354784862876832466546357488887572853834832568215625715673763361425345326112126513625516 +133546455652256514234762455172227653166374752224866336348537424423232625226758824725835275754788667315776773644162434677276544214535143452133 +546433443346524662342141452141156551252777472141825222882733566325672334348754852647687568528621175561161645225665547711254124642313355256531 +512246346516263262156146252342456171731225451121711833732673568377675737344646365233227875382243112522526235726547133736551446244145652645315 +333554234526135462565532526655616427174352422567454241226847482647684775336284762663226662331434356142117754376611323415141226611346542541342 +132233616631113614415163246465561151235211615722654454661763477364446875527263226337724654417171457672576522165442766724162511413346523112141 +415524312615655662311343327662346226346475442247556767434567325742333762626637153121541617253443571674174324232543472364252353664523655562344 +315122331212345234666316461662714174774112716446152344247762426533263122662171731364456714145662776273426434357543316152365314263542426365135 diff --git a/2023/day17/main.go b/2023/day17/main.go new file mode 100644 index 0000000..bb4430a --- /dev/null +++ b/2023/day17/main.go @@ -0,0 +1,247 @@ +package main + +import ( + "fmt" + + h "git.bullercodeworks.com/brian/adventofcode/helpers" +) + +func main() { + inp := h.StdinToStringSlice() + part1(inp) + fmt.Println() + part2(inp) +} + +func part1(input []string) { + m := h.StringSliceToCoordByteMap(input) + + fmt.Println("# Part 1") + fmt.Println(solve(&m, 0, 3)) +} + +// 1188 is too low +func part2(input []string) { + m := h.StringSliceToCoordByteMap(input) + + fmt.Println("# Part 2") + fmt.Println(solve(&m, 4, 10)) +} + +func solve(m *h.CoordByteMap, minStraight, maxStraight int) int { + q := NewPriorityQueue[heatState](func(a, b heatState) int { + return a.heatLoss - b.heatLoss + }) + q.Push(heatState{ + state: state{ + pos: &h.Coordinate{X: m.TLX + 1, Y: m.TLY}, + dir: dirE, + dirCount: 1, + }, + }) + q.Push(heatState{ + state: state{ + pos: &h.Coordinate{X: m.TLX, Y: m.TLY + 1}, + dir: dirS, + dirCount: 1, + }, + }) + end := h.Coordinate{X: m.BRX, Y: m.BRY} + visitedCoords := make(map[h.Coordinate]bool) + visited := make(map[string]int) + + for q.IsNotEmpty() { + chk := q.Pop() + if !m.ContainsCoord(*chk.state.pos) { + continue + } + heat := int(m.Get(*chk.state.pos)-'0') + chk.heatLoss + if chk.state.pos.Equals(end) && chk.dirCount >= minStraight { + return heat + } + if visHeat, ok := visited[chk.state.String()]; ok { + if visHeat <= heat { + continue + } + } + visitedCoords[*chk.state.pos] = true + visited[chk.state.String()] = heat + if chk.dirCount >= minStraight { + // Add Left Turn + left := chk.dir.LeftTurn().Get(chk.pos) + if m.ContainsCoord(*left) { + q.Push(heatState{ + state: state{ + pos: left, + dir: chk.dir.LeftTurn(), + dirCount: 1, + }, + heatLoss: heat, + }) + } + // Add Right Turn + right := chk.dir.RightTurn().Get(chk.pos) + if m.ContainsCoord(*right) { + q.Push(heatState{ + state: state{ + pos: right, + dir: chk.dir.RightTurn(), + dirCount: 1, + }, + heatLoss: heat, + }) + } + } + + if chk.dirCount < maxStraight { + // Add Straight + straight := chk.dir.Get(chk.pos) + if m.ContainsCoord(*straight) { + q.Push(heatState{ + state: state{ + pos: straight, + dir: chk.dir, + dirCount: chk.dirCount + 1, + }, + heatLoss: heat, + }) + } + } + } + return h.MAX_INT +} + +type state struct { + pos *h.Coordinate + dir direction + dirCount int +} + +func (s state) String() string { + return fmt.Sprintf("%s-%s-%d", s.pos, s.dir, s.dirCount) +} + +type heatState struct { + state + heatLoss int +} + +type PriorityQueue[T comparable] struct { + items []T + comparator func(a, b T) int +} + +func NewPriorityQueue[T comparable](comparator func(a, b T) int) PriorityQueue[T] { + return PriorityQueue[T]{comparator: comparator} +} +func (pq *PriorityQueue[T]) Push(item T) { + pq.items = append(pq.items, item) + pq.heapifyUp(len(pq.items) - 1) +} +func (pq *PriorityQueue[T]) Pop() T { + top := pq.items[0] + lastIndex := len(pq.items) - 1 + pq.items[0], pq.items[lastIndex] = pq.items[lastIndex], pq.items[0] + pq.items = pq.items[:lastIndex] + pq.heapifyDown(0) + return top +} +func (pq *PriorityQueue[T]) Peek() T { + return pq.items[0] +} +func (pq *PriorityQueue[T]) Len() int { + return len(pq.items) +} +func (pq *PriorityQueue[T]) IsEmpty() bool { + return len(pq.items) == 0 +} +func (pq *PriorityQueue[T]) IsNotEmpty() bool { + return !pq.IsEmpty() +} +func (pq *PriorityQueue[T]) heapifyUp(index int) { + for index > 0 { + parentIndex := (index - 1) / 2 + if pq.comparator(pq.items[index], pq.items[parentIndex]) < 0 { + pq.items[index], pq.items[parentIndex] = pq.items[parentIndex], pq.items[index] + index = parentIndex + } else { + break + } + } +} +func (pq *PriorityQueue[T]) heapifyDown(index int) { + for { + leftChild, rightChild, smallest := 2*index+1, 2*index+2, index + if leftChild < len(pq.items) && pq.comparator(pq.items[leftChild], pq.items[smallest]) < 0 { + smallest = leftChild + } + if rightChild < len(pq.items) && pq.comparator(pq.items[rightChild], pq.items[smallest]) < 0 { + smallest = rightChild + } + if smallest != index { + pq.items[index], pq.items[smallest] = pq.items[smallest], pq.items[index] + index = smallest + } else { + break + } + } +} + +type direction h.Coordinate + +func (d direction) Get(from *h.Coordinate) *h.Coordinate { + switch d.String() { + case "N": + return from.GetNorthCoord() + case "E": + return from.GetEastCoord() + case "S": + return from.GetSouthCoord() + case "W": + return from.GetWestCoord() + } + return from +} +func (d direction) LeftTurn() direction { + switch d.String() { + case "N": + return dirW + case "E": + return dirN + case "S": + return dirE + default: + return dirS + } +} +func (d direction) RightTurn() direction { + switch d.String() { + case "N": + return dirE + case "E": + return dirS + case "S": + return dirW + default: + return dirN + } +} +func (d direction) String() string { + switch { + case d.X == dirN.X && d.Y == dirN.Y: + return "N" + case d.X == dirE.X && d.Y == dirE.Y: + return "E" + case d.X == dirS.X && d.Y == dirS.Y: + return "S" + default: + return "W" + } +} + +var ( + dirN = direction{X: 0, Y: -1} + dirE = direction{X: 1, Y: 0} + dirS = direction{X: 0, Y: 1} + dirW = direction{X: -1, Y: 0} +) diff --git a/2023/day17/testinput b/2023/day17/testinput new file mode 100644 index 0000000..f400d6e --- /dev/null +++ b/2023/day17/testinput @@ -0,0 +1,13 @@ +2413432311323 +3215453535623 +3255245654254 +3446585845452 +4546657867536 +1438598798454 +4457876987766 +3637877979653 +4654967986887 +4564679986453 +1224686865563 +2546548887735 +4322674655533 diff --git a/2023/day17/testinput2 b/2023/day17/testinput2 new file mode 100644 index 0000000..e456899 --- /dev/null +++ b/2023/day17/testinput2 @@ -0,0 +1,5 @@ +111111111111 +999999999991 +999999999991 +999999999991 +999999999991 diff --git a/go.mod b/go.mod index 2d3b962..e9a1d67 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module git.bullercodeworks.com/brian/adventofcode -go 1.16 +go 1.20 require ( github.com/br0xen/termbox-screen v0.0.0-20190712162752-c91f70ac38c6 @@ -8,8 +8,12 @@ require ( github.com/fatih/color v1.7.0 github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 github.com/go-gl/glfw v0.0.0-20191125211704-12ad95a8df72 + github.com/nsf/termbox-go v0.0.0-20190817171036-93860e161317 +) + +require ( github.com/mattn/go-colorable v0.1.4 // indirect github.com/mattn/go-isatty v0.0.10 // indirect github.com/mattn/go-runewidth v0.0.7 // indirect - github.com/nsf/termbox-go v0.0.0-20190817171036-93860e161317 + golang.org/x/sys v0.0.0-20191008105621-543471e840be // indirect ) diff --git a/go.sum b/go.sum index f4dcab7..f32e199 100644 --- a/go.sum +++ b/go.sum @@ -1,27 +1,13 @@ -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/br0xen/termbox-screen v0.0.0-20190712162752-c91f70ac38c6 h1:QaQWdi0Kgk1v+DW35aaBsEpoig3smyjJy2M6e/dePjM= github.com/br0xen/termbox-screen v0.0.0-20190712162752-c91f70ac38c6/go.mod h1:g8Iv1LnV2Dg45Bg5uCATrYi5Y57mXWsqlPnfU2BhD5I= github.com/br0xen/termbox-util v0.0.0-20190325151025-c168c0df31ca h1:UMJCb+zIdrTX68nP5byq1xjW72UIqMBNxcYPlPFhnOs= github.com/br0xen/termbox-util v0.0.0-20190325151025-c168c0df31ca/go.mod h1:x9wJlgOj74OFTOBwXOuO8pBguW37EgYNx51Dbjkfzo4= -github.com/br0xen/user-config v0.0.0-20170914134719-16e743ec93a2 h1:H/prDPxUZBsK4DQC7ScP3ftSijMtWyetb6ab69DSKrs= -github.com/br0xen/user-config v0.0.0-20170914134719-16e743ec93a2/go.mod h1:lMy7txIyYXt+I/1JgTGBZTdyTNJyNVDCX4Z+lHzNcSM= -github.com/casimir/xdg-go v0.0.0-20160329195404-372ccc2180da h1:hjpZV7G49m1bly++F+Gho1Sbf2+eBW/eTLJWuRkH9Uc= -github.com/casimir/xdg-go v0.0.0-20160329195404-372ccc2180da/go.mod h1:dywSSi3sMtJn2IjiYfJciP9tjVVeIVRa7AE7N5WLUBo= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw= github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk= github.com/go-gl/glfw v0.0.0-20191125211704-12ad95a8df72 h1:LgLYrxDRSVv3kStk6louYTP1ekZ6t7HZY/X05KUyaeM= github.com/go-gl/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.2.0 h1:VJtLvh6VQym50czpZzx07z/kw9EgAxI3x1ZB8taTMQQ= -github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25 h1:EFT6MH3igZK/dIVqgGbTqWVvkZ7wJ5iGN03SVtvvdd8= -github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25/go.mod h1:sWkGw/wsaHtRsT9zGQ/WyJCotGWG/Anow/9hsAcBWRw= github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -29,18 +15,8 @@ github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW1 github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/nanobox-io/golang-scribble v0.0.0-20190309225732-aa3e7c118975 h1:zm/Rb2OsnLWCY88Njoqgo4X6yt/lx3oBNWhepX0AOMU= -github.com/nanobox-io/golang-scribble v0.0.0-20190309225732-aa3e7c118975/go.mod h1:4Mct/lWCFf1jzQTTAaWtOI7sXqmG+wBeiBfT4CxoaJk= -github.com/nlopes/slack v0.6.0 h1:jt0jxVQGhssx1Ib7naAOZEZcGdtIhTzkP0nopK0AsRA= -github.com/nlopes/slack v0.6.0/go.mod h1:JzQ9m3PMAqcpeCam7UaHSuBuupz7CmpjehYMayT6YOk= github.com/nsf/termbox-go v0.0.0-20190817171036-93860e161317 h1:hhGN4SFXgXo61Q4Sjj/X9sBjyeSa2kdpaOzCO+8EVQw= github.com/nsf/termbox-go v0.0.0-20190817171036-93860e161317/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= -github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=