Files
AdventOfCode/2019/day_06/day_06.go
2020-12-25 23:50:29 +01:00

82 lines
1.4 KiB
Go

package main
import (
"bufio"
"fmt"
"log"
"os"
"strings"
)
func readValues(fileName string) map[string]string {
file, err := os.Open(fileName)
if err != nil {
log.Fatal(err)
}
defer file.Close()
orbits := make(map[string]string)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
value := scanner.Text()
planets := strings.Split(value, ")")
orbits[planets[1]] = planets[0]
}
return orbits
}
func getOrbitsNum(planet string, orbits map[string]string) int {
orbitsNum := 0
key := planet
orbit, hasOrbit := orbits[key]
for hasOrbit {
orbitsNum++
key = orbit
orbit, hasOrbit = orbits[key]
}
return orbitsNum
}
func getMinOrbitalTransfers(from string, to string, orbits map[string]string) int {
path := make(map[string]int)
orbit, hasOrbit := orbits[from]
distance := 0
for hasOrbit {
distance++
path[orbit] = distance
orbit, hasOrbit = orbits[orbit]
}
orbit, hasOrbit = orbits[to]
distance = 0
for hasOrbit {
dist, isInPath := path[orbit]
if isInPath {
distance += dist
return distance - 1
}
distance++
orbit, hasOrbit = orbits[orbit]
}
return -1
}
func main() {
orbits := readValues("./input")
orbitsNum := 0
for planet := range orbits {
orbitsNum += getOrbitsNum(planet, orbits)
}
fmt.Printf("Part 1: %d\n", orbitsNum)
minDist := getMinOrbitalTransfers("YOU", "SAN", orbits)
fmt.Printf("Part 2: %d\n", minDist)
}