lluque

AoC day 2

Dec 28th, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.49 KB | None | 0 0
  1. import scala.io.Source
  2. import scala.annotation.tailrec
  3.  
  4. object day2 extends App {
  5.  
  6.   def nextDigit(d: Int, dir: Char): Int = dir match {
  7.     case 'D' => if (d + 3 > 9) d else d + 3
  8.     case 'R' => if (d % 3 == 0) d else d + 1
  9.     case 'U' => if (d - 3 < 1) d else d - 3
  10.     case 'L' => if ((d + 2) % 3 == 0) d else d - 1
  11.   }
  12.  
  13.   def nextDigit2(d: Int, dir: Char): Int = dir match {
  14.     case 'D' => d match {
  15.       case 5 | 9 | 10 | 12 | 13 => d
  16.       case 2 | 3 | 4 | 6 | 7 | 8 => d + 4
  17.       case 1 | 11 => d + 2
  18.     }
  19.     case 'U' => d match {
  20.       case 1 | 2 | 4 | 5 | 9 => d
  21.       case 6 | 7 | 8 | 10 | 11 | 12 => d - 4
  22.       case 3 | 13 => d - 2
  23.     }
  24.     case 'R' => d match {
  25.       case 1 | 4 | 9 | 12 | 13 => d
  26.       case _ => d + 1
  27.     }
  28.     case 'L' => d match {
  29.       case 1 | 2 | 5 | 10 | 13 => d
  30.       case _ => d - 1
  31.     }
  32.   }
  33.  
  34.   def getDigit(xs: List[Char], d: Int)(f: (Int, Char) => Int): Int = {
  35.  
  36.     @tailrec
  37.     def enterDigit(s: List[Char], digit: Int): Int = s match {
  38.       case Nil => digit
  39.       case h :: t => {
  40.         enterDigit(t, f(digit, h))
  41.       }
  42.     }
  43.  
  44.     enterDigit(xs, d)
  45.   }
  46.  
  47.   val source = Source.fromFile("day2.txt").getLines.toList
  48.   val passages = source map (l => l.toList)
  49.   val sequence = passages.scanLeft(5)((a, b) => getDigit(b, a)(nextDigit))
  50.   println((sequence drop 1).mkString)
  51.   val sequence2 = passages.scanLeft(5)((a, b) => getDigit(b, a)(nextDigit2))
  52.   println((sequence2 drop 1).map ("%x".format(_)).mkString)
  53.  
  54. }
Advertisement
Add Comment
Please, Sign In to add comment