Skip to content

Instantly share code, notes, and snippets.

@thilko
Last active August 29, 2015 14:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thilko/bed6bf1d3d0e30129136 to your computer and use it in GitHub Desktop.
Save thilko/bed6bf1d3d0e30129136 to your computer and use it in GitHub Desktop.
Roman numerals kata
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