Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.84 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "errors"
  5.     "fmt"
  6.     "io/ioutil"
  7.     "strings"
  8. )
  9.  
  10. type planet struct {
  11.     name     string
  12.     parent   *planet
  13.     children []*planet
  14. }
  15.  
  16. func main() {
  17.     inputFile, _ := ioutil.ReadFile("input.txt")
  18.     orbits := strings.Split(string(inputFile), "\n")
  19.  
  20.     rootPlanet := planet{name: "COM"}
  21.     rootPlanet.addOrbits(orbits)
  22.     fmt.Println("Part 1:", rootPlanet.countOrbits(0))
  23.     fmt.Println("Part 2:", rootPlanet.findDistance("YOU", "SAN"))
  24. }
  25.  
  26. func (p *planet) addOrbits(relationships []string) []string {
  27.     var i int
  28.     for i < len(relationships) {
  29.         ab := strings.Split(relationships[i], ")")
  30.         if ab[0] == p.name {
  31.             child := &planet{name: ab[1], parent: p}
  32.             p.children = append(p.children, child)
  33.             relationships = remove(relationships, i)
  34.         } else {
  35.             i++
  36.         }
  37.     }
  38.     for _, child := range p.children {
  39.         relationships = child.addOrbits(relationships)
  40.     }
  41.     return relationships
  42. }
  43.  
  44. func remove(a []string, i int) []string {
  45.     a[i] = a[len(a)-1]  // Copy last element to index i.
  46.     a[len(a)-1] = ""    // Erase last element (write zero value).
  47.     return a[:len(a)-1] // Truncate slice.
  48. }
  49.  
  50. func (p *planet) countOrbits(count int) int {
  51.     var additional int
  52.     for _, child := range p.children {
  53.         additional += child.countOrbits(count + 1)
  54.     }
  55.     return count + additional
  56. }
  57.  
  58. func (p *planet) findObject(name string) (int, error) {
  59.     if p.name == name {
  60.         return -1, nil
  61.     }
  62.     for _, child := range p.children {
  63.         distance, err := child.findObject(name)
  64.         if err == nil {
  65.             return distance + 1, nil
  66.         }
  67.     }
  68.  
  69.     return 0, errors.New("not found")
  70. }
  71.  
  72. func (p *planet) findDistance(a, b string) int {
  73.     d1, err1 := p.findObject(a)
  74.     d2, err2 := p.findObject(b)
  75.     if err1 != nil || err2 != nil {
  76.         return -1
  77.     }
  78.     for _, child := range p.children {
  79.         d := child.findDistance(a, b)
  80.         if d > 0 {
  81.             return d
  82.         }
  83.     }
  84.     return d1 + d2
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement