diff --git a/aoc/src/main/scala/aoc/AoC2017.scala b/aoc/src/main/scala/aoc/AoC2017.scala index f3c6102..00fdf7e 100644 --- a/aoc/src/main/scala/aoc/AoC2017.scala +++ b/aoc/src/main/scala/aoc/AoC2017.scala @@ -15,7 +15,7 @@ object AoC2017 extends Year { val reg = """(\d)(?=\1)""".r val matches = reg.findAllIn(input).toList val csum = matches.map(_.toInt).sum - if(input.head == input.last) { + if (input.head == input.last) { (csum + input.head.toString.toInt).toString } else { csum.toString @@ -25,7 +25,7 @@ object AoC2017 extends Year { override def part2(input: String): String = { val (left, right) = input.splitAt(input.length / 2) val zipped = left.zip(right) - val doubled = zipped.filter { case (l, r) => l == r}.map { case (c, _) => c.toString } + val doubled = zipped.filter { case (l, r) => l == r }.map { case (c, _) => c.toString } (doubled.map(_.toInt).sum * 2).toString } @@ -45,15 +45,17 @@ object AoC2017 extends Year { val lines = input.lines.toList val rows = lines.map(_.split("""\s+""").map(_.toInt)) rows.flatMap { r => - val q = r.zipWithIndex.flatMap { case (e, i) => - r.drop(i + 1).map(f => { - val (min, max) = (Math.min(e, f), Math.max(e, f)) - if(max % min == 0) { - Some(max / min) - } else { - None - } - }) + val q = r.zipWithIndex.flatMap { + case (e, i) => + r.drop(i + 1) + .map(f => { + val (min, max) = (Math.min(e, f), Math.max(e, f)) + if (max % min == 0) { + Some(max / min) + } else { + None + } + }) } q.filter(_.isDefined).map(_.get) }.sum.toString @@ -67,7 +69,7 @@ object AoC2017 extends Year { case class Cell(num: Int, stepSize: Int, stepFrac: Int, stepped: Int, dist: (Int, Int)) val inum = input.toInt (inum match { - case 1 => 0 + case 1 => 0 case _ => val layer = (Math.sqrt(inum).ceil / 2).floor.toInt val square = ((layer + 1) * 2) - 1 @@ -99,7 +101,13 @@ object AoC2017 extends Year { case object MoveRight extends Direction { override def change: Int = 1 } - case class Program(beginIn: State, diagnosticCount: Int, states: Map[State, InState], index: Int = 0, tape: Map[Int, Int] = Map()) { + case class Program( + beginIn: State, + diagnosticCount: Int, + states: Map[State, InState], + index: Int = 0, + tape: Map[Int, Int] = Map() + ) { def step: Program = { val ndc = diagnosticCount - 1 @@ -118,31 +126,37 @@ object AoC2017 extends Year { } - def stateParser[_: P]: P[State] = P( "state" ~ CharIn("A-Z").rep.! ).map(State) - def writeParser[_: P]: P[Int] = P( "- Write the value" ~ ("0" | "1").! ~ "." ).map(_.toInt) - def directionParser[_: P]: P[Direction] = P( "- Move one slot to the" ~ ("left" | "right").! ~ "." ).map { + def stateParser[_: P]: P[State] = P("state" ~ CharIn("A-Z").rep.!).map(State) + def writeParser[_: P]: P[Int] = P("- Write the value" ~ ("0" | "1").! ~ ".").map(_.toInt) + + def directionParser[_: P]: P[Direction] = P("- Move one slot to the" ~ ("left" | "right").! ~ ".").map { case "left" => MoveLeft case "right" => MoveRight } def stateChangeParser[_: P]: P[State] = P("- Continue with" ~ stateParser ~ ".") - def branchParser[_: P]: P[Branch] = P( writeParser ~ directionParser ~ stateChangeParser ).map { + + def branchParser[_: P]: P[Branch] = P(writeParser ~ directionParser ~ stateChangeParser).map { case (write, dir, state) => Branch(write, dir, state) } - def inStateParser[_: P]: P[InState] = P( - "In" ~ stateParser ~ ":" ~ "If the current value is 0:" ~ branchParser ~ "If the current value is 1:" ~ branchParser - ).map { - case (state, v0, v1) => InState(state, v0, v1) - } - def programParser[_: P]: P[Program] = P( - "Begin in" ~ stateParser ~ "." ~ - "Perform a diagnostic checksum after" ~ CharIn("0-9").rep(1).!.map(_.toInt) ~ "steps." ~ - inStateParser.rep.map(f => { - val z = f.map(_.state).zip(f) - z.toMap - }) - ).map { - case (begin, steps, states) => Program(begin, steps, states) - } + + def inStateParser[_: P]: P[InState] = + P( + "In" ~ stateParser ~ ":" ~ "If the current value is 0:" ~ branchParser ~ "If the current value is 1:" ~ branchParser + ).map { + case (state, v0, v1) => InState(state, v0, v1) + } + + def programParser[_: P]: P[Program] = + P( + "Begin in" ~ stateParser ~ "." ~ + "Perform a diagnostic checksum after" ~ CharIn("0-9").rep(1).!.map(_.toInt) ~ "steps." ~ + inStateParser.rep.map(f => { + val z = f.map(_.state).zip(f) + z.toMap + }) + ).map { + case (begin, steps, states) => Program(begin, steps, states) + } override def part1(input: String): String = { val Parsed.Success(program, _) = parse(input, programParser(_)) diff --git a/build.sbt b/build.sbt index 5234748..22e83ee 100644 --- a/build.sbt +++ b/build.sbt @@ -1,9 +1,9 @@ import sbtcrossproject.CrossPlugin.autoImport.{crossProject, CrossType} val sharedSettings = Seq( - name := "aoc", + name := "aoc", organization := "tf.bug", - version := "0.1.0", + version := "0.1.0", scalaVersion := "2.11.12", libraryDependencies ++= List( "com.lihaoyi" %%% "fastparse" % "2.0.4", @@ -11,10 +11,10 @@ val sharedSettings = Seq( mainClass := Some("tf.bug.aoc.Main"), ) -lazy val aoc = crossProject(JSPlatform, JVMPlatform /* , NativePlatform */) - .crossType(CrossType.Pure) - .settings(sharedSettings) +lazy val aoc = crossProject(JSPlatform, JVMPlatform /* , NativePlatform */ ) + .crossType(CrossType.Pure) + .settings(sharedSettings) -lazy val aocJS = aoc.js -lazy val aocJVM = aoc.jvm +lazy val aocJS = aoc.js +lazy val aocJVM = aoc.jvm // lazy val aocNative = aoc.native