Advertisement
Guest User

Untitled

a guest
Jul 15th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.07 KB | None | 0 0
  1. package day04
  2.  
  3. import java.io.File
  4.  
  5. /**
  6.  * author:  vishnu
  7.  * date:    5/20/17
  8.  * purpose:
  9.  */
  10.  
  11. fun main(args: Array<String>) {
  12.     val rooms = getRooms()
  13.     println("Part 1: total = ${rooms.map { it.id }.sum()}")
  14.     println("Part 2: room  = ${findNorthPoleRoom(rooms)}")
  15. }
  16.  
  17. private fun getRooms() =
  18.         File("src/day04/rooms.txt").readLines()
  19.                 .map {
  20.                     val name = it.substring(0, it.length - 10)
  21.                     val id = it.substring(it.length - 10, it.length - 7).toInt()
  22.                     val checksum = it.substring(it.length - 6, it.length - 1)
  23.                     Room(name, id, checksum)
  24.                 }
  25.                 .filter { it.isReal() }
  26.  
  27. private fun findNorthPoleRoom(rooms: List<Room>) =
  28.         rooms[rooms.indexOfFirst { decryptRoomName(it.name, it.id).contains("northpole") }].id
  29.  
  30. private fun decryptRoomName(name: String, id: Int): String {
  31.     val increase = id % 26
  32.     return name.toCharArray()
  33.             .map {
  34.                 when {
  35.                     it == '-' -> ' '
  36.                     it.toInt() + increase > 122 -> it.plus(increase - 26)
  37.                     else -> it.plus(increase)
  38.                 }
  39.             }
  40.             .joinToString("")
  41. }
  42.  
  43. internal class Room(val name: String, val id: Int, val checksum: String) {
  44.     fun isReal(): Boolean {
  45.         val chars: MutableMap<Char, Int> = HashMap(Math.min(name.length, 26))
  46.         name.toCharArray()
  47.                 .filterNot { it == '-' }
  48.                 .forEach {
  49.                     when {
  50.                         chars.containsKey(it) -> chars.put(it, chars.getValue(it) + 1)
  51.                         else -> chars.put(it, 1)
  52.                     }
  53.                 }
  54.         val sortedMap = chars.toSortedMap(ValueComparator(chars))
  55.         val generated = sortedMap.keys.take(5).joinToString("")
  56.         return generated == checksum
  57.     }
  58. }
  59.  
  60. internal class ValueComparator(val base: Map<Char, Int>) : Comparator<Char> {
  61.     override fun compare(a: Char, b: Char) = if (base.getValue(a) > base.getValue(b)) -1 else 1
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement