95 lines
1.6 KiB
Go
95 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
|
|
helpers "git.bullercodeworks.com/brian/adventofcode/helpers"
|
|
)
|
|
|
|
var maze *Maze
|
|
|
|
func main() {
|
|
file := "input"
|
|
var manual bool
|
|
if helpers.GetArgNumber(1) != "" {
|
|
file = helpers.GetArgNumber(1)
|
|
}
|
|
if helpers.GetArgNumber(2) == "manual" {
|
|
manual = true
|
|
}
|
|
maze = NewMaze(file)
|
|
if manual {
|
|
runmanual(maze)
|
|
}
|
|
part1()
|
|
//part2(inp)
|
|
}
|
|
|
|
func part1() {
|
|
maze.GetStart().steps = 0
|
|
ProcessNode(maze.GetStart(), 0)
|
|
fmt.Println("Distance:", maze.GetEnd().steps)
|
|
}
|
|
|
|
func ProcessNode(m *MazeCoord, steps int) {
|
|
fmt.Println("Processing Node", m)
|
|
if maze.IsEnd(m.X, m.Y) {
|
|
fmt.Println(" End")
|
|
return
|
|
}
|
|
for _, neighbor := range []*MazeCoord{m.N, m.E, m.S, m.W} {
|
|
if neighbor == nil {
|
|
continue
|
|
}
|
|
if m.steps+1 < neighbor.steps {
|
|
neighbor.steps = m.steps + 1
|
|
if !neighbor.visited {
|
|
ProcessNode(neighbor, m.steps+1)
|
|
}
|
|
}
|
|
}
|
|
m.visited = true
|
|
}
|
|
|
|
func runmanual(m *Maze) {
|
|
var err error
|
|
var inp string
|
|
m.Print()
|
|
for {
|
|
reader := bufio.NewReader(os.Stdin)
|
|
inp, err = reader.ReadString('\n')
|
|
if err != nil {
|
|
fmt.Println("Input Error:", err.Error())
|
|
continue
|
|
}
|
|
var valid bool
|
|
switch inp[0] {
|
|
case 'N', 'n':
|
|
valid = m.MoveNorth()
|
|
case 'E', 'e':
|
|
valid = m.MoveEast()
|
|
case 'S', 's':
|
|
valid = m.MoveSouth()
|
|
case 'W', 'w':
|
|
valid = m.MoveWest()
|
|
case 'Q', 'q':
|
|
fmt.Println("Quitting")
|
|
break
|
|
}
|
|
fmt.Println(helpers.CLEAR_SCREEN)
|
|
m.Print()
|
|
if m.IsDone() {
|
|
fmt.Println("DONE!")
|
|
break
|
|
}
|
|
if !valid {
|
|
fmt.Println("Invalid Move")
|
|
}
|
|
time.Sleep(time.Second / 2)
|
|
|
|
}
|
|
}
|