Day 12
This commit is contained in:
parent
bd775b28db
commit
b40328ee5d
4 changed files with 59 additions and 2 deletions
|
@ -75,7 +75,7 @@ object Day11 extends Day {
|
||||||
override def part2(input: String): String = {
|
override def part2(input: String): String = {
|
||||||
val directions = getDirections(input)
|
val directions = getDirections(input)
|
||||||
def findFurthest(directions: List[Direction], step: Int = 1, max: Int = 0): Int = {
|
def findFurthest(directions: List[Direction], step: Int = 1, max: Int = 0): Int = {
|
||||||
if(step > directions.length) {
|
if (step > directions.length) {
|
||||||
max
|
max
|
||||||
} else {
|
} else {
|
||||||
val mds = directions.take(step)
|
val mds = directions.take(step)
|
||||||
|
|
54
aoc/src/main/scala/aoc/y2017/Day12.scala
Normal file
54
aoc/src/main/scala/aoc/y2017/Day12.scala
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
package aoc.y2017
|
||||||
|
|
||||||
|
import aoc.Day
|
||||||
|
|
||||||
|
import scalax.collection.Graph
|
||||||
|
import scalax.collection.GraphPredef._, scalax.collection.GraphEdge._
|
||||||
|
import scalax.collection.edge.Implicits._
|
||||||
|
|
||||||
|
object Day12 extends Day {
|
||||||
|
|
||||||
|
import fastparse._, SingleLineWhitespace._
|
||||||
|
|
||||||
|
def channelNameParser[_: P]: P[Int] = P(CharIn("0-9").rep(1).!).map(_.toInt)
|
||||||
|
def connectionListParser[_: P]: P[Seq[Int]] = P(channelNameParser.rep(1, ","./))
|
||||||
|
|
||||||
|
def channelParser[_: P]: P[Seq[DiEdge[Int]]] = P(channelNameParser ~ "<->" ~ connectionListParser).map {
|
||||||
|
case (name, connections) => connections.map(name ~> _)
|
||||||
|
}
|
||||||
|
|
||||||
|
def channelsParser[_: P]: P[Graph[Int, DiEdge]] =
|
||||||
|
P(channelParser.rep(1, "\n"./)).map(s => {
|
||||||
|
val allEdges = s.flatten
|
||||||
|
Graph.apply(allEdges: _*)
|
||||||
|
})
|
||||||
|
|
||||||
|
def getGraph(input: String): Graph[Int, DiEdge] = {
|
||||||
|
val Parsed.Success(graph, _) = parse(input, channelsParser(_))
|
||||||
|
graph
|
||||||
|
}
|
||||||
|
|
||||||
|
def findGroup(graph: Graph[Int, DiEdge])(startingNode: graph.NodeT): Set[graph.NodeT] =
|
||||||
|
graph.nodes.filter(_.pathTo(startingNode).isDefined).toSet
|
||||||
|
|
||||||
|
override def part1(input: String): String = {
|
||||||
|
val graph = getGraph(input)
|
||||||
|
val zero = graph get 0
|
||||||
|
graph.nodes.count(_.pathTo(zero).isDefined).toString
|
||||||
|
}
|
||||||
|
|
||||||
|
override def part2(input: String): String = {
|
||||||
|
val graph = getGraph(input)
|
||||||
|
def groups(g: Graph[Int, DiEdge], count: Int = 0): Int = {
|
||||||
|
if (g.isEmpty) {
|
||||||
|
count
|
||||||
|
} else {
|
||||||
|
val node = g.nodes.toList.head
|
||||||
|
val group = findGroup(g)(node)
|
||||||
|
groups(g --! group, count + 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
groups(graph).toString
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -16,6 +16,7 @@ package object y2017 extends Year {
|
||||||
"9" -> Day09,
|
"9" -> Day09,
|
||||||
"10" -> Day10,
|
"10" -> Day10,
|
||||||
"11" -> Day11,
|
"11" -> Day11,
|
||||||
|
"12" -> Day12,
|
||||||
"25" -> Day25
|
"25" -> Day25
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -30,6 +31,7 @@ package object y2017 extends Year {
|
||||||
}
|
}
|
||||||
|
|
||||||
implicit class TupleInt2Ops(t: (Int, Int)) {
|
implicit class TupleInt2Ops(t: (Int, Int)) {
|
||||||
|
|
||||||
def +(o: (Int, Int)): (Int, Int) = (t, o) match {
|
def +(o: (Int, Int)): (Int, Int) = (t, o) match {
|
||||||
case ((x1, y1), (x2, y2)) => (x1 + x2, y1 + y2)
|
case ((x1, y1), (x2, y2)) => (x1 + x2, y1 + y2)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,8 @@ val sharedSettings = Seq(
|
||||||
version := "0.1.0",
|
version := "0.1.0",
|
||||||
scalaVersion := "2.12.7",
|
scalaVersion := "2.12.7",
|
||||||
libraryDependencies ++= List(
|
libraryDependencies ++= List(
|
||||||
"com.lihaoyi" %%% "fastparse" % "2.0.4",
|
"com.lihaoyi" %%% "fastparse" % "2.0.4",
|
||||||
|
"org.scala-graph" %%% "graph-core" % "1.12.5",
|
||||||
),
|
),
|
||||||
mainClass := Some("tf.bug.aoc.Main"),
|
mainClass := Some("tf.bug.aoc.Main"),
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue