Guest User

Untitled

a guest
Dec 14th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.96 KB | None | 0 0
  1. import scala.io.Source
  2.  
  3. def findGroup(v: String, groups: Map[String, Set[String]]): Set[String] = {
  4. def loop(toVisit: Set[String], visited: Set[String]): Set[String] = (toVisit -- visited) match {
  5. case v if v.isEmpty => visited
  6. case v => loop(v.flatMap(n => groups.get(n).getOrElse(Set.empty[String])), visited ++ v)
  7. }
  8. loop(Set(v), Set.empty[String])
  9. }
  10.  
  11. def partOne(groups: Map[String, Set[String]]): Int = findGroup("0", groups).size
  12. def partTwo(groups: Map[String, Set[String]]): Int = groups.foldLeft((0, Set.empty[String])){ case ((n, visited), (k, _)) =>
  13. if (!visited.contains(k)) (n + 1, visited ++ findGroup(k, groups))
  14. else (n, visited)
  15. }._1
  16.  
  17. val input = Source.fromFile("../input12.txt").mkString.split("\n").toSeq.map { l =>
  18. l.split(" <-> ").toList match {
  19. case p :: c :: Nil => (p -> c.split(", ").toSet)
  20. case _ => throw new RuntimeException("bad input")
  21. }
  22. }.toMap
  23.  
  24. println(s"Part 1: ${partOne(input)}")
  25. println(s"Part 2: ${partTwo(input)}")
Add Comment
Please, Sign In to add comment