mirror of
https://github.com/Noettore/AdventOfCode.git
synced 2025-10-14 19:26:39 +02:00
82 lines
1.4 KiB
Go
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)
|
|
}
|