Last active
May 31, 2017 14:58
-
-
Save anatollupacescu/733c7b80e0188ade00b1b578965b56a9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//initial | |
import org.junit.Test; | |
import static org.junit.Assert.assertEquals; | |
public class RomanNumerals { | |
@Test | |
public void test1() { | |
assertEquals(1, toNumber("I")); | |
assertEquals(2, toNumber("II")); | |
assertEquals(3, toNumber("III")); | |
assertEquals(4, toNumber("IV")); | |
assertEquals(5, toNumber("V")); | |
assertEquals(6, toNumber("VI")); | |
assertEquals(7, toNumber("VII")); | |
assertEquals(8, toNumber("VIII")); | |
assertEquals(9, toNumber("IX")); | |
assertEquals("X", toRoman(10)); | |
assertEquals(10, toNumber("X")); | |
assertEquals("XXI", toRoman(21)); | |
assertEquals(29, toNumber("XXIX")); | |
assertEquals(36, toNumber("XXXVI")); | |
assertEquals(49, toNumber("XLIX")); | |
assertEquals("XLIX", toRoman(49)); | |
assertEquals("LXXI", toRoman(71)); | |
assertEquals("MCMLIV", toRoman(1954)); | |
assertEquals("CDLXXI", toRoman(471)); | |
assertEquals("DCLXXI", toRoman(671)); | |
assertEquals("MDCLXXI", toRoman(1671)); | |
assertEquals("MCMLIV", toRoman(1954)); | |
assertEquals(1954, toNumber("MCMLIV")); | |
assertEquals("MCMXC", toRoman(1990)); | |
assertEquals(1990, toNumber("MCMXC")); | |
assertEquals(2014, toNumber("MMXIV")); | |
assertEquals("MMXIV", toRoman(2014)); | |
assertEquals(1967, toNumber("MCMLXVII")); | |
assertEquals("MCMLXVII", toRoman(1967)); | |
assertEquals("MMDCLXXI", toRoman(2671)); | |
} | |
private int toNumber(String input) { | |
if(input.isEmpty()) return 0; | |
final String inputString = input; | |
int length = inputString.length(); | |
int val; | |
while((val = fromRoman(inputString.substring(0, length))) == -1) { | |
length -= 1; | |
} | |
String tail = input.substring(length); | |
return val + toNumber(tail); | |
} | |
private String toRoman(int i) { | |
if(i <= 10) { | |
switch (i) { | |
case 1: | |
return "I"; | |
case 2: | |
return "II"; | |
case 3: | |
return "III"; | |
case 4: | |
return "IV"; | |
case 5: | |
return "V"; | |
case 6: | |
return "VI"; | |
case 7: | |
return "VII"; | |
case 8: | |
return "VIII"; | |
case 9: | |
return "IX"; | |
case 10: | |
return "X"; | |
} | |
} else if (i == 40) { | |
return "XL"; | |
} else if (i <= 50) { | |
if(i == 50 ) return "L"; | |
if(i > 40) return toRoman(40) + toRoman(i - 40); | |
return leftOrRight(i, "X", 10); | |
}else if (i == 90){ | |
return "XC"; | |
} else if (i <= 100) { | |
if (i == 100) return "C"; | |
if(i > 90) return toRoman(90) + toRoman(i - 90); | |
return toRoman(50) + toRoman(i - 50); | |
} else if (i == 400) { | |
return "CD"; | |
} else if (i <= 500) { | |
if (i == 500) return "D"; | |
if(i > 400) return toRoman(400) + toRoman(i - 400); | |
return leftOrRight(i, "C", 100); | |
} else if (i == 900) { | |
return "CM"; | |
} else if (i <= 1000) { | |
if(i == 1000) return "M"; | |
if(i > 900) return "CM" + toRoman(i - 900); | |
return toRoman(500) + toRoman(i - 500); | |
} | |
return leftOrRight(i, "M", 1000); | |
} | |
private String leftOrRight(int num, String rom, int eur) { | |
int b = num / eur; | |
String head = ""; | |
for(int j = 0; j < b; j++) { | |
head += rom; | |
} | |
int rest = b * eur; | |
return head + toRoman(num - rest); | |
} | |
private int fromRoman(String i) { | |
if(i.length() > 4) return -1; | |
switch (i) { | |
case "I": return 1; | |
case "II": return 2; | |
case "III": return 3; | |
case "IV": return 4; | |
case "V": return 5; | |
case "VI": return 6; | |
case "VII": return 7; | |
case "VIII": return 8; | |
case "IX": return 9; | |
case "X": return 10; | |
case "XX": return 20; | |
case "XXX": return 30; | |
case "XL": return 40; | |
case "L": return 50; | |
case "XC": return 90; | |
case "C": return 100; | |
case "CC": return 200; | |
case "CCC": return 300; | |
case "CD": return 400; | |
case "D": return 500; | |
case "CM": return 900; | |
case "M": return 1000; | |
default: | |
return -1; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment