✨ Finish part 1 & part 2 of day 6
This commit is contained in:
parent
d31498216f
commit
461c4a493d
1069
day6/input.txt
Normal file
1069
day6/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
149
day6/main.go
Normal file
149
day6/main.go
Normal file
@ -0,0 +1,149 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"log"
|
||||
"math"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type (
|
||||
Planet struct {
|
||||
Name string
|
||||
Planets []*Planet
|
||||
Orbit []*Planet
|
||||
}
|
||||
)
|
||||
|
||||
func main() {
|
||||
file, err := os.Open("input.txt")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
cmds := make([]string, 0)
|
||||
for scanner.Scan() {
|
||||
cmds = append(cmds, scanner.Text())
|
||||
}
|
||||
|
||||
planets := ParseMap(cmds)
|
||||
|
||||
log.Println("Part1: " + strconv.Itoa(SolvePzl1(planets)))
|
||||
log.Println("Part2: " + strconv.Itoa(SolvePzl2(planets)))
|
||||
}
|
||||
|
||||
func SolvePzl1(planets []*Planet) int {
|
||||
sum := 0
|
||||
for i := 0; i < len(planets); i++ {
|
||||
sum += CountOrbits(planets[i])
|
||||
}
|
||||
return sum
|
||||
}
|
||||
|
||||
func SolvePzl2(planets []*Planet) int {
|
||||
startPlanet := FindPlanet("YOU", planets)
|
||||
sum, _ := CountPath("SAN", startPlanet, make([]*Planet, 0))
|
||||
return sum - 2
|
||||
}
|
||||
|
||||
func ParseMap(list []string) []*Planet {
|
||||
planets := make([]*Planet, 0)
|
||||
var orbitPlanet *Planet
|
||||
var inPlanet *Planet
|
||||
|
||||
for _, cmd := range list {
|
||||
parts := strings.Split(cmd, ")")
|
||||
inPlanetName := parts[0]
|
||||
orbitName := parts[1]
|
||||
|
||||
orbitPlanet, planets = GetOrInitialPlanet(orbitName, planets)
|
||||
inPlanet, planets = GetOrInitialPlanet(inPlanetName, planets)
|
||||
|
||||
orbitPlanet.Planets = append(orbitPlanet.Planets, inPlanet)
|
||||
inPlanet.Orbit = append(inPlanet.Orbit, orbitPlanet)
|
||||
}
|
||||
return planets
|
||||
}
|
||||
|
||||
func CountOrbits(planet *Planet) int {
|
||||
sum := len(planet.Planets)
|
||||
|
||||
if sum == 0 {
|
||||
return 0
|
||||
}
|
||||
|
||||
for i := 0; i < len(planet.Planets); i++ {
|
||||
sum += CountOrbits(planet.Planets[i])
|
||||
}
|
||||
return sum
|
||||
}
|
||||
|
||||
func CountPath(destination string, currentPlanet *Planet, checkedPlanets []*Planet) (int, bool) {
|
||||
|
||||
if currentPlanet.Name == destination {
|
||||
return 0, true
|
||||
}
|
||||
|
||||
if FindPlanet(currentPlanet.Name, checkedPlanets) != nil {
|
||||
return -1, false
|
||||
}
|
||||
|
||||
if len(currentPlanet.Planets) == 0 {
|
||||
return -1, false
|
||||
}
|
||||
checkedPlanets = append(checkedPlanets, currentPlanet)
|
||||
|
||||
minimumCost := math.MaxInt32
|
||||
wasSuccess := false
|
||||
|
||||
for i := 0; i < len(currentPlanet.Orbit); i++ {
|
||||
path, success := CountPath(destination, currentPlanet.Orbit[i], checkedPlanets)
|
||||
path += 1
|
||||
if success {
|
||||
wasSuccess = true
|
||||
if path <= minimumCost {
|
||||
minimumCost = path
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for i := 0; i < len(currentPlanet.Planets); i++ {
|
||||
path, success := CountPath(destination, currentPlanet.Planets[i], checkedPlanets)
|
||||
path += 1
|
||||
if success {
|
||||
wasSuccess = true
|
||||
if path <= minimumCost {
|
||||
minimumCost = path
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return minimumCost, wasSuccess
|
||||
}
|
||||
|
||||
func FindPlanet(name string, planets []*Planet) *Planet {
|
||||
for i := 0; i < len(planets); i++ {
|
||||
if planets[i].Name == name {
|
||||
return planets[i]
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetOrInitialPlanet(name string, planets []*Planet) (*Planet, []*Planet) {
|
||||
planet := FindPlanet(name, planets)
|
||||
|
||||
if planet == nil {
|
||||
planet = &Planet{
|
||||
Name: name,
|
||||
Planets: make([]*Planet, 0),
|
||||
Orbit: make([]*Planet, 0),
|
||||
}
|
||||
planets = append(planets, planet)
|
||||
}
|
||||
return planet, planets
|
||||
}
|
Loading…
Reference in New Issue
Block a user