| author | Christian Urban <urbanc@in.tum.de> | 
| Thu, 09 Nov 2017 16:21:01 +0000 | |
| changeset 138 | dc7aee946bf2 | 
| parent 109 | 6b362ee692c3 | 
| child 265 | 2692329287bb | 
| 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 | // (5) The file roman.txt contains a list of roman numerals. | 
| 108 | 101 | // Read in these numerals from the file, convert them into | 
| 102 | // integers and then add them all up. | |
| 105 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 103 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 104 | import io.Source | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 105 | import scala.util._ | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 106 | |
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 107 | // function for reading files: | 
| 
0f9f774c7697
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
104diff
changeset | 108 | // Source.fromFile("file_name")("ISO-8859-9")
 | 
| 108 | 109 | |
| 110 | def addromanfile(filename: String) = | |
| 111 | ||
| 112 | //test case | |
| 113 | addromanfile("roman.txt")
 | |
| 114 | ||
| 115 | ||
| 116 | // Part 2 about Validation of Roman Numerals | |
| 117 | //=========================================== | |
| 109 | 118 | |
| 119 | // (6) Write a function that validates roman numerals according | |
| 120 | // to the rules given in the CW. | |
| 121 | ||
| 122 | def isValidNumeral(digitList: RomanNumeral): Boolean = | |
| 123 | ||
| 124 | ||
| 125 | ||
| 126 | // some test cases | |
| 127 | val invalids = List("IXC", "XCX", "IIII", "IIIII", "DD", "VL", 
 | |
| 128 | "MIM", "XXCIII", "LXXIIX", "IIIIX", "IIXX", | |
| 129 | "ICM", "CIM", "VIV", "IVX", "MCMC", "XIIX", "IIXX") | |
| 130 | ||
| 131 | val valids = List("IV", "VI", "IX", "MCMLXXIX", "MCMXLIV", "", "MDCLXI",
 | |
| 132 | "MMMCMXCIX", "XLVIII", "MMVIII", "MMXI", "MCMLVI", "III", | |
| 133 | "XXX", "CCC", "MMM", "VII", "LXVI", "CL", "MCC", "XC", | |
| 134 | "MDCLXVI") | |
| 135 | ||
| 136 | // (7) Write a recursive function that converts an Integer into a | |
| 137 | // a roman numeral. The input will be between 0 and 3999. | |
| 138 | ||
| 139 | def Int2Roman(n: Int): RomanNumeral = | |
| 140 | ||
| 141 | // (8) Write a function that reads a text file containing valid and | |
| 142 | // invalid roman numerals. Convert all valid roman numerals into integers, | |
| 143 | // add them up and produce the result as a roman numeral (using the | |
| 144 | // function in (7) | |
| 145 | ||
| 146 | def addvalidromanfile(filename: String) = | |
| 147 | ||
| 148 | // a test case | |
| 149 | //addvalidromanfile("roman2.txt")
 |