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 |