Committing to switch PCs
This commit is contained in:
parent
22dd9915c3
commit
556faf20d1
43
2016/day24/input
Normal file
43
2016/day24/input
Normal file
@ -0,0 +1,43 @@
|
||||
###################################################################################################################################################################################
|
||||
#.........#...#.............#...#3#.#.....#...........#.........#.#...#.......#.#.#...#...#.................#...........#.#...#.#.......#.......#.......#...#...#.....#.....#.....#
|
||||
#.#.#.#.#.#.#########.#.#.###.#.#.#.###.###.#.###.#.#.#.###.#.###.#.#.#.#.#####.#.#.#.#.#.#.###.#.#.#.#.#.#.#.###.#.#.###.#.#.#.#####.#.#.#.###.#.#.#.#.#.###.#.###.###.###.###.#.#
|
||||
#...#...#...#.......#...#.#.#.....#...#.....#.........#.......#.#...#...#.#.............#...#.......#.#.#...#.#.....#.......#...#.....#...#...........#...#...#.#...............#2#
|
||||
#.###.#.#.#####.###.###.#.#.#.#.###.#.#.#####.#######.#.###.###.#.#.#.#.#.#####.###.###.#.#.#####.#.###.#.###.#.#.#.#.#.#######.#######.#.#.###.###.###.#.#.#.#.#.#.###.#.###.#.###
|
||||
#.......#.........#.#.#...#...#...#.....#.#.............#.....#...#.......#.#.....#...#...#.......#.............................#.#...#...#...#.....#...#.......#.......#.......#.#
|
||||
#.###.#.#.#########.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#.#####.#.#.#######.#.#.#.#.#.#.#####.#.###.#.#####.#.###.###.#.#.###.###.#.#.#.#####.#.###.#.#.#.#######.###.#.#.#.###.###.#
|
||||
#...#.#...#...#...#...#.#...#.....#...#...........#.....#.........#.#...#...#...#.#...#.......#...#.#.....#.#.....#...#.#.......#.#.#.......#.......#...........#.#.#...#.#.......#
|
||||
#.#.#.###.###.#.#.#######.#.#.#.#.#.#.###.###########.#.#.#####.###.#.#.#####.#.#.#.#####.###.#.###.#####.###.#####.#########.#.###.#.###.#.#.#.#.###.###.#.#####.#.#.#.#.#.###.#.#
|
||||
#.......#.......#...........#...#.#...#.............#.#.#...#...#.....#...#...#.#...#...#.......#.#.#.#...#.....#.#.#.........#...#...#.....#.#...........#.#.......#.#.#...#...#.#
|
||||
#.#.#.###.#####.#.#####.#.###.#.#.#.###.#.#.#.###.###.#.#####.###.#####.#.#.#####.#.#.#.#######.#.###.#.###.#####.#.#####.#.#.#####.#.#.#.#.###.#.#######.#.#.#.###########.#.#.#.#
|
||||
#.#.#.....#.#1..........#.#...#...#.....#.........#...............#.#...#.....#...#.......#...........#.#...#.#.....#.............#.............#.....#...#.....#...#.....#.#.....#
|
||||
#.#.###.#.#.#####.#.#.#.###.#####.#.#.#.###.###.#.#.#.#####.#.#.###.#.#.#####.#.#.#.#.#.#.###.#.###.#.#.#.#.#.#.###.#.#.#####.###.###.###.#.#.#.###.#.#.#.#.#.###.#.#.#####.#####.#
|
||||
#...#...#.#...#.#.#.#.#.......#.....................#.#...............#.......#.#...#.#.#.....#.#.#...#...#.#.......#.....#.#...#.........#.#.#...#.........#.............#.....#.#
|
||||
#.###.###.###.#.#.###.#.#####.#.#####.###.###########.###.#.#.#####.#.#.#.###.###.#.#.#.#.###.#.#.#.#.###.#.###.#.#########.#.#.#.#.###.#.#.#.#.#.#.#.#.#.###.###.#####.#.#####.###
|
||||
#.....#.#.......#.#.#.....#...#.......#...#.#...#.............#.#.#.....#.........#...#.#.........#.#.#.#...#.#...#...#.......#.....#.#.....#.#.#.......#.#...#.#.....#.......#...#
|
||||
#.#.###.#.#######.#.#.#.###.#.###.###.#####.#.#.#.#.###.###.###.#.#.#####.#.#####.#.#.#.#.#.#########.#.#.#.#.#.#.#.#.#.###.#.###.#.#.###.###.#.#######.#.#.#.#.#.###.#.#.#.#.###.#
|
||||
#.#.#.......#...#...#.#.#.#.....#.....#...#...#.....#...#...#...#...........#...........#.........#.#.....#.....#.......#...#...#...#.#...#.#.#.........#...#.....#.#...#.#.....#.#
|
||||
#.#.#.#####.#.#.#.###.###.#.#.#####.#.###.#.#.#####.#.#####.#.#.#.#####.###.#.#.#.#.###.#.#.#.#.#.#.#.###.#.#####.###.###.#.#.#.#.#.#.#.#.#.###.###.#.#######.#####.###.#.###.###.#
|
||||
#.#.......#.#...#.#...#.#.#.......#...#.....#.........#.....#.#.....#...#...#.#.#...#.....#...#...#...#.....#.......#.#.#...#.#.........#...#.#..4#.#.#.#.#.....#.....#.........#.#
|
||||
#.###.#.#.#.###.#.#.###.#.#######.#.#.###.#.###.#.#.#.#.#.#.###.#####.#.###.#######.#####.###.#.#.#.#.#.###.#.#####.#.#.#.#.#.#.#.#.#.#.#.#.#.#######.#.#.#.#.#.#.#.#.#.#.###.#.#.#
|
||||
#0#...#.#.#.....#...#...#.#...#...#...#...#.......#.#.#.....#...#...#...#...#...#...#.........#.......#...#.......#...#...#...#.......#...#...............#.....#...#...#...#.#...#
|
||||
###.#.#.###.###########.#.#####.###.###.###.###.###.#.###.#.#.#.#.#.#.#.#.#.#.###.#.###.#.#.#.#####.#.#.#.#.#.#.#.#.#.#.#.###.#####.#.#####.#.#.#.#####.#.#.#####.#####.#.#.#.#.###
|
||||
#...#.#...#.......#...#...........#...#.....#...#...#.#.........#.....#.#...#.......#.....#.#.#.........#.........#...#.#.#...#.#.....#.....................#...............#.....#
|
||||
###.#.#.#.#.#.###.#.#.#.#.#######.#.#.###.###.#.#.#####.###.###.###.###.#.#.#.#.#######.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#####.###.#######.###.###.#.###.###.###.###.#.#.#
|
||||
#...#.............#.#...........#.#.#.....#.....#.......#.#.....#...#.........#.....#.......#.....#...#.....#...#.......#...#...#.#.........#...#...........#.......#...#.......#.#
|
||||
###.#.#########.#.#.#####.#.#.#.#.#.#.###.#.#######.#.#.#.#.#.#####.#.#.#.#####.#.#.#.#####.#######.#.#.#.#.#.#####.#.#.#.#####.#.#.###.#######.#######.#.#.###.#.#.#.#.#.#.###.#.#
|
||||
#.#...............#.#.......#.....#.................#...#.#.#.......#...#.......#.#.#...#.#.......#...#.....#.....#...#.#.......#.#.#.....#.....#.....#.#...#.#...#...#.#...#.#.#.#
|
||||
#.#.#.###.#.#.#.#.#.#.#.#.#.#########.#.#.#.#.#.#.#.#.#.#.#.###.#.#.#.###.#.#.#.#.#.###.#.#.###.#.#.###.###.#.#.#####.#####.#####.#.#.#.#.#.#.###.#.#.#.###.#.#.#.#.###.#.#.#.#####
|
||||
#...#.#.....#...#.............#.#.#.#.........#.#...#.#.....#.......#...#.#.#.....#.......#...#...#...........#.....#.#.......#...#...#.#.........#...#...#.....#.......#...#.....#
|
||||
###.#.#.#.#.#.#.###.#.###.#.###.#.#.#.#.###.#.###.#.#.#####.###.###.#.#.#.###.#.#.###.###.###.#.#.#.#.###.#####.###.#####.#.#.###.###.#####.#####.#.#.#######.###.###.###.#.#.#.#.#
|
||||
#...#.#.....#.........#.......#.#...#.......#...#...#...........#.....#.......#...........#.......#...#...#.....#.....#...#.......#.#.#...#.#.....#.........#.....#...#.#...#.#...#
|
||||
###.###.###.###.#.#####.###.#.#.#.#.#.###.###.###.###.#.#####.#.#.#.#.###.#.#.###.#.###.###.#.#.###.###.#.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.###.#.#.#####.#.#####.#.#.#.#####.#.#.#
|
||||
#.#.#...#.#.#...................#.......#.#.#.#.#.....#.#.#.....#...#.......#.#...#.......#.....#...#.....#...#...#.#...#...#.........#...#...#...........#.........#.#..5#...#...#
|
||||
#.#.#.###.#.###.#####.#.#.###.#.#####.#.#.#.#.#.#.###.#.#.#.#######.###.#.#.#.#.#.###.#.#.#.###.#.#####.#.#.#.#####.#.###.#.#.###.###.#.###.#.#.###########.#.#######.#.#.#.###.###
|
||||
#...#.#.#...#.#.................#.#.....#.#.........#.....#.#.#...#.#.........#...#.#...#.#.........#...#...#.....#.#.#.#.....#...#.#.....#.#.............#.#...#.#.#.....#...#...#
|
||||
#.#.###.#.#.#.#.#.#.#.#.###.###.#.#.#######.#######.###.#.#.#.###.#.#.#####.###.###.#####.#.#####.#.#.#.#.#.#.###.#.#.#.#.###.#.#.#.#.#.#.#.#####.#.#.#.#.###.#.#.#.#.#####.###.#.#
|
||||
#...#.....#.....#.....#.#...#...#...............#...#...#...#.....#...#.#.....#.#.#...#...#.#...#...#.....#...#...#...................#.........#...#.........#.#...#.......#...#.#
|
||||
###.#.###.#.#.#.###.#.#.#.#.#.###.###.#.###.###.#.###.#.#######.#.#.#.#.#.#####.#.#.#.#.#.###.#.#.#.#####.#.#.###.#.#######.#######.###.#######.#.#.#.#.###.###.###.#.#.#.#.#.#.#.#
|
||||
#.....#7..#.#.#...........#.#...#.........#.....#.#.#...#.....#.............#...#...#...#.#.#...#.......#...#.....#.#.......#.#.....#...#...#...#...#...#...#.#.....#.#.......#.#.#
|
||||
#.#.#.#.#.#.#.#.#.#.###.#####.#.#############.#.###.#.#.#.#.###.###.#######.#.#.###.#.###.#.###.#######.###.###.#.#.###.#.#.#.#.#.###.###.###.#.#.###.#.#.#.#.#.#.###.#.###.#.#.###
|
||||
#...#.....#.#...#.#.....#.....#...#...#.......#6#.......#.#.......#.#.........#...#.#.....#.....#.#.......#.#.......#.......#.....#.....#.....#...#.#.#.#...#.#...#.#...#...#.#.#.#
|
||||
###################################################################################################################################################################################
|
527
2016/day24/main.go
Normal file
527
2016/day24/main.go
Normal file
@ -0,0 +1,527 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
"os"
|
||||
|
||||
"github.com/fatih/color"
|
||||
termbox "github.com/nsf/termbox-go"
|
||||
|
||||
"../../"
|
||||
)
|
||||
|
||||
var shortestSolutionDist int
|
||||
|
||||
func main() {
|
||||
playMode := aoc.ArgIsSet("-play")
|
||||
fileNm := aoc.GetArgNumber(1)
|
||||
txtMaze := aoc.FileToStringSlice(fileNm)
|
||||
m := CreateMaze(txtMaze)
|
||||
if playMode {
|
||||
player := CreatePlayer(m)
|
||||
err := termbox.Init()
|
||||
//tWidth, tHeight := termbox.Size()
|
||||
if err != nil {
|
||||
fmt.Println("Error initializing termbox")
|
||||
os.Exit(1)
|
||||
}
|
||||
defer termbox.Close()
|
||||
var done bool
|
||||
for !done {
|
||||
fmt.Println(aoc.ClearScreen)
|
||||
player.PrintMaze()
|
||||
if player.CheckIsDone() {
|
||||
fmt.Println("Maze Completed in", player.dist, "steps!")
|
||||
fmt.Println("Press any key to quit.")
|
||||
done = true
|
||||
termbox.PollEvent()
|
||||
} else {
|
||||
ev := termbox.PollEvent()
|
||||
if ev.Type == termbox.EventKey {
|
||||
switch {
|
||||
case ev.Ch == 'q':
|
||||
done = true
|
||||
case ev.Key == termbox.KeyArrowUp:
|
||||
player.MoveUp()
|
||||
case ev.Key == termbox.KeyArrowDown:
|
||||
player.MoveDown()
|
||||
case ev.Key == termbox.KeyArrowLeft:
|
||||
player.MoveLeft()
|
||||
case ev.Key == termbox.KeyArrowRight:
|
||||
player.MoveRight()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
shortestSolutionDist = -1
|
||||
m.PrintMaze()
|
||||
m.StartSolve(0)
|
||||
fmt.Println("Shortest Solution: ", shortestSolutionDist)
|
||||
}
|
||||
}
|
||||
|
||||
var numWorkers int
|
||||
|
||||
func PrintStatus() {
|
||||
fmt.Println(aoc.ClearScreen)
|
||||
fmt.Println("Workers: ", numWorkers)
|
||||
}
|
||||
|
||||
type Player struct {
|
||||
pos *Coord
|
||||
m *Maze
|
||||
hitPois *CoordCollection
|
||||
dist int
|
||||
}
|
||||
|
||||
func CreatePlayer(m *Maze) *Player {
|
||||
p := new(Player)
|
||||
p.pos = CreateCoord(m.start.x, m.start.y)
|
||||
p.m = m
|
||||
p.hitPois = CreateCoordCollection()
|
||||
p.hitPois.Add(p.pos.x, p.pos.y, "0")
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *Player) CheckIsDone() bool {
|
||||
for _, v := range p.m.pois.coords {
|
||||
if !p.hitPois.Contains(v.x, v.y) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (p *Player) MoveUp() bool {
|
||||
if !p.CanMoveTo(p.pos.x, p.pos.y-1) {
|
||||
return false
|
||||
}
|
||||
p.pos.y--
|
||||
p.dist++
|
||||
p.CheckMovedPos()
|
||||
return true
|
||||
}
|
||||
|
||||
func (p *Player) MoveDown() bool {
|
||||
if !p.CanMoveTo(p.pos.x, p.pos.y+1) {
|
||||
return false
|
||||
}
|
||||
p.pos.y++
|
||||
p.dist++
|
||||
p.CheckMovedPos()
|
||||
return true
|
||||
}
|
||||
|
||||
func (p *Player) MoveRight() bool {
|
||||
if !p.CanMoveTo(p.pos.x+1, p.pos.y) {
|
||||
return false
|
||||
}
|
||||
p.pos.x++
|
||||
p.dist++
|
||||
p.CheckMovedPos()
|
||||
return true
|
||||
}
|
||||
|
||||
func (p *Player) MoveLeft() bool {
|
||||
if !p.CanMoveTo(p.pos.x-1, p.pos.y) {
|
||||
return false
|
||||
}
|
||||
p.pos.x--
|
||||
p.dist++
|
||||
p.CheckMovedPos()
|
||||
return true
|
||||
}
|
||||
|
||||
func (p *Player) CanMoveTo(x, y int) bool {
|
||||
return !p.m.walls.Contains(x, y)
|
||||
}
|
||||
|
||||
func (p *Player) CheckMovedPos() {
|
||||
if c, err := p.m.pois.GetXY(p.pos.x, p.pos.y); err == nil {
|
||||
p.hitPois.Add(c.x, c.y, c.label)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (p *Player) PrintMaze() {
|
||||
var err error
|
||||
poiC := color.New(color.BgGreen)
|
||||
hitPoiC := color.New(color.BgBlue)
|
||||
playerC := color.New(color.BgYellow)
|
||||
target := color.New(color.BgRed)
|
||||
next := p.FindClosestNewPoi()
|
||||
for y := 0; y < p.m.h; y++ {
|
||||
for x := 0; x < p.m.w; x++ {
|
||||
var c *Coord
|
||||
if c, err = p.m.walls.GetXY(x, y); err == nil {
|
||||
fmt.Print(c.label)
|
||||
} else if p.pos.is(x, y) {
|
||||
playerC.Print("@")
|
||||
} else if p.m.start.is(x, y) {
|
||||
hitPoiC.Print("0")
|
||||
} else if c, err = p.m.pois.GetXY(x, y); err == nil {
|
||||
if p.hitPois.Contains(x, y) {
|
||||
hitPoiC.Print(c.label)
|
||||
} else if next != nil && next.is(x, y) {
|
||||
target.Print(c.label)
|
||||
} else {
|
||||
poiC.Print(c.label)
|
||||
}
|
||||
} else {
|
||||
fmt.Print(".")
|
||||
}
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
fmt.Printf("Next Closest POI (%s: %d,%d)\n", next.label, next.x, next.y)
|
||||
fmt.Printf("Steps Taken: %d\n", p.dist)
|
||||
}
|
||||
|
||||
func (p *Player) FindClosestNewPoi() *Coord {
|
||||
var shortestPoi Coord
|
||||
shortestDist := -1
|
||||
for _, v := range p.m.pois.coords {
|
||||
if !p.hitPois.Contains(v.x, v.y) {
|
||||
if t := FindSLDistance(p.pos, &v); t < shortestDist || shortestDist == -1 {
|
||||
shortestDist = t
|
||||
shortestPoi = v
|
||||
}
|
||||
}
|
||||
}
|
||||
return &shortestPoi
|
||||
}
|
||||
|
||||
type Coord struct {
|
||||
x, y int
|
||||
label string
|
||||
dist int
|
||||
}
|
||||
|
||||
func CreateCoord(x, y int) *Coord {
|
||||
return &Coord{x: x, y: y, label: ""}
|
||||
}
|
||||
|
||||
func (c *Coord) is(x, y int) bool {
|
||||
return c.x == x && c.y == y
|
||||
}
|
||||
|
||||
type CoordCollection struct {
|
||||
coords []Coord
|
||||
}
|
||||
|
||||
func CreateCoordCollection() *CoordCollection {
|
||||
cc := new(CoordCollection)
|
||||
return cc
|
||||
}
|
||||
|
||||
func CreateCCFromCoordSlice(c []Coord) *CoordCollection {
|
||||
cc := new(CoordCollection)
|
||||
for i := range c {
|
||||
cc.Add(c[i].x, c[i].y, c[i].label)
|
||||
}
|
||||
return cc
|
||||
}
|
||||
|
||||
func (cc *CoordCollection) Add(x, y int, l string) {
|
||||
if !cc.Contains(x, y) {
|
||||
cc.coords = append(cc.coords, Coord{x: x, y: y, label: l})
|
||||
}
|
||||
}
|
||||
|
||||
func (cc *CoordCollection) Contains(x, y int) bool {
|
||||
if cc.coords != nil && len(cc.coords) > 0 {
|
||||
for i := range cc.coords {
|
||||
if cc.coords[i].x == x && cc.coords[i].y == y {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (cc *CoordCollection) GetXY(x, y int) (*Coord, error) {
|
||||
for i := range cc.coords {
|
||||
if cc.coords[i].x == x && cc.coords[i].y == y {
|
||||
return &cc.coords[i], nil
|
||||
}
|
||||
}
|
||||
return nil, errors.New("Collection Doesn't Contain Coord")
|
||||
}
|
||||
|
||||
type Path struct {
|
||||
coords []Coord
|
||||
}
|
||||
|
||||
func (p *Path) Append(c Coord) {
|
||||
p.coords = append(p.coords, c)
|
||||
}
|
||||
|
||||
func (p *Path) ContainsCoord(x, y int) bool {
|
||||
for i := range p.coords {
|
||||
if p.coords[i].is(x, y) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (p *Path) GetCoordAt(x, y int) *Coord {
|
||||
for i := range p.coords {
|
||||
if p.coords[i].is(x, y) {
|
||||
return &p.coords[i]
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type Maze struct {
|
||||
start, end *Coord
|
||||
pois *CoordCollection
|
||||
walls *CoordCollection
|
||||
h, w int
|
||||
solvePath Path
|
||||
testedPath Path
|
||||
}
|
||||
|
||||
func CreateMaze(inp []string) *Maze {
|
||||
m := new(Maze)
|
||||
m.pois = CreateCoordCollection()
|
||||
m.walls = CreateCoordCollection()
|
||||
for y := range inp {
|
||||
for x := range inp[y] {
|
||||
if inp[y][x] == '#' {
|
||||
m.walls.Add(x, y, aoc.FillChar)
|
||||
} else if inp[y][x] != '.' {
|
||||
if inp[y][x] == '0' {
|
||||
m.start = &Coord{x: x, y: y, label: "0"}
|
||||
} else {
|
||||
m.pois.Add(x, y, string(inp[y][x]))
|
||||
}
|
||||
}
|
||||
if x > m.w {
|
||||
m.w = x
|
||||
}
|
||||
}
|
||||
if y > m.h {
|
||||
m.h = y
|
||||
}
|
||||
}
|
||||
m.w++
|
||||
return m
|
||||
}
|
||||
|
||||
func CopyMaze(walls, pois *CoordCollection) *Maze {
|
||||
newM := new(Maze)
|
||||
newM.pois = CreateCoordCollection()
|
||||
newM.walls = CreateCoordCollection()
|
||||
for _, v := range walls.coords {
|
||||
newM.walls.Add(v.x, v.y, v.label)
|
||||
}
|
||||
for _, v := range pois.coords {
|
||||
newM.pois.Add(v.x, v.y, v.label)
|
||||
}
|
||||
return newM
|
||||
}
|
||||
|
||||
func (m *Maze) PrintMaze() {
|
||||
var err error
|
||||
poiC := color.New(color.BgGreen)
|
||||
for y := 0; y < m.h; y++ {
|
||||
for x := 0; x < m.w; x++ {
|
||||
var c *Coord
|
||||
if c, err = m.walls.GetXY(x, y); err == nil {
|
||||
fmt.Print(c.label)
|
||||
} else if m.start.is(x, y) {
|
||||
poiC.Print("0")
|
||||
} else if c, err = m.pois.GetXY(x, y); err == nil {
|
||||
poiC.Print(c.label)
|
||||
} else {
|
||||
fmt.Print(" ")
|
||||
}
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
}
|
||||
|
||||
// StartSolve kicks off the solve and returns the lowest number of steps, or an error
|
||||
func (m *Maze) StartSolve(dist int) (int, error) {
|
||||
numWorkers++
|
||||
solved, d := m.Solve(m.start.x, m.start.y, 0)
|
||||
dist += d
|
||||
numWorkers--
|
||||
if !solved {
|
||||
return dist, errors.New("Couldn't solve maze. :(")
|
||||
}
|
||||
fmt.Println("Ended Solve (current workers:", numWorkers, "; current shortest:", shortestSolutionDist, ")")
|
||||
if dist < shortestSolutionDist || shortestSolutionDist == -1 {
|
||||
shortestSolutionDist = dist
|
||||
}
|
||||
return dist, nil
|
||||
}
|
||||
|
||||
// We want to build a set of all solutions from one poi to all others
|
||||
// then find the shortest path that hits them all
|
||||
func (m *Maze) Solve(x, y, dist int) (bool, int) {
|
||||
wrkCoord := Coord{x: x, y: y, dist: dist}
|
||||
if m.end == nil || m.end.is(x, y) {
|
||||
// We found a point of interest! (or we're just starting)
|
||||
|
||||
// No end set. For each poi, we want to fork a new maze being solved
|
||||
// with the end set to that poi, and that poi removed from the poi list
|
||||
if len(m.pois.coords) == 0 {
|
||||
// Unless there aren't any left, then we solved it
|
||||
return true, dist
|
||||
}
|
||||
for i := range m.pois.coords {
|
||||
endPoi := m.pois.coords[i]
|
||||
// Copy the pois
|
||||
newPois := make([]Coord, len(m.pois.coords))
|
||||
copy(newPois, m.pois.coords)
|
||||
// Then delete the endPoi from it
|
||||
newPois = append(newPois[:i], newPois[i+1:]...)
|
||||
// Create a new maze with start set to this point and end set to the first poi
|
||||
newM := CopyMaze(m.walls, CreateCCFromCoordSlice(newPois))
|
||||
newM.start = &wrkCoord
|
||||
newM.end = &endPoi
|
||||
newM.StartSolve(dist + 1)
|
||||
}
|
||||
}
|
||||
if m.testedPath.ContainsCoord(x, y) {
|
||||
return false, 0
|
||||
}
|
||||
// Figure out if there is a shorter path to this coordinate
|
||||
if !m.walls.Contains(x-1, y) {
|
||||
if t := m.testedPath.GetCoordAt(x-1, y); t != nil {
|
||||
if t.dist+1 < wrkCoord.dist {
|
||||
return false, 0
|
||||
}
|
||||
}
|
||||
}
|
||||
if !m.walls.Contains(x+1, y) {
|
||||
if t := m.testedPath.GetCoordAt(x+1, y); t != nil {
|
||||
if t.dist+1 < wrkCoord.dist {
|
||||
return false, 0
|
||||
}
|
||||
}
|
||||
}
|
||||
if !m.walls.Contains(x, y-1) {
|
||||
if t := m.testedPath.GetCoordAt(x, y-1); t != nil {
|
||||
if t.dist+1 < wrkCoord.dist {
|
||||
return false, 0
|
||||
}
|
||||
}
|
||||
}
|
||||
if !m.walls.Contains(x, y+1) {
|
||||
if t := m.testedPath.GetCoordAt(x, y+1); t != nil {
|
||||
if t.dist+1 < wrkCoord.dist {
|
||||
return false, 0
|
||||
}
|
||||
}
|
||||
}
|
||||
m.testedPath.Append(wrkCoord)
|
||||
shortest := -1
|
||||
var foundSol bool
|
||||
if m.testedPath.GetCoordAt(x-1, y) == nil && !m.walls.Contains(x-1, y) {
|
||||
if sol, nDist := m.Solve(x-1, y, wrkCoord.dist+1); sol {
|
||||
foundSol = true
|
||||
if nDist < shortest || shortest == -1 {
|
||||
shortest = nDist
|
||||
}
|
||||
}
|
||||
}
|
||||
if m.testedPath.GetCoordAt(x, y-1) == nil && !m.walls.Contains(x, y-1) {
|
||||
if sol, nDist := m.Solve(x, y-1, wrkCoord.dist+1); sol {
|
||||
foundSol = true
|
||||
if nDist < shortest || shortest == -1 {
|
||||
shortest = nDist
|
||||
}
|
||||
}
|
||||
}
|
||||
if m.testedPath.GetCoordAt(x+1, y) == nil && !m.walls.Contains(x+1, y) {
|
||||
if sol, nDist := m.Solve(x+1, y, wrkCoord.dist+1); sol {
|
||||
foundSol = true
|
||||
if nDist < shortest || shortest == -1 {
|
||||
shortest = nDist
|
||||
}
|
||||
}
|
||||
}
|
||||
if m.testedPath.GetCoordAt(x, y+1) == nil && !m.walls.Contains(x, y+1) {
|
||||
if sol, nDist := m.Solve(x, y+1, wrkCoord.dist+1); sol {
|
||||
foundSol = true
|
||||
if nDist < shortest || shortest == -1 {
|
||||
shortest = nDist
|
||||
}
|
||||
}
|
||||
}
|
||||
return foundSol, dist + shortest
|
||||
}
|
||||
|
||||
var shortestPoiDist map[string]int
|
||||
|
||||
// Pt2StartSolve finds the shortest distance between every poi and every other poi
|
||||
func (m *Maze) Pt2StartSolve() {
|
||||
shortestPoiDist = make(map[string]int)
|
||||
for _, i := range m.pois.coords {
|
||||
if gud, dist := m.GetShortestPath(m.start, i, 0); gud {
|
||||
shortestPoiDist[m.start.label+";"+i.label] = dist
|
||||
}
|
||||
for _, j := range m.pois.coords {
|
||||
if i.label != j.label {
|
||||
fst, scd := i, j
|
||||
if i[0] > j[0] {
|
||||
fst, scd = j, i
|
||||
}
|
||||
if _, ok := shortestPoiDist[fst+";"+scd]; !ok {
|
||||
if gud, dist := m.GetShortestPath(i, j, 0); gud {
|
||||
shortestPoiDist[fst+";"+scd] = dist
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// TODO: Find shortest path that hits them all
|
||||
}
|
||||
|
||||
// GetShortestPath just finds the shortest path between two points
|
||||
func (m *Maze) GetShortestPath(beg *Coord, end *Coord, dist int) (int, bool) {
|
||||
// TODO: actually solve for shortest path
|
||||
return 0, false
|
||||
}
|
||||
|
||||
/* Put on hold
|
||||
// We're going to find the closest POI (straight-line) and solve to it
|
||||
func (m *Maze) Solve(x, y, dist int) bool {
|
||||
wrkCoord := Coord{x: x, y: y, dist: dist}
|
||||
_ = wrkCoord
|
||||
if m.end == nil || m.end.is(x, y) {
|
||||
// We made it (or haven't started)! Do we have any more pois?
|
||||
if len(m.pois.coords) == 0 {
|
||||
// Nope, none left, we're done
|
||||
return true
|
||||
}
|
||||
m.end = m.FindClosestPoi()
|
||||
}
|
||||
return false
|
||||
}
|
||||
*/
|
||||
|
||||
func (m *Maze) FindClosestPoi() *Coord {
|
||||
var shortestPoi Coord
|
||||
shortestDist := -1
|
||||
for _, v := range m.pois.coords {
|
||||
if t := FindSLDistance(m.start, &v); t < shortestDist || shortestDist == -1 {
|
||||
shortestDist = t
|
||||
shortestPoi = v
|
||||
}
|
||||
}
|
||||
return &shortestPoi
|
||||
}
|
||||
|
||||
func FindSLDistance(p1, p2 *Coord) int {
|
||||
a := math.Abs(float64(p1.x) - float64(p2.x))
|
||||
b := math.Abs(float64(p1.y) - float64(p2.y))
|
||||
return int(math.Pow(a, 2) + math.Pow(b, 2))
|
||||
}
|
5
2016/day24/testinput
Normal file
5
2016/day24/testinput
Normal file
@ -0,0 +1,5 @@
|
||||
###########
|
||||
#0.1.....2#
|
||||
#.#######.#
|
||||
#4.......3#
|
||||
###########
|
43
2016/day24/testinput2
Normal file
43
2016/day24/testinput2
Normal file
@ -0,0 +1,43 @@
|
||||
###################################################################################################################################################################################
|
||||
#.........#...#.............#...#.#.#.....#...........#.........#.#...#.......#.#.#...#...#.................#...........#.#...#.#.......#.......#.......#...#...#.....#.....#.....#
|
||||
#.#.#.#.#.#.#########.#.#.###.#.#.#.###.###.#.###.#.#.#.###.#.###.#.#.#.#.#####.#.#.#.#.#.#.###.#.#.#.#.#.#.#.###.#.#.###.#.#.#.#####.#.#.#.###.#.#.#.#.#.###.#.###.###.###.###.#.#
|
||||
#...#...#...#.......#...#.#.#.....#...#.....#.........#.......#.#...#...#.#.............#...#.......#.#.#...#.#.....#.......#...#.....#...#...........#...#...#.#...............#2#
|
||||
#.###.#.#.#####.###.###.#.#.#.#.###.#.#.#####.#######.#.###.###.#.#.#.#.#.#####.###.###.#.#.#####.#.###.#.###.#.#.#.#.#.#######.#######.#.#.###.###.###.#.#.#.#.#.#.###.#.###.#.###
|
||||
#.......#.........#.#.#...#...#...#.....#.#.............#.....#...#.......#.#.....#...#...#.......#.............................#.#...#...#...#.....#...#.......#.......#.......#.#
|
||||
#.###.#.#.#########.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#.#####.#.#.#######.#.#.#.#.#.#.#####.#.###.#.#####.#.###.###.#.#.###.###.#.#.#.#####.#.###.#.#.#.#######.###.#.#.#.###.###.#
|
||||
#...#.#...#...#...#...#.#...#.....#...#...........#.....#.........#.#...#...#...#.#...#.......#...#.#.....#.#.....#...#.#.......#.#.#.......#.......#...........#.#.#...#.#.......#
|
||||
#.#.#.###.###.#.#.#######.#.#.#.#.#.#.###.###########.#.#.#####.###.#.#.#####.#.#.#.#####.###.#.###.#####.###.#####.#########.#.###.#.###.#.#.#.#.###.###.#.#####.#.#.#.#.#.###.#.#
|
||||
#.......#.......#...........#...#.#...#.............#.#.#...#...#.....#...#...#.#...#...#.......#.#.#.#...#.....#.#.#.........#...#...#.....#.#...........#.#.......#.#.#...#...#.#
|
||||
#.#.#.###.#####.#.#####.#.###.#.#.#.###.#.#.#.###.###.#.#####.###.#####.#.#.#####.#.#.#.#######.#.###.#.###.#####.#.#####.#.#.#####.#.#.#.#.###.#.#######.#.#.#.###########.#.#.#.#
|
||||
#.#.#.....#.#1..........#.#...#...#.....#.........#...............#.#...#.....#...#.......#...........#.#...#.#.....#.............#.............#.....#...#.....#...#.....#.#.....#
|
||||
#.#.###.#.#.#####.#.#.#.###.#####.#.#.#.###.###.#.#.#.#####.#.#.###.#.#.#####.#.#.#.#.#.#.###.#.###.#.#.#.#.#.#.###.#.#.#####.###.###.###.#.#.#.###.#.#.#.#.#.###.#.#.#####.#####.#
|
||||
#...#...#.#...#.#.#.#.#.......#.....................#.#...............#.......#.#...#.#.#.....#.#.#...#...#.#.......#.....#.#...#.........#.#.#...#.........#.............#.....#.#
|
||||
#.###.###.###.#.#.###.#.#####.#.#####.###.###########.###.#.#.#####.#.#.#.###.###.#.#.#.#.###.#.#.#.#.###.#.###.#.#########.#.#.#.#.###.#.#.#.#.#.#.#.#.#.###.###.#####.#.#####.###
|
||||
#.....#.#.......#.#.#.....#...#.......#...#.#...#.............#.#.#.....#.........#...#.#.........#.#.#.#...#.#...#...#.......#.....#.#.....#.#.#.......#.#...#.#.....#.......#...#
|
||||
#.#.###.#.#######.#.#.#.###.#.###.###.#####.#.#.#.#.###.###.###.#.#.#####.#.#####.#.#.#.#.#.#########.#.#.#.#.#.#.#.#.#.###.#.###.#.#.###.###.#.#######.#.#.#.#.#.###.#.#.#.#.###.#
|
||||
#.#.#.......#...#...#.#.#.#.....#.....#...#...#.....#...#...#...#...........#...........#.........#.#.....#.....#.......#...#...#...#.#...#.#.#.........#...#.....#.#...#.#.....#.#
|
||||
#.#.#.#####.#.#.#.###.###.#.#.#####.#.###.#.#.#####.#.#####.#.#.#.#####.###.#.#.#.#.###.#.#.#.#.#.#.#.###.#.#####.###.###.#.#.#.#.#.#.#.#.#.###.###.#.#######.#####.###.#.###.###.#
|
||||
#.#.......#.#...#.#...#.#.#.......#...#.....#.........#.....#.#.....#...#...#.#.#...#.....#...#...#...#.....#.......#.#.#...#.#.........#...#.#...#.#.#.#.#.....#.....#.........#.#
|
||||
#.###.#.#.#.###.#.#.###.#.#######.#.#.###.#.###.#.#.#.#.#.#.###.#####.#.###.#######.#####.###.#.#.#.#.#.###.#.#####.#.#.#.#.#.#.#.#.#.#.#.#.#.#######.#.#.#.#.#.#.#.#.#.#.###.#.#.#
|
||||
#0#...#.#.#.....#...#...#.#...#...#...#...#.......#.#.#.....#...#...#...#...#...#...#.........#.......#...#.......#...#...#...#.......#...#...............#.....#...#...#...#.#...#
|
||||
###.#.#.###.###########.#.#####.###.###.###.###.###.#.###.#.#.#.#.#.#.#.#.#.#.###.#.###.#.#.#.#####.#.#.#.#.#.#.#.#.#.#.#.###.#####.#.#####.#.#.#.#####.#.#.#####.#####.#.#.#.#.###
|
||||
#...#.#...#.......#...#...........#...#.....#...#...#.#.........#.....#.#...#.......#.....#.#.#.........#.........#...#.#.#...#.#.....#.....................#...............#.....#
|
||||
###.#.#.#.#.#.###.#.#.#.#.#######.#.#.###.###.#.#.#####.###.###.###.###.#.#.#.#.#######.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#####.###.#######.###.###.#.###.###.###.###.#.#.#
|
||||
#...#.............#.#...........#.#.#.....#.....#.......#.#.....#...#.........#.....#.......#.....#...#.....#...#.......#...#...#.#.........#...#...........#.......#...#.......#.#
|
||||
###.#.#########.#.#.#####.#.#.#.#.#.#.###.#.#######.#.#.#.#.#.#####.#.#.#.#####.#.#.#.#####.#######.#.#.#.#.#.#####.#.#.#.#####.#.#.###.#######.#######.#.#.###.#.#.#.#.#.#.###.#.#
|
||||
#.#...............#.#.......#.....#.................#...#.#.#.......#...#.......#.#.#...#.#.......#...#.....#.....#...#.#.......#.#.#.....#.....#.....#.#...#.#...#...#.#...#.#.#.#
|
||||
#.#.#.###.#.#.#.#.#.#.#.#.#.#########.#.#.#.#.#.#.#.#.#.#.#.###.#.#.#.###.#.#.#.#.#.###.#.#.###.#.#.###.###.#.#.#####.#####.#####.#.#.#.#.#.#.###.#.#.#.###.#.#.#.#.###.#.#.#.#####
|
||||
#...#.#.....#...#.............#.#.#.#.........#.#...#.#.....#.......#...#.#.#.....#.......#...#...#...........#.....#.#.......#...#...#.#.........#...#...#.....#.......#...#.....#
|
||||
###.#.#.#.#.#.#.###.#.###.#.###.#.#.#.#.###.#.###.#.#.#####.###.###.#.#.#.###.#.#.###.###.###.#.#.#.#.###.#####.###.#####.#.#.###.###.#####.#####.#.#.#######.###.###.###.#.#.#.#.#
|
||||
#...#.#.....#.........#.......#.#...#.......#...#...#...........#.....#.......#...........#.......#...#...#.....#.....#...#.......#.#.#...#.#.....#.........#.....#...#.#...#.#...#
|
||||
###.###.###.###.#.#####.###.#.#.#.#.#.###.###.###.###.#.#####.#.#.#.#.###.#.#.###.#.###.###.#.#.###.###.#.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.###.#.#.#####.#.#####.#.#.#.#####.#.#.#
|
||||
#.#.#...#.#.#...................#.......#.#.#.#.#.....#.#.#.....#...#.......#.#...#.......#.....#...#.....#...#...#.#...#...#.........#...#...#...........#.........#.#...#...#...#
|
||||
#.#.#.###.#.###.#####.#.#.###.#.#####.#.#.#.#.#.#.###.#.#.#.#######.###.#.#.#.#.#.###.#.#.#.###.#.#####.#.#.#.#####.#.###.#.#.###.###.#.###.#.#.###########.#.#######.#.#.#.###.###
|
||||
#...#.#.#...#.#.................#.#.....#.#.........#.....#.#.#...#.#.........#...#.#...#.#.........#...#...#.....#.#.#.#.....#...#.#.....#.#.............#.#...#.#.#.....#...#...#
|
||||
#.#.###.#.#.#.#.#.#.#.#.###.###.#.#.#######.#######.###.#.#.#.###.#.#.#####.###.###.#####.#.#####.#.#.#.#.#.#.###.#.#.#.#.###.#.#.#.#.#.#.#.#####.#.#.#.#.###.#.#.#.#.#####.###.#.#
|
||||
#...#.....#.....#.....#.#...#...#...............#...#...#...#.....#...#.#.....#.#.#...#...#.#...#...#.....#...#...#...................#.........#...#.........#.#...#.......#...#.#
|
||||
###.#.###.#.#.#.###.#.#.#.#.#.###.###.#.###.###.#.###.#.#######.#.#.#.#.#.#####.#.#.#.#.#.###.#.#.#.#####.#.#.###.#.#######.#######.###.#######.#.#.#.#.###.###.###.#.#.#.#.#.#.#.#
|
||||
#.....#...#.#.#...........#.#...#.........#.....#.#.#...#.....#.............#...#...#...#.#.#...#.......#...#.....#.#.......#.#.....#...#...#...#...#...#...#.#.....#.#.......#.#.#
|
||||
#.#.#.#.#.#.#.#.#.#.###.#####.#.#############.#.###.#.#.#.#.###.###.#######.#.#.###.#.###.#.###.#######.###.###.#.#.###.#.#.#.#.#.###.###.###.#.#.###.#.#.#.#.#.#.###.#.###.#.#.###
|
||||
#...#.....#.#...#.#.....#.....#...#...#.......#.#.......#.#.......#.#.........#...#.#.....#.....#.#.......#.#.......#.......#.....#.....#.....#...#.#.#.#...#.#...#.#...#...#.#.#.#
|
||||
###################################################################################################################################################################################
|
Loading…
Reference in New Issue
Block a user