Trying to finish up 2019
This commit is contained in:
125
2019/day20/input
Normal file
125
2019/day20/input
Normal file
@@ -0,0 +1,125 @@
|
||||
X H D Z O K W
|
||||
N O W Z S L F
|
||||
###################################.#######.###########.###.#.#######.###.#######################################
|
||||
#.....#.........................#.....#.#...#...........#.#.....#.......#...............................#.....#.#
|
||||
###.#####.#.#####.#######.###.#####.###.#.#######.#####.#.#####.#######.###.###.###.###.#.#.###.#######.###.###.#
|
||||
#.#...#...#.#.#.....#...#.#.#.#.......#...#.#.#.....#.#.#.....#...#.....#.#...#...#...#.#.#.#.......#...#.....#.#
|
||||
#.#.#########.#########.###.#.###.#####.#.#.#.#.###.#.#.###.#.#.#.###.###.#####.###.#####.#####.###########.###.#
|
||||
#.....#.#.....#.........#...........#.#.#.....#.#.#.#...#...#...#.#.......#.#.....#.#.#.#...#...#.#.#...#...#.#.#
|
||||
#.#####.#####.###.#####.###.###.#.###.#####.#####.#.###.###.#########.#.###.###.#####.#.#########.#.#.###.###.#.#
|
||||
#.....#...#.#...#...#.......#.#.#.......#.#.#.#.....#.#.#.........#...#.#.#...#.....#.#...#.#...#.#.#.....#.#...#
|
||||
###.#####.#.###.#######.###.#.#######.###.#.#.###.###.###.#####.#####.#.#.#.#.#.###.#.#.###.###.#.#.###.###.#.###
|
||||
#.#.....#.#...#...#.#.#.#.#.#.#.......#.......#.........#.#...#.#.....#.#...#.#.#.........#.#.#...........#...#.#
|
||||
#.#.#####.###.#.###.#.###.###.###.#.#.#.###.#####.###########.#.###.###.#.###.#.###.#.#.###.#.#.###.###.#####.#.#
|
||||
#.......#.#.#.#...#.#...#.........#.#.#.#.....#.......#.#.#...#...#.#...#.#.....#.#.#.#...........#...#...#...#.#
|
||||
###.#.###.#.#.#.#.#.###.#########.###.#####.#####.#####.#.###.#.#######.#.#.#.###.#####.###.#.###############.#.#
|
||||
#.#.#.#.......#.#.#...#.....#...#...#.#...#...#.....#.#...........#.....#.#.#.....#.#...#.#.#.#.#.....#.#...#...#
|
||||
#.#.#########.###.#.#####.#####.#.#######.#.#.###.###.#######.#.#######.#.###.#####.###.#.#####.#.#.#.#.###.#.###
|
||||
#...#...#.....................#.#...#.#.#...#.#...#...#.......#.#...#...#...#.....#...............#.#...#.....#.#
|
||||
#.#.#.###.#.###.###.#####.#.#.#.#.###.#.#.#######.###.#####.###.###.###.#.###.###########.#.###.#########.###.#.#
|
||||
#.#.#...#.#.#.#.#.....#...#.#.........#.#.#.#.#...#.....#.....#...#...#.#...#.#.....#...#.#.#.#.....#.#...#...#.#
|
||||
#.###.#######.#####.#.#.#.###.#######.#.#.#.#.###.###.#.#.#####.###.#.#.###.###.#.#####.#####.#######.#######.#.#
|
||||
#.....#...#.#...#.#.#.#.#.#...#.#.....#.#.#.#...#.....#.#.#.#.....#.#...#...#.#.#.#.....#...#.........#.......#.#
|
||||
#.#######.#.###.#.###.#######.#.#.#####.#.#.#.#####.#######.#.#.###.#.#.#.###.#.#####.#.#.#########.#####.###.#.#
|
||||
#.......#.....#...#...#.......#.........#...#...#.#.....#.....#.#...#.#.#.....#...#...#.#.........#...#.#.#...#.#
|
||||
#.#########.###.#.#######.#########.#.#####.#.#.#.#####.#.#####.#.###########.#.###.#####.#.#######.#.#.#####.#.#
|
||||
#.#...#.#.#...#.#.......#...#.#.#...#...#.#...#...#.....#...#.#.#...#.....#.#...#.........#...#.#...#...#.#.#...#
|
||||
#.#.###.#.#.#######.###.#####.#.#######.#.#####.#####.#.###.#.###.#####.###.#.#.#.#.###.#.#####.###.#####.#.###.#
|
||||
#...#.#.#...#.#...#.#.#.#.#...#.#.#.#.......#...#.#.#.#.#...#...#.......#.....#...#...#.#.#.....#.....#.#...#...#
|
||||
#.###.#.#.#.#.###.###.#.#.###.#.#.#.###.###.#.#.#.#.###.#.###.###.#####.#######.###########.#.#####.###.###.###.#
|
||||
#.#.#...#.#.....#...#.#.#.......#.......#.#.#.#.#.......#...#.#.....#.....#...#.........#.#.#.#.#.#.#.#.#.......#
|
||||
#.#.###.###.#######.#.#.#####.###.#####.#.###.###.#.#.#####.#.###.#.#.#.#####.#.#########.###.#.#.#.#.#.###.#####
|
||||
#.#.#.#.........#.........#.#.........#...#.....#.#.#.#.........#.#.#.#.#.......#...#...#.#.....#.#.#...#.......#
|
||||
#.#.#.#####.###########.#.#.#.#######.#####.#####.###########.#######.###.#########.###.#.###.###.#.#.#.###.#####
|
||||
#.....#...#.#.....#.#.#.#.#.#.# S K H R I H #.#.......#.#.....#.#.#.....#.#
|
||||
#####.###.#.#####.#.#.#.###.### U A W P O C #.###.#####.###.#.###.###.###.#
|
||||
#.#.#...#.....#.#...#...#.#...# #.....#...#...#.#.#.#...#...#.#
|
||||
#.#.#.#####.###.###.###.#.#.### ###.#####.#.###.###.###.#.###.#
|
||||
#.#...#...#.#...............#.# NZ..............#.............#.#
|
||||
#.#.#####.#.###.#######.###.#.# #.###.#####.###.###.#.###.###.#
|
||||
KA....#.#.......#.#.......#.....# #.#.#.#.........#.#.#...#.....#
|
||||
#.###.#####.#########.#######.# ###.#####.#.###.#.#.#########.#
|
||||
#.......#...#.#.#.#.#.....#....DA #...#.#.#.#.#.....#.#.#...#.#..HC
|
||||
###.###.#.#.#.#.#.#.#####.###.# #.#.#.#.#########.#.#.#.###.###
|
||||
#...#.....#...............#...# #.#.......#.#.#.#.#.#..........PZ
|
||||
#.#####################.#.#.#.# #####.#.###.#.#.#####.#.###.#.#
|
||||
#.#.......#.........#.#.#.#.#.# #.#...#...............#...#.#.#
|
||||
###.###.#.#.#######.#.######### #.###.#####.###.#.#########.###
|
||||
RO....#.#.#...#.#.#.....#.#.....# #...#...#.....#.#.#...#.#.#...#
|
||||
###.#.###.###.#.###.#.#.###.#.# ###.#.###########.#.###.#.#####
|
||||
#.....#.#.#.#.#.#.#.#.....#.#.# XN......#.#.#...#.......#...#...#
|
||||
#######.###.#.#.#.###.###.#.#.# #####.#.#.###.#.###.###.#.#.###
|
||||
#...#.......#...#...#.#.....#..WF TZ....#.#.......#.#...#...#.#.#.#
|
||||
###.###.#####.#####.########### ###.###.#.#.#####.#######.#.#.#
|
||||
TZ....#...#.....................# #.......#.#.#.#.....#...#.#.#..YK
|
||||
###.#.#.#.#######.###.#####.#.# ###.#.###.###.#######.###.#.#.#
|
||||
#...#.#.#.....#...#.#.#...#.#.# #...#.#...#.......#.#...#.....#
|
||||
###.#.#.###.#######.###.#####.# #########.#.#.#####.#.###.###.#
|
||||
#.#...#.......#.....#.#...#....QN #...#.#.....#.............#...#
|
||||
#.###############.###.#.#####.# ###.#.###.#.###.#.#.#.#.#######
|
||||
#...#.....#.#.......#...#.....# #.#.....#.#.#.#.#.#.#.#.#...#.#
|
||||
#.###.#.#.#.#.#####.#.#.#####.# #.###.#######.###########.#.#.#
|
||||
#.#.#.#.#...#...#...#.#...#.#.# #.#.......#.#.....#.....#.#....IO
|
||||
#.#.#.#####.#.###.###.###.#.### #.###.###.#.#.#########.#.###.#
|
||||
#.......#.......#.#.....#.....# JZ......#.........#.#.#.....#...#
|
||||
#.###.#####.#####.#####.#.##### #########.###.###.#.###.#####.#
|
||||
DQ....#...#.....#.........#......JO #...#.#.#.#.................#.#
|
||||
#.###.#####.################### ###.#.#.#######.#######.#######
|
||||
#...#.#...#.#.....#.#...#.....# #.#...........#.#.....#...#...#
|
||||
#####.###.#####.###.#.#.#.###.# #.#.#####.###.#####.#########.#
|
||||
RU....#.#.....#.#...#...#.#...#.# OS....#.#...#...#.....#.#...#.#.#
|
||||
#.#######.###.#.#.#.###.###.#.# #.#.#.###.#.#.###.#.#.###.#.#.#
|
||||
#...............#.....#.....#..QT #.#...#...#.#...#.#...#.#.....#
|
||||
#.#######.#.###.###.########### ###.#.#####.#####.###.#.#.###.#
|
||||
#.#.#.#...#.#...#.#...#.#.#...# #.#.#.#...#.........#.......#..QN
|
||||
###.#.###.#.###.#.#####.#.#.#.# #.#.#.###.#####################
|
||||
#.#...#...#.#...#.#.#.#.....#.# #.#.#.#.............#.#...#.#..HW
|
||||
#.#.#############.#.#.#####.#.# #.#####.#.#########.#.#.#.#.#.#
|
||||
#.#.#...#.#...#.#.......#.#.#..DQ #.#.#...#.#...#.........#.....#
|
||||
#.#.#.###.#.###.###.#.###.#.### #.#.#####.#.###.#####.#.###.###
|
||||
JZ....................#.........# QO....#.#.......#.#.#...#...#...#
|
||||
###.#########################.# ###.#.#.#.#######.###.###.#.#.#
|
||||
PF..#.#.......#.....#.........#.# #.......#...#...#.....#.#.#.#.#
|
||||
#.###.###.#.#.###.#.#.###.##### #############.#####.#.#.#######
|
||||
#.......#.#.....#...#.#.......# #...#...#...#...#...#.#.#...#.#
|
||||
#.#.#.###.#.#####.#.###.#.##### #.#.#.#.#.###.#####.###.###.#.#
|
||||
#.#.#...#.#.....#.#.#.#.#.#.#.# KL..#.#.#.#.....#...#.#.#.......#
|
||||
#.#.###.#####.###.###.###.#.#.# ###.#.#.#.#.#####.###.#######.#
|
||||
#.#...#...#...#...#............RU #...#.#...#...#.#.#.#...#.#.#..RP
|
||||
#.#.###.###.###.#.#.#.#.#.###.# #.###.#.#.###.#.#.#.#.###.#.#.#
|
||||
#.#...#.#.....#.#.#.#.#.#...#.# #.....#.#.#...................#
|
||||
###.###.#.###.###.###.###.###.# D P Y O H R P #.###.#######.#.#########.#.###
|
||||
#...#...#.#...#.....#.#...#.#.# W Z K A O O F #.#.......#...#.....#.....#...#
|
||||
#.#.###.###.###.#.#.#####.#.#########.#####.#########.#########.#####.###.###.#####.###.###.#.#.#.#######.#.#.###
|
||||
#.#.#.....#...#.#.#.#.#.........#.........#.#...#.......#.......#.#...#.....#.....#.#.....#.#.#.#...#.#...#.#...#
|
||||
###.###.###.#.#.#.###.#.###.#.###.###.###.#.#.#.###.#.#.#####.###.#.#####.#.#.#.#.#########.#####.#.#.###.###.###
|
||||
#.....#...#.#.#.#...#.....#.#.#.#.#...#.#.#...#...#.#.#.....#.#.........#.#.#.#.#.....#.#...#.#...#...#...#.....#
|
||||
###.#.#.#########.#######.#####.#######.#.#####.###.#.#######.###.#######.###.#.#######.#####.#####.#####.###.#.#
|
||||
#...#.#.#.#.#.#.....#.#...#...............#...#...#.#.#...#.....#.....#...#...#...#.#.........#.........#...#.#.#
|
||||
#.#.#.###.#.#.#.#####.#######.#.#.#.###.###.#.#.###.#####.#####.#.###.###.#.###.###.#.###########.###.#.###.#.#.#
|
||||
#.#.#...#.......#.#...#...#...#.#.#.#.#...#.#...#.......#.......#.#.#.#.......#.......#.......#...#...#...#.#.#.#
|
||||
#####.#########.#.#.###.#############.###.#.#######.###.#.#######.#.#####.###.#.#####.#####.#####.#.#.#.###.###.#
|
||||
#.#.......#.......#.#...#.................#.#.....#...#.#.#.#.#.....#.......#.#.....#...........#.#.#.#...#...#.#
|
||||
#.#.###.#.#########.#.#############.#######.#.###.###.###.#.#.###.#.###.#######.#####.#.#.#.#.#######.###.#.###.#
|
||||
#.....#.#.#.....#...#...#.#...............#.#...#...#.#...#.....#.#...#.#.#.........#.#.#.#.#...#.......#.#...#.#
|
||||
#.#.#####.#####.###.#.###.###############.#.###.#.###.###.#.###.#.#####.#.###.#####.###.###.#.#.###.#.#.#######.#
|
||||
#.#...#.....#.#.....#.....#.....#.#.......#.....#.#.....#.....#.#...#...#...#...#.#...#...#.#.#.#...#.#.#.......#
|
||||
#.#.#########.#####.#.#########.#.#.#######.#####.#.#.#.#.#.###.#.#########.#.###.#.###.#####.###.#.#.#########.#
|
||||
#.#.#...#.....#...#.....#.#.#.........#.......#...#.#.#.#.#.#.#.#...#.....#.......#.#.....#.....#.#.#...#.......#
|
||||
#.#####.#####.#.###.#.###.#.###.#.#.###.#.#.###.#.#.#####.###.#.#.#####.#######.#.###########.#####.#######.#.###
|
||||
#.#.......#.........#.#.#.......#.#.#.#.#.#.#...#.#.#.#.....#...#...#.....#...#.#.#...#...#...#.#.#.....#...#...#
|
||||
###.###.#.#.#.#.#.#.#.#.#.###.#.###.#.###.#####.###.#.#########.#.###.#######.#.#####.###.###.#.#.#########.###.#
|
||||
#.#...#.#...#.#.#.#.#...#.#.#.#...#.....#.#.......#...#.....#...#.......#.#.#...#.#...#.....#.#...#.....#.#.#...#
|
||||
#.#.#.#.#.#.#.#######.#####.###.###.#########.###.#.#####.#####.#######.#.#.#.###.#.###.#######.#.#.#.#.#.#####.#
|
||||
#.#.#.#.#.#.#.#.........#.........#.......#...#...#.....#...#...#.........#...........#.....#...#.#.#.#.#...#.#.#
|
||||
#.#####.###.#########.#########.###.#######.#####.#####.###.###.###.#.#.#######.#.#####.#.#####.###.#####.###.#.#
|
||||
#.......#.#.#.............#.....#...#.#.#.....#.#.#.....#...#.....#.#.#.#.....#.#...#.#.#...#...#...#.#.....#...#
|
||||
#.#.#####.###.###.#.#####.#########.#.#.#.#####.#.#.#.#.###.###.###.#######.#.#.#####.#.#####.#####.#.###.#######
|
||||
#.#...#.....#.#.#.#.#.#.........#.......#.#.#.#...#.#.#.#.......#...#...#.#.#.....................#...#.........#
|
||||
#########.#.###.#####.###.#####.###.#######.#.###.#.#######.###.#.#####.#.#.###############.#.#####.###.#########
|
||||
#.........#.........#.....#.........#...#.#...#...#...#...#.#...#.#.#.....................#.#...................#
|
||||
###.#.#####.#####.###.#.#####.#####.###.#.#.###.#.#.#.###.#.#####.#.###########.#######.#####.###.###########.###
|
||||
#...#.#.......#.......#.#.......#.....#.........#.#.#.#.......#.......#...............#.....#.#...........#.....#
|
||||
###################################.#######.#.#####.#####.###########.###.###.###################################
|
||||
J A O Q N Q S D
|
||||
O A A T Z O U A
|
94
2019/day20/main.go
Normal file
94
2019/day20/main.go
Normal file
@@ -0,0 +1,94 @@
|
||||
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)
|
||||
|
||||
}
|
||||
}
|
228
2019/day20/maze.go
Normal file
228
2019/day20/maze.go
Normal file
@@ -0,0 +1,228 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
|
||||
helpers "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||
)
|
||||
|
||||
type Maze struct {
|
||||
start *MazeCoord
|
||||
end *MazeCoord
|
||||
maze map[string]*MazeCoord
|
||||
portals map[string]*Portal
|
||||
|
||||
current *MazeCoord
|
||||
|
||||
BotX, BotY int
|
||||
TopX, TopY int
|
||||
}
|
||||
|
||||
func NewMaze(file string) *Maze {
|
||||
inp := helpers.FileToBytes(file)
|
||||
lines := bytes.Split(inp, []byte{'\n'})
|
||||
m := Maze{
|
||||
maze: make(map[string]*MazeCoord),
|
||||
portals: make(map[string]*Portal),
|
||||
}
|
||||
for yk, yv := range lines {
|
||||
for xk, xv := range yv {
|
||||
if xv == '.' || xv == '#' {
|
||||
m.maze[c(xk, yk)] = &MazeCoord{
|
||||
X: xk,
|
||||
Y: yk,
|
||||
Value: xv,
|
||||
steps: helpers.MAX_INT,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Now hook up neighbor coords
|
||||
for _, v := range m.maze {
|
||||
if v.X < m.BotX {
|
||||
m.BotX = v.X
|
||||
}
|
||||
if v.X > m.TopX {
|
||||
m.TopX = v.X
|
||||
}
|
||||
if v.Y < m.BotY {
|
||||
m.BotY = v.Y
|
||||
}
|
||||
if v.Y > m.TopY {
|
||||
m.TopY = v.Y
|
||||
}
|
||||
var d *MazeCoord
|
||||
var ok bool
|
||||
// Hook up north
|
||||
if d, ok = m.maze[c(v.X, v.Y-1)]; ok {
|
||||
v.N = d
|
||||
} else if v.Value == '.' {
|
||||
// North Portal
|
||||
name := string([]byte{lines[v.Y-2][v.X], lines[v.Y-1][v.X]})
|
||||
var p *Portal
|
||||
if p, ok = m.portals[name]; ok {
|
||||
v.N = m.maze[c(p.X1, p.Y1)]
|
||||
m.maze[c(p.X1, p.Y1)].S = v
|
||||
p.X2 = v.X
|
||||
p.Y2 = v.Y
|
||||
} else {
|
||||
m.portals[name] = &Portal{
|
||||
Name: name,
|
||||
X1: v.X,
|
||||
Y1: v.Y,
|
||||
}
|
||||
}
|
||||
}
|
||||
// Hook up east
|
||||
if d, ok = m.maze[c(v.X+1, v.Y)]; ok {
|
||||
v.E = d
|
||||
} else if v.Value == '.' {
|
||||
// East Portal
|
||||
name := string([]byte{lines[v.Y][v.X+1], lines[v.Y][v.X+2]})
|
||||
var p *Portal
|
||||
if p, ok = m.portals[name]; ok {
|
||||
v.E = m.maze[c(p.X1, p.Y1)]
|
||||
m.maze[c(p.X1, p.Y1)].W = v
|
||||
p.X2 = v.X
|
||||
p.Y2 = v.Y
|
||||
} else {
|
||||
m.portals[name] = &Portal{
|
||||
Name: name,
|
||||
X1: v.X,
|
||||
Y1: v.Y,
|
||||
}
|
||||
}
|
||||
}
|
||||
// Hook up south
|
||||
if d, ok = m.maze[c(v.X, v.Y+1)]; ok {
|
||||
v.S = d
|
||||
} else if v.Value == '.' {
|
||||
// South Portal
|
||||
name := string([]byte{lines[v.Y+1][v.X], lines[v.Y+2][v.X]})
|
||||
var p *Portal
|
||||
if p, ok = m.portals[name]; ok {
|
||||
v.S = m.maze[c(p.X1, p.Y1)]
|
||||
m.maze[c(p.X1, p.Y1)].N = v
|
||||
fmt.Println(v.S, "<=>", m.maze[c(p.X1, p.Y1)].N)
|
||||
p.X2 = v.X
|
||||
p.Y2 = v.Y
|
||||
} else {
|
||||
m.portals[name] = &Portal{
|
||||
Name: name,
|
||||
X1: v.X,
|
||||
Y1: v.Y,
|
||||
}
|
||||
}
|
||||
}
|
||||
// Hook up west
|
||||
if d, ok = m.maze[c(v.X-1, v.Y)]; ok {
|
||||
v.W = d
|
||||
} else if v.Value == '.' {
|
||||
// West Portal
|
||||
name := string([]byte{lines[v.Y][v.X-2], lines[v.Y][v.X-1]})
|
||||
var p *Portal
|
||||
if p, ok = m.portals[name]; ok {
|
||||
v.W = m.maze[c(p.X1, p.Y1)]
|
||||
m.maze[c(p.X1, p.Y1)].E = v
|
||||
p.X2 = v.X
|
||||
p.Y2 = v.Y
|
||||
} else {
|
||||
m.portals[name] = &Portal{
|
||||
Name: name,
|
||||
X1: v.X,
|
||||
Y1: v.Y,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
st := m.portals["AA"]
|
||||
m.current = m.maze[c(st.X1, st.Y1)]
|
||||
return &m
|
||||
}
|
||||
|
||||
func (m *Maze) MoveNorth() bool {
|
||||
if m.current.N != nil && m.current.N.Value == '.' {
|
||||
m.current = m.current.N
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *Maze) MoveEast() bool {
|
||||
if m.current.E != nil && m.current.E.Value == '.' {
|
||||
m.current = m.current.E
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *Maze) MoveSouth() bool {
|
||||
if m.current.S != nil && m.current.S.Value == '.' {
|
||||
m.current = m.current.S
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *Maze) MoveWest() bool {
|
||||
if m.current.W != nil && m.current.W.Value == '.' {
|
||||
m.current = m.current.W
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *Maze) Print() {
|
||||
for y := m.BotY; y <= m.TopY; y++ {
|
||||
for x := m.BotX; x <= m.TopX; x++ {
|
||||
if m.current.X == x && m.current.Y == y {
|
||||
fmt.Print("%")
|
||||
} else {
|
||||
if v, ok := m.maze[c(x, y)]; ok {
|
||||
fmt.Print(string(v.Value))
|
||||
} else {
|
||||
fmt.Print(" ")
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Maze) GetStart() *MazeCoord {
|
||||
start := m.portals["AA"]
|
||||
return m.maze[c(start.X1, start.Y1)]
|
||||
}
|
||||
|
||||
func (m *Maze) IsDone() bool {
|
||||
return m.IsEnd(m.current.X, m.current.Y)
|
||||
}
|
||||
|
||||
func (m *Maze) GetEnd() *MazeCoord {
|
||||
end := m.portals["ZZ"]
|
||||
return m.maze[c(end.X1, end.Y1)]
|
||||
}
|
||||
|
||||
func (m *Maze) IsEnd(x, y int) bool {
|
||||
return x == m.GetEnd().X && y == m.GetEnd().Y
|
||||
}
|
||||
|
||||
type Portal struct {
|
||||
Name string
|
||||
X1, Y1, X2, Y2 int
|
||||
}
|
||||
|
||||
type MazeCoord struct {
|
||||
X, Y int
|
||||
N, E, S, W *MazeCoord
|
||||
Value byte
|
||||
visited bool
|
||||
steps int
|
||||
}
|
||||
|
||||
func c(x, y int) string {
|
||||
return fmt.Sprintf("[%d, %d]", x, y)
|
||||
}
|
19
2019/day20/testinput1
Normal file
19
2019/day20/testinput1
Normal file
@@ -0,0 +1,19 @@
|
||||
A
|
||||
A
|
||||
#######.#########
|
||||
#######.........#
|
||||
#######.#######.#
|
||||
#######.#######.#
|
||||
#######.#######.#
|
||||
##### B ###.#
|
||||
BC...## C ###.#
|
||||
##.## ###.#
|
||||
##...DE F ###.#
|
||||
##### G ###.#
|
||||
#########.#####.#
|
||||
DE..#######...###.#
|
||||
#.#########.###.#
|
||||
FG..#########.....#
|
||||
###########.#####
|
||||
Z
|
||||
Z
|
Reference in New Issue
Block a user