| author | Christian Urban <christian dot urban at kcl dot ac dot uk> | 
| Wed, 25 Jan 2017 14:36:39 +0000 | |
| changeset 105 | 0f9f774c7697 | 
| parent 104 | a7ce74d89085 | 
| child 108 | 833e17ba391c | 
| permissions | -rw-r--r-- | 
| 105 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 1 | // Part 1 about Roman Numerals | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 2 | //============================= | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 3 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 4 | |
| 104 
a7ce74d89085
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 5 | abstract class RomanDigit | 
| 
a7ce74d89085
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 6 | case object I extends RomanDigit | 
| 
a7ce74d89085
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 7 | case object V extends RomanDigit | 
| 
a7ce74d89085
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 8 | case object X extends RomanDigit | 
| 
a7ce74d89085
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 9 | case object L extends RomanDigit | 
| 
a7ce74d89085
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 10 | case object C extends RomanDigit | 
| 
a7ce74d89085
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 11 | case object D extends RomanDigit | 
| 
a7ce74d89085
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 12 | case object M extends RomanDigit | 
| 105 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 13 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 14 | type RomanNumeral = List[RomanDigit] | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 15 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 16 | // (1) First write a polymorphic function that recursively | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 17 | // transforms a list of options into an option of a list. | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 18 | // As soon as a None is inside the list, the result is None. | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 19 | // Otherwise produce a list of all Some's appended. | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 20 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 21 | def optionlist[A](xs: List[Option[A]]): Option[List[A]] = | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 22 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 23 | // (2) Write a function first a function that converts a character | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 24 | // into a roman digit (if possible). Then convert a string into | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 25 | // a roman numeral (if possible). If this is not possible, the functions | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 26 | // should return None. | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 27 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 28 | def Char2RomanDigit(c: Char): Option[RomanDigit] = | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 29 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 30 | def String2RomanNumeral(s: String) : Option[RomanNumeral] = | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 31 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 32 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 33 | // some test cases | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 34 | //String2RomanNumeral("IIII")
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 35 | //String2RomanNumeral("IV")
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 36 | //String2RomanNumeral("VI")
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 37 | //String2RomanNumeral("IX")
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 38 | //String2RomanNumeral("MCMLXXIX")
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 39 | //String2RomanNumeral("MCMXLIV") 
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 40 | //String2RomanNumeral("M C M X L I V")  // None
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 41 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 42 | // (3) Write a recursive function RomanNumral2Int that converts a | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 43 | // RomanNumeral into an integer. | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 44 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 45 | def RomanNumeral2Int(rs: RomanNumeral): Int = | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 46 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 47 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 48 | // some test cases | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 49 | RomanNumeral2Int(List(I,I,I,I)) // 4 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 50 | RomanNumeral2Int(List(I,V)) // 4 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 51 | RomanNumeral2Int(List(V,I)) // 6 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 52 | RomanNumeral2Int(List(I,X)) // 9 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 53 | RomanNumeral2Int(List(M,C,M,L,X,X,I,X)) // 1979 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 54 | RomanNumeral2Int(List(M,C,M,X,L,I,V)) // 1944 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 55 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 56 | // (4) Write a function that converts a string (containing | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 57 | // a roman numeral) into an integer (if possible). If not | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 58 | // this is not possible, the functions should return None. | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 59 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 60 | def String2Int(s: String): Option[Int] = | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 61 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 62 | // some test cases | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 63 | String2Int("IIII")      // 4 (though invalid roman numeral)  
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 64 | String2Int("IV")        // 4
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 65 | String2Int("VI")        // 6
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 66 | String2Int("IX")        // 9
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 67 | String2Int("MCMLXXIX")  // 1979
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 68 | String2Int("MCMXLIV")   // 1944
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 69 | String2Int("")          // 0
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 70 | String2Int("MDCLXI")    // 1661
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 71 | String2Int("MMMCMXCIX") // 3999
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 72 | String2Int("XLVIII")    // 48
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 73 | String2Int("MMVIII")    // 2008
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 74 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 75 | String2Int("MMXI")      // 2011 
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 76 | String2Int("MIM")       // 1999
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 77 | String2Int("MCMLVI")    // 1956 
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 78 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 79 | String2Int("III") 	// 3
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 80 | String2Int("XXX") 	// 30
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 81 | String2Int("CCC") 	// 300
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 82 | String2Int("MMM") 	// 3000
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 83 | String2Int("VII") 	// 7
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 84 | String2Int("LXVI") 	// 66
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 85 | String2Int("CL") 	// 150
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 86 | String2Int("MCC") 	// 1200
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 87 | String2Int("IV") 	// 4
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 88 | String2Int("IX") 	// 9
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 89 | String2Int("XC") 	// 90
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 90 | String2Int("MDCLXVI")	// 1666
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 91 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 92 | String2Int("VIV")       // 9 (but should be written as IX) 
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 93 | String2Int("IVX")       // 14 (also invalid)
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 94 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 95 | // error cases | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 96 | String2Int("MC?I")
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 97 | String2Int("abc")
 | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 98 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 99 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 100 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 101 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 102 | // (5) The file roman.txt contains a list of roman numerals. | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 103 | // Read in these numerals, convert them into integers and then | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 104 | // add them all up. | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 105 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 106 | import io.Source | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 107 | import scala.util._ | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 108 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 109 | // function for reading files: | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 110 | // Source.fromFile("file_name")("ISO-8859-9")
 |