73   | 
    73   | 
    74   | 
    74   | 
    75 // the same for files  | 
    75 // the same for files  | 
    76 Try(Some(Source.fromFile("text.txt").mkString)).getOrElse(None) | 
    76 Try(Some(Source.fromFile("text.txt").mkString)).getOrElse(None) | 
    77   | 
    77   | 
    78 // how to implement a function for reading something from files...  | 
    78   | 
    79   | 
    79 // how to implement a function for reading   | 
         | 
    80 // (lines) something from files...  | 
         | 
    81 //  | 
    80 def get_contents(name: String) : List[String] =   | 
    82 def get_contents(name: String) : List[String] =   | 
    81   Source.fromFile(name).getLines.toList  | 
    83   Source.fromFile(name).getLines.toList  | 
    82   | 
    84   | 
         | 
    85 get_contents("text.txt") | 
    83 get_contents("test.txt") | 
    86 get_contents("test.txt") | 
    84   | 
    87   | 
    85 // slightly better - return Nil  | 
    88 // slightly better - return Nil  | 
    86 def get_contents(name: String) : List[String] =   | 
    89 def get_contents(name: String) : List[String] =   | 
    87   Try(Source.fromFile(name).getLines.toList).getOrElse(List())  | 
    90   Try(Source.fromFile(name).getLines.toList).getOrElse(List())  | 
   359 //       ...  | 
   364 //       ...  | 
   360 //       case patternN => expressionN  | 
   365 //       case patternN => expressionN  | 
   361 //    }  | 
   366 //    }  | 
   362   | 
   367   | 
   363   | 
   368   | 
   364   | 
   369 // recall  | 
   365   | 
         | 
   366 // remember?  | 
         | 
   367 val lst = List(None, Some(1), Some(2), None, Some(3)).flatten  | 
   370 val lst = List(None, Some(1), Some(2), None, Some(3)).flatten  | 
   368   | 
         | 
   369   | 
   371   | 
   370 def my_flatten(xs: List[Option[Int]]): List[Int] = xs match { | 
   372 def my_flatten(xs: List[Option[Int]]): List[Int] = xs match { | 
   371   case Nil => Nil   | 
   373   case Nil => Nil   | 
   372   case None::rest => my_flatten(rest)  | 
   374   case None::rest => my_flatten(rest)  | 
   373   case Some(v)::rest => v :: my_flatten(rest)  | 
   375   case Some(v)::rest => v :: my_flatten(rest)  | 
   374 }  | 
   376 }  | 
         | 
   377   | 
         | 
   378 my_flatten(List(None, Some(1), Some(2), None, Some(3)))  | 
   375   | 
   379   | 
   376   | 
   380   | 
   377 // another example with a default case  | 
   381 // another example with a default case  | 
   378 def get_me_a_string(n: Int): String = n match { | 
   382 def get_me_a_string(n: Int): String = n match { | 
   379   case 0 | 1 | 2 => "small"  | 
   383   case 0 | 1 | 2 => "small"  | 
   536   | 
   540   | 
   537   | 
   541   | 
   538   | 
   542   | 
   539   | 
   543   | 
   540   | 
   544   | 
   541   | 
   545 // Jumping Towers  | 
         | 
   546 //================  | 
         | 
   547   | 
         | 
   548   | 
         | 
   549 def moves(xs: List[Int], n: Int) : List[List[Int]] = (xs, n) match { | 
         | 
   550   case (Nil, _) => Nil  | 
         | 
   551   case (xs, 0) => Nil  | 
         | 
   552   case (x::xs, n) => (x::xs) :: moves(xs, n - 1)  | 
         | 
   553 }  | 
         | 
   554   | 
         | 
   555   | 
         | 
   556 moves(List(5,1,0), 1)  | 
         | 
   557 moves(List(5,1,0), 2)  | 
         | 
   558 moves(List(5,1,0), 5)  | 
         | 
   559   | 
         | 
   560 // checks whether a jump tour exists at all  | 
         | 
   561   | 
         | 
   562 def search(xs: List[Int]) : Boolean = xs match { | 
         | 
   563   case Nil => true  | 
         | 
   564   case (x::xs) =>  | 
         | 
   565     if (xs.length < x) true else moves(xs, x).exists(search(_))  | 
         | 
   566 }  | 
         | 
   567   | 
         | 
   568   | 
         | 
   569 search(List(5,3,2,5,1,1))  | 
         | 
   570 search(List(3,5,1,0,0,0,1))  | 
         | 
   571 search(List(3,5,1,0,0,0,0,1))  | 
         | 
   572 search(List(3,5,1,0,0,0,1,1))  | 
         | 
   573 search(List(3,5,1))  | 
         | 
   574 search(List(5,1,1))  | 
         | 
   575 search(Nil)  | 
         | 
   576 search(List(1))  | 
         | 
   577 search(List(5,1,1))  | 
         | 
   578 search(List(3,5,1,0,0,0,0,0,0,0,0,1))  | 
         | 
   579   | 
         | 
   580 // generate *all* jump tours  | 
         | 
   581 //    if we are only interested in the shortes one, we could  | 
         | 
   582 //    shortcircut the calculation and only return List(x) in  | 
         | 
   583 //    case where xs.length < x, because no tour can be shorter  | 
         | 
   584 //    than 1  | 
         | 
   585 //   | 
         | 
   586   | 
         | 
   587 def jumps(xs: List[Int]) : List[List[Int]] = xs match { | 
         | 
   588   case Nil => Nil  | 
         | 
   589   case (x::xs) => { | 
         | 
   590     val children = moves(xs, x)  | 
         | 
   591     val results = children.map(cs => jumps(cs).map(x :: _)).flatten  | 
         | 
   592     if (xs.length < x) List(x) :: results else results  | 
         | 
   593   }  | 
         | 
   594 }  | 
         | 
   595   | 
         | 
   596 jumps(List(3,5,1,2,1,2,1))  | 
         | 
   597 jumps(List(3,5,1,2,3,4,1))  | 
         | 
   598 jumps(List(3,5,1,0,0,0,1))  | 
         | 
   599 jumps(List(3,5,1))  | 
         | 
   600 jumps(List(5,1,1))  | 
         | 
   601 jumps(Nil)  | 
         | 
   602 jumps(List(1))  | 
         | 
   603 jumps(List(5,1,2))  | 
         | 
   604 moves(List(1,2), 5)  | 
         | 
   605 jumps(List(1,5,1,2))  | 
         | 
   606 jumps(List(3,5,1,0,0,0,0,0,0,0,0,1))  | 
         | 
   607   | 
         | 
   608 jumps(List(5,3,2,5,1,1)).minBy(_.length)  | 
         | 
   609 jumps(List(1,3,5,8,9,2,6,7,6,8,9)).minBy(_.length)  | 
         | 
   610 jumps(List(1,3,6,1,0,9)).minBy(_.length)  | 
         | 
   611 jumps(List(2,3,1,1,2,4,2,0,1,1)).minBy(_.length)  | 
         | 
   612   | 
         | 
   613   | 
         | 
   614   |