|     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  |