Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import scala.io.Source
- val input = Source.fromFile("C:/work/advent06/input4").getLines.toList
- case class Room(name: String, id: Int, checksum: String)
- val roomRegex = """((?:[a-z]+-)+)(\d+)\[([a-z]{5})\]""".r
- val rooms = input.map {
- case roomRegex(name, id, checksum) => Room(name, id.toInt, checksum)
- }
- def isReal(room: Room) = {
- val nameChars = room.name.toList.filter(_.isLower)
- val charsByFrequency = nameChars
- .groupBy(identity)
- .mapValues(_.size)
- .toList
- .sortBy(_._1).sortBy(-_._2)
- val checksum = charsByFrequency.take(5).map(_._1).mkString
- checksum == room.checksum
- }
- val realRooms = rooms.filter(isReal)
- val sumOfRealRoomIds = realRooms.map(_.id).sum
- def decrypt(room: Room) = {
- val shift = room.id % 26
- def decryptChar(c: Char) = {
- val afterShift = (c + shift).toChar
- if (afterShift > 'z') (afterShift - 26).toChar else afterShift
- }
- room.copy(name = room.name.toList.map(decryptChar).mkString)
- }
- val decryptedRooms = realRooms.map(decrypt)
- val targetRoom = decryptedRooms.find(_.name.startsWith("north"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement