1+ import scala .io .Source
2+ import scala .util .Try
3+
4+ val dsts = Source .fromFile(" input.txt" ).getLines
5+
6+ val dstR = """ ([A-Za-z\d]+) to ([A-Za-z\d]+) = (\d+)""" .r
7+ case class Route (p1 : String , p2 : String , distance : Int )
8+
9+ def updateRoutes (m : Map [String , Map [String , Int ]], from : String , to : String , dst : Int ) = m.updated(from, m.get(from).getOrElse(Map [String , Int ]()).updated(to, dst))
10+
11+ val routes = dsts.map {
12+ case dstR(p1, p2, dst) => Route (p1, p2, dst.toInt)
13+ }.foldLeft(Map [String , Map [String , Int ]]()){
14+ case (acc, Route (p1, p2, dst)) => updateRoutes(updateRoutes(acc, p1, p2, dst), p2, p1, dst)
15+ }
16+
17+ def findRoute (place : String , visited : List [String ], dst : Int , comparator : (Int , Int ) => Boolean ): (List [String ], Int ) = {
18+ routes(place).filter { case (k, _) => ! visited.contains(k) && k != place } match {
19+ case s if s.isEmpty => (place :: visited, dst)
20+ case s => s.map { case (p, ds) => findRoute(p, place :: visited, dst + ds, comparator)}.reduceLeft((a, b) => if (comparator(a._2, b._2)) a else b)
21+ }
22+ }
23+
24+ def findLongestOrShortestRoute (shortest : Boolean = true ) = {
25+ val shortestComparator = (a : Int , b: Int ) => a < b
26+ val comparator = if (shortest) shortestComparator else (a : Int , b : Int ) => ! shortestComparator(a, b)
27+
28+ routes.keys.map(p => findRoute(p, List (), 0 , comparator)).reduceLeft((a, b) => if (comparator(a._2, b._2)) a else b)
29+ }
30+
31+ def findShortestRoute () = findLongestOrShortestRoute(true )
32+ def findLongestRoute () = findLongestOrShortestRoute(false )
33+
34+ val shortest = findShortestRoute()
35+ val longest = findLongestRoute()
36+
37+ println(s " The shortest route is ${shortest._2}: ${shortest._1.mkString(" , " )}" )
38+ println(s " The longest route is ${longest._2}: ${longest._1.mkString(" , " )}" )
0 commit comments