Last active
August 29, 2015 14:16
-
-
Save thilko/bed6bf1d3d0e30129136 to your computer and use it in GitHub Desktop.
Roman numerals kata
This file contains hidden or 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
import org.junit.Test; | |
import java.util.Collections; | |
import java.util.TreeMap; | |
import static org.hamcrest.CoreMatchers.is; | |
import static org.junit.Assert.assertThat; | |
public class FizzBuzzTest { | |
// doc: | |
// https://github.com/pedrovgs/RomanNumerals-Kata | |
// http://blog.8thlight.com/uncle-bob/2013/05/27/TheTransformationPriorityPremise.html | |
// TDD cycle | |
// 1. write a red test | |
// 2. make it green (as simple as possible) | |
// 3. refactor | |
// 4. start with 1. again | |
// examples | |
// I 1 | |
// IV 4 | |
// V 5 | |
// VI 6 | |
// IX 9 | |
// X 10 | |
// XI 11 | |
// L 50 | |
// C 100 | |
// D 500 | |
// CM 900 | |
// M 1000 | |
// MC 1100 | |
// XXXII 32 | |
@Test | |
public void romanNumeral_for1_IisReturned() { | |
String romanNumber = arabicToRoman(1); | |
assertThat(romanNumber, is("I")); | |
} | |
@Test | |
public void romanNumeral_for2_isReturned() { | |
String romanNumber = arabicToRoman(2); | |
assertThat(romanNumber, is("II")); | |
} | |
@Test | |
public void romanNumeral_for3_isReturned() { | |
String romanNumber = arabicToRoman(3); | |
assertThat(romanNumber, is("III")); | |
} | |
@Test | |
public void romanNumeral_for4_IVisReturned() { | |
String romanNumber = arabicToRoman(4); | |
assertThat(romanNumber, is("IV")); | |
} | |
@Test | |
public void romanNumeral_for5_VisReturned() { | |
String romanNumber = arabicToRoman(5); | |
assertThat(romanNumber, is("V")); | |
} | |
@Test | |
public void romanNumeral_for6_VIisReturned() { | |
String romanNumber = arabicToRoman(6); | |
assertThat(romanNumber, is("VI")); | |
} | |
@Test | |
public void romanNumeral_for7_VIIisReturned() { | |
String romanNumber = arabicToRoman(7); | |
assertThat(romanNumber, is("VII")); | |
} | |
@Test | |
public void romanNumeral_for8_VIIIisReturned() { | |
String romanNumber = arabicToRoman(8); | |
assertThat(romanNumber, is("VIII")); | |
} | |
@Test | |
public void romanNumeral_for9_IXisReturned() { | |
String romanNumber = arabicToRoman(9); | |
assertThat(romanNumber, is("IX")); | |
} | |
@Test | |
public void romanNumeral_for10_XisReturned() { | |
String romanNumber = arabicToRoman(10); | |
assertThat(romanNumber, is("X")); | |
} | |
@Test | |
public void romanNumeral_for11_XIisReturned() { | |
String romanNumber = arabicToRoman(11); | |
assertThat(romanNumber, is("XI")); | |
} | |
@Test | |
public void romanNumeral_for12_XIIisReturned() { | |
String romanNumber = arabicToRoman(12); | |
assertThat(romanNumber, is("XII")); | |
} | |
@Test | |
public void romanNumeral_for14_XIVisReturned() { | |
String romanNumber = arabicToRoman(14); | |
assertThat(romanNumber, is("XIV")); | |
} | |
@Test | |
public void romanNumeral_for20_XXisReturned() { | |
String romanNumber = arabicToRoman(20); | |
assertThat(romanNumber, is("XX")); | |
} | |
@Test | |
public void romanNumeral_for30_XXXisReturned() { | |
String romanNumber = arabicToRoman(30); | |
assertThat(romanNumber, is("XXX")); | |
} | |
@Test | |
public void romanNumeral_for40_XLisReturned() { | |
String romanNumber = arabicToRoman(40); | |
assertThat(romanNumber, is("XL")); | |
} | |
@Test | |
public void romanNumeral_for49_XLIXisReturned() { | |
String romanNumber = arabicToRoman(49); | |
assertThat(romanNumber, is("XLIX")); | |
} | |
@Test | |
public void romanNumeral_for50_LisReturned() { | |
String romanNumber = arabicToRoman(50); | |
assertThat(romanNumber, is("L")); | |
} | |
@Test | |
public void romanNumeral_for88_LXXXVIIIisReturned() { | |
String romanNumber = arabicToRoman(88); | |
assertThat(romanNumber, is("LXXXVIII")); | |
} | |
@Test | |
public void romanNumeral_for99_XCIXisReturned() { | |
String romanNumber = arabicToRoman(99); | |
assertThat(romanNumber, is("XCIX")); | |
} | |
@Test | |
public void romanNumeral_for100_CisReturned() { | |
String romanNumber = arabicToRoman(100); | |
assertThat(romanNumber, is("C")); | |
} | |
@Test | |
public void romanNumeral_for499_CDXCIXisReturned() { | |
String romanNumber = arabicToRoman(499); | |
assertThat(romanNumber, is("CDXCIX")); | |
} | |
@Test | |
public void romanNumeral_for500_DisReturned() { | |
String romanNumber = arabicToRoman(500); | |
assertThat(romanNumber, is("D")); | |
} | |
@Test | |
public void romanNumeral_for999_CMXCIXisReturned() { | |
String romanNumber = arabicToRoman(999); | |
assertThat(romanNumber, is("CMXCIX")); | |
} | |
@Test | |
public void romanNumeral_for1000_MisReturned() { | |
String romanNumber = arabicToRoman(1000); | |
assertThat(romanNumber, is("M")); | |
} | |
@Test | |
public void romanNumeral_for3479_MMMCDLXXIXisReturned() { | |
String romanNumber = arabicToRoman(3479); | |
assertThat(romanNumber, is("MMMCDLXXIX")); | |
} | |
public String arabicToRoman(Integer arabicNumber) { | |
return arabicToRomanRecursive(arabicNumber); | |
} | |
private String arabicToRomanRecursive(Integer arabicNumber) { | |
TreeMap<Integer, String> specialNumbers = specialNumbers(); | |
String romanNumeral = ""; | |
int index = 0; | |
while (index < specialNumbers.size()) { | |
Integer specialNumber = (Integer) specialNumbers.keySet().toArray()[index]; | |
if (arabicNumber >= specialNumber) { | |
romanNumeral += arabicToRomanRecursive(arabicNumber - specialNumber); | |
arabicNumber -= specialNumber; | |
index = 0; | |
} else { | |
index++; | |
} | |
} | |
for (int i = 0; i < arabicNumber; i++) { | |
romanNumeral += "I"; | |
} | |
return romanNumeral; | |
} | |
private TreeMap<Integer, String> specialNumbers() { | |
TreeMap<Integer, String> specialNumbers = new TreeMap<Integer, String>(Collections.reverseOrder()); | |
specialNumbers.put(4, "IV"); | |
specialNumbers.put(5, "V"); | |
specialNumbers.put(9, "IX"); | |
specialNumbers.put(10, "X"); | |
specialNumbers.put(40, "XL"); | |
specialNumbers.put(50, "L"); | |
specialNumbers.put(90, "XC"); | |
specialNumbers.put(100, "C"); | |
specialNumbers.put(400, "CD"); | |
specialNumbers.put(500, "D"); | |
specialNumbers.put(900, "CM"); | |
specialNumbers.put(1000, "M"); | |
return specialNumbers; | |
} | |
/* | |
public String arabicToRoman(Integer arabicNumber) { | |
TreeMap<Integer, String> specialNumbers = specialNumbers(); | |
String romanNumeral = ""; | |
int index = 0; | |
while (index < specialNumbers.size()) { | |
Integer specialNumber = (Integer) specialNumbers.keySet().toArray()[index]; | |
if (arabicNumber >= specialNumber) { | |
romanNumeral += specialNumbers.get(specialNumber); | |
arabicNumber -= specialNumber; | |
index = 0; | |
} else { | |
index++; | |
} | |
} | |
for (int i = 0; i < arabicNumber; i++) { | |
romanNumeral += "I"; | |
} | |
return romanNumeral; | |
} | |
*/ | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment