day 12
parent
5125b326b3
commit
ad4db01ba7
@ -0,0 +1,26 @@
|
||||
start-YY
|
||||
av-rz
|
||||
rz-VH
|
||||
fh-av
|
||||
end-fh
|
||||
sk-gp
|
||||
ae-av
|
||||
YY-gp
|
||||
end-VH
|
||||
CF-qz
|
||||
qz-end
|
||||
qz-VG
|
||||
start-gp
|
||||
VG-sk
|
||||
rz-YY
|
||||
VH-sk
|
||||
rz-gp
|
||||
VH-av
|
||||
VH-fh
|
||||
sk-rz
|
||||
YY-sk
|
||||
av-gp
|
||||
rz-qz
|
||||
VG-start
|
||||
sk-fh
|
||||
VG-av
|
@ -0,0 +1,94 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Graph struct {
|
||||
nodes map[string]*Node
|
||||
}
|
||||
|
||||
type Node struct {
|
||||
name string
|
||||
neighbours []string
|
||||
}
|
||||
|
||||
func (g *Graph) addNode(location string) {
|
||||
if _, ok := g.nodes[location]; !ok {
|
||||
g.nodes[location] = &Node{location, make([]string, 0)}
|
||||
}
|
||||
}
|
||||
|
||||
func (g *Graph) addNeighbour(location, neighbourLocation string) {
|
||||
node := g.nodes[location]
|
||||
node.neighbours = append(node.neighbours, neighbourLocation)
|
||||
node = g.nodes[neighbourLocation]
|
||||
node.neighbours = append(node.neighbours, location)
|
||||
}
|
||||
|
||||
func (g *Graph) walk(n *Node, visited []string, target string, revisited bool) bool {
|
||||
if strings.ToLower(n.name) == n.name {
|
||||
for _, v := range visited {
|
||||
if v == n.name {
|
||||
if revisited || !partTwo {
|
||||
return false
|
||||
} else {
|
||||
revisited = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
visited = append(visited, n.name)
|
||||
|
||||
if n.name == target {
|
||||
total++
|
||||
return true
|
||||
}
|
||||
for _, neighbourLocation := range n.neighbours {
|
||||
if neighbourLocation == "start" {
|
||||
continue
|
||||
}
|
||||
node, ok := g.nodes[neighbourLocation]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
g.walk(node, visited, target, revisited)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
var total int
|
||||
var partTwo bool
|
||||
|
||||
func main() {
|
||||
file, err := os.Open("input.txt")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
scanner.Split(bufio.ScanLines)
|
||||
|
||||
graph := Graph{make(map[string]*Node)}
|
||||
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
path := strings.Split(line, "-")
|
||||
graph.addNode(path[0])
|
||||
graph.addNode(path[1])
|
||||
graph.addNeighbour(path[0], path[1])
|
||||
}
|
||||
|
||||
start := graph.nodes["start"]
|
||||
visited := []string{}
|
||||
graph.walk(start, visited, "end", false)
|
||||
fmt.Println(total)
|
||||
partTwo, total = true, 0
|
||||
graph.walk(start, visited, "end", false)
|
||||
fmt.Println(total)
|
||||
}
|
Loading…
Reference in New Issue