91 lines
1.4 KiB
Go
91 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"git.z1glr.de/advent-of-code-2025/pkg/aoc"
|
|
)
|
|
|
|
type Server struct {
|
|
Start, Out bool
|
|
Destinations map[string]*Server
|
|
}
|
|
|
|
func (s *Server) Walk() int {
|
|
if s.Out {
|
|
return 1
|
|
} else {
|
|
routes := 0
|
|
|
|
for _, dd := range s.Destinations {
|
|
routes += dd.Walk()
|
|
}
|
|
|
|
return routes
|
|
}
|
|
}
|
|
|
|
func ParseServerLine(s string) (*Server, string) {
|
|
stringFields := strings.Fields(s)
|
|
|
|
returnServer := Server{
|
|
Destinations: make(map[string]*Server),
|
|
}
|
|
|
|
for _, ff := range stringFields[1:] {
|
|
switch ff {
|
|
case "you":
|
|
returnServer.Start = true
|
|
case "out":
|
|
returnServer.Out = true
|
|
default:
|
|
returnServer.Destinations[ff] = nil
|
|
}
|
|
}
|
|
|
|
return &returnServer, stringFields[0][:len(stringFields[0])-1]
|
|
}
|
|
|
|
func do(test bool) (int, int) {
|
|
rows := aoc.ReadFileRows(test)
|
|
|
|
servers := make(map[string]*Server)
|
|
|
|
starts := []*Server{}
|
|
|
|
for _, rr := range rows {
|
|
thisServer, name := ParseServerLine(rr)
|
|
|
|
servers[name] = thisServer
|
|
|
|
if thisServer.Start {
|
|
starts = append(starts, thisServer)
|
|
}
|
|
}
|
|
|
|
// populate destinations
|
|
for ii := range servers {
|
|
ss := servers[ii]
|
|
for dd := range ss.Destinations {
|
|
ss.Destinations[dd] = servers[dd]
|
|
}
|
|
}
|
|
|
|
routes := 0
|
|
|
|
for _, ss := range starts[:1] {
|
|
routes += ss.Walk()
|
|
}
|
|
|
|
fmt.Println(routes)
|
|
|
|
return routes, 0
|
|
}
|
|
|
|
func main() {
|
|
if r1, r2 := do(true); r1 == 5 && r2 == 0 {
|
|
do(false)
|
|
}
|
|
}
|