|      1 // Scala Lecture 3 |      1 // Scala Lecture 3 | 
|      2 //================= |      2 //================= | 
|         |      3  | 
|         |      4 // adding two binary strings very, very lazy manner | 
|         |      5  | 
|         |      6 def badd(s1: String, s2: String) : String =  | 
|         |      7   (BigInt(s1, 2) + BigInt(s2, 2)).toString(2) | 
|         |      8  | 
|         |      9  | 
|         |     10 // collatz function on binary numbers | 
|         |     11  | 
|         |     12 def bcollatz(s: String) : Long = (s.dropRight(1), s.last) match { | 
|         |     13   case ("", '1') => 1                                  // we reached 1 | 
|         |     14   case (rest, '0') => 1 + bcollatz(rest)               // even number => divide by two | 
|         |     15   case (rest, '1') => 1 + bcollatz(badd(s + '1', s))   // odd number => s + '1' is 2 * s + 1 | 
|         |     16                                                        //               add another s gives 3 * s + 1   | 
|         |     17 }  | 
|         |     18  | 
|         |     19 bcollatz(9.toBinaryString) | 
|         |     20 bcollatz(837799.toBinaryString) | 
|         |     21 bcollatz(100000000000000000L.toBinaryString) | 
|         |     22 bcollatz(BigInt("1000000000000000000000000000000000000000000000000000000000000000000000000000").toString(2)) | 
|         |     23  | 
|         |     24 def conv(c: Char) : Int = c match { | 
|         |     25   case '0' => 0 | 
|         |     26   case '1' => 1 | 
|         |     27 } | 
|         |     28  | 
|         |     29 def badds(s1: String, s2: String, carry: Int) : String = (s1, s2, carry) match { | 
|         |     30   case ("", "", 1) => "1" | 
|         |     31   case ("", "", 0) => "" | 
|         |     32   case (cs1, cs2, carry) => (conv(cs1.last) + conv(cs2.last) + carry) match { | 
|         |     33     case 3 => badds(cs1.dropRight(1), cs2.dropRight(1), 1) + '1' | 
|         |     34     case 2 => badds(cs1.dropRight(1), cs2.dropRight(1), 1) + '0' | 
|         |     35     case 1 => badds(cs1.dropRight(1), cs2.dropRight(1), 0) + '1' | 
|         |     36     case 0 => badds(cs1.dropRight(1), cs2.dropRight(1), 0) + '0' | 
|         |     37   } | 
|         |     38 }  | 
|         |     39  | 
|         |     40 def bcollatz2(s: String) : Long = (s.dropRight(1), s.last) match { | 
|         |     41   case ("", '1') => 1                                          // we reached 1 | 
|         |     42   case (rest, '0') => 1 + bcollatz2(rest)                      // even number => divide by two | 
|         |     43   case (rest, '1') => 1 + bcollatz2(badds(s + '1', '0' + s, 0))   // odd number => s + '1' is 2 * s + 1 | 
|         |     44                                                                   //         add another s gives 3 * s + 1   | 
|         |     45 }  | 
|         |     46  | 
|         |     47 bcollatz2(9.toBinaryString) | 
|         |     48 bcollatz2(837799.toBinaryString) | 
|         |     49 bcollatz2(100000000000000000L.toBinaryString) | 
|         |     50 bcollatz2(BigInt("1000000000000000000000000000000000000000000000000000000000000000000000000000").toString(2)) | 
|         |     51  | 
|      3  |     52  | 
|      4  |     53  | 
|      5 // One of only two places where I conceded to mutable |     54 // One of only two places where I conceded to mutable | 
|      6 // data structures: The following function generates  |     55 // data structures: The following function generates  | 
|      7 // new labels |     56 // new labels |