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) } }