✨ 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