Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.52 KB | None | 0 0
  1. package advent
  2.  
  3. class Day6 {
  4.  
  5.     open class Planet(
  6.         val name : String,
  7.         val orbits : String?
  8.     ) {
  9.         override fun equals(other : Any?) : Boolean {
  10.             if (this === other) return true
  11.             if (other !is Planet) return false
  12.             if (name != other.name) return false
  13.             return true
  14.         }
  15.         override fun hashCode() = name.hashCode()
  16.         override fun toString() = name
  17.     }
  18.  
  19.     class CenterOfMass : Planet("COM", null)
  20.  
  21.     companion object {
  22.  
  23.         fun getInput() : MutableMap<String, Planet> {
  24.             val planets = mutableMapOf<String, Planet>()
  25.             CenterOfMass().also { planets[it.name] = it }
  26.             javaClass
  27.                 .getResource("/Day6Input")
  28.                 .readText()
  29.                 .lines()
  30.                 .forEach {
  31.                     val parts = it.split(")")
  32.                     val planetName = parts[1]
  33.                     val orbits = parts[0]
  34.                     if (!planets.containsKey(planetName)) {
  35.                         planets[planetName] = Planet(planetName, orbits)
  36.                     }
  37.                 }
  38.             return planets
  39.         }
  40.  
  41.         fun getPathToCOM(planets : Map<String, Planet>, planet : Planet) : List<Planet> {
  42.             val path = mutableListOf<Planet>()
  43.             var scannedPlanet : Planet? = planet
  44.             while (scannedPlanet != null && scannedPlanet !is CenterOfMass) {
  45.                 scannedPlanet = planets[scannedPlanet.orbits]
  46.                 path.add(scannedPlanet ?: planets["COM"]!!)
  47.             }
  48.             return path
  49.         }
  50.  
  51.         fun part1() {
  52.             val planets = getInput()
  53.             var orbits = 0
  54.             for ((_, planet) in planets) {
  55.                 orbits += getPathToCOM(planets, planet).size
  56.             }
  57.             println(orbits)
  58.         }
  59.  
  60.         fun part2() {
  61.             val planets = getInput()
  62.             val yourPath = getPathToCOM(planets, planets["YOU"]!!).reversed()
  63.             val santasPath = getPathToCOM(planets, planets["SAN"]!!).reversed()
  64.             for (i in yourPath.indices) {
  65.                 if (yourPath[i] != santasPath[i]) {
  66.                     val hops = (yourPath.size - i) + (santasPath.size - i)
  67.                     println(hops)
  68.                     return
  69.                 }
  70.             }
  71.             println("Path not found")
  72.         }
  73.  
  74.         @JvmStatic
  75.         fun main(args : Array<String>) {
  76.             part1()
  77.             part2()
  78.         }
  79.  
  80.     }
  81.  
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement