Skip to content

Instantly share code, notes, and snippets.

@dschinkel
Last active May 16, 2019 04:45
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 dschinkel/08cf5a3ac5e0ec6a74f8ae9052f4f172 to your computer and use it in GitHub Desktop.
Save dschinkel/08cf5a3ac5e0ec6a74f8ae9052f4f172 to your computer and use it in GitHub Desktop.
Roman Numeral Calculator Kata
import com.sun.xml.internal.xsom.impl.scd.Iterators;
import java.util.ArrayList;
import java.util.HashMap;
public class RomanNumeralCalculator {
ArrayList<String> numeralOrder = new ArrayList<String>() {{
add("I");
add("V");
add("X");
add("L");
add("C");
add("D");
add("M");
}};
HashMap<String, String> calculator = new HashMap<String, String>(){{
put("IIIII", "V");
put("VV", "X");
put("XXXXX", "L");
put("LL", "C");
put("CCCCC", "D");
put("DD", "M");
}};
public String add(String numeral1, String numeral2) {
String combinedString = combineString(numeral1, numeral2);
String simplifiedString = replaceRepeats(combinedString);
return simplifiedString;
}
private String combineString(String numeral1, String numeral2) {
String combinedString = numeral1 + numeral2;
if (shouldSwap(numeral1, numeral2)) {
combinedString = numeral2 + numeral1;
}
return combinedString;
}
private boolean shouldSwap(String numeral1, String numeral2) {
int maxIndexOfNumeralOne = getMaxIndexOfRomanNumeral(numeral1);
int maxIndexOfNumeralTwo = getMaxIndexOfRomanNumeral(numeral2);
// int minIndexOfNumeralTwo = getMinIndexOfRomanNumeral(numeral2);
// if (minIndexOfNumeralTwo >= maxIndexOfNumeralOne) {
// return true;
// }
return maxIndexOfNumeralOne < maxIndexOfNumeralTwo;
}
private int getMaxIndexOfRomanNumeral(String romanNumeral) {
int maxIndexOfRomanNumeral = -1;
for (int i = 0; i < romanNumeral.length(); i++) {
if (numeralOrder.indexOf(romanNumeral.substring(i, i + 1)) > maxIndexOfRomanNumeral) {
maxIndexOfRomanNumeral = numeralOrder.indexOf(romanNumeral.substring(i, i + 1));
}
}
return maxIndexOfRomanNumeral;
}
private int getMinIndexOfRomanNumeral(String romanNumeral) {
int minIndexOfRomanNumeral = 100;
for (int i = 0; i < romanNumeral.length(); i++) {
if (numeralOrder.indexOf(romanNumeral.substring(i, i + 1)) < minIndexOfRomanNumeral) {
minIndexOfRomanNumeral = numeralOrder.indexOf(romanNumeral.substring(i, i + 1));
}
}
return minIndexOfRomanNumeral;
}
private String replaceRepeats(String combinedString) {
for (HashMap.Entry<String, String> entry : calculator.entrySet()) {
combinedString = combinedString.replaceAll(entry.getKey(), entry.getValue());
}
return combinedString;
}
}
import static org.junit.Assert.assertEquals;
import org.junit.Ignore;
import org.junit.Test;
public class RomanNumeralCalculatorTest {
RomanNumeralCalculator calculator = new RomanNumeralCalculator();
@Test
public void onePlusOneIsTwo() {
String actualResult = calculator.add("I", "I");
String expectedResult = "II";
assertEquals(expectedResult, actualResult);
}
@Test
public void onePlusTwoIsThree() {
String actualResult = calculator.add("I", "II");
String expectedResult = "III";
assertEquals(expectedResult, actualResult);
}
@Test
public void twoPlusThreeEqualsFive() {
String actualResult = calculator.add("III", "II");
String expectedResult = "V";
assertEquals(expectedResult, actualResult);
}
@Test
public void onePlusFiveEqualsSix() {
String actualResult = calculator.add("I", "V");
String expectedResult = "VI";
assertEquals(expectedResult, actualResult);
}
@Test
public void onePlusSixEqualsSeven() {
String actualResult = calculator.add("I", "VI");
String expectedResult = "VII";
assertEquals(expectedResult, actualResult);
}
@Test
public void fivePlusFiveEqualsTen() {
String actualResult = calculator.add("V", "V");
String expectedResult = "X";
assertEquals(expectedResult, actualResult);
}
@Test
public void twentyPlusThirtyEqualsFifty() {
String actualResult = calculator.add("XX", "XXX");
String expectedResult = "L";
assertEquals(expectedResult, actualResult);
}
@Test
public void fiftyPlusFiftyEqualsOneHundred() {
String actualResult = calculator.add("L", "L");
String expectedResult = "C";
assertEquals(expectedResult, actualResult);
}
@Test
public void tenPlusFiftyEqualsSixty() {
String actualResult = calculator.add("X", "L");
String expectedResult = "LX";
assertEquals(expectedResult, actualResult);
}
@Test
public void oneHundredPlusFiveHundreddEqualsSixHundred() {
String actualResult = calculator.add("C", "D");
String expectedResult = "DC";
assertEquals(expectedResult, actualResult);
}
@Test
public void oneHundredPlusOneThousandEqualsElevenHundred() {
String actualResult = calculator.add("C", "M");
String expectedResult = "MC";
assertEquals(expectedResult, actualResult);
}
@Test
public void twoHundredPlusThreeHundredEqualsFiveHundred() {
String actualResult = calculator.add("CC", "CCC");
String expectedResult = "D";
assertEquals(expectedResult, actualResult);
}
@Test
public void fiveHundredPlusFiveHundredEqualsOneThousand() {
String actualResult = calculator.add("D", "D");
String expectedResult = "M";
assertEquals(expectedResult, actualResult);
}
@Test
public void fourPlusFiveEqualsNine() {
String actualResult = calculator.add("IV", "V");
String expectedResult = "IX";
assertEquals(expectedResult, actualResult);
}
@Test
public void fortyPlusFiftyEqualsNinety() {
String actualResult = calculator.add("XL", "L");
String expectedResult = "XC";
assertEquals(expectedResult, actualResult);
}
@Test
public void twoPlusFortyEqualsFortyTwo() {
String actualResult = calculator.add("II", "XL");
String expectedResult = "XLII";
assertEquals(expectedResult, actualResult);
}
@Test
public void twentyPlusFourHundredEqualsForHundredTwenty() {
String actualResult = calculator.add("XX", "CD");
String expectedResult = "CDXX";
assertEquals(expectedResult, actualResult);
}
@Test
public void eighteenPlusTwentyEqualsThirtyEight() {
String actualResult = calculator.add("XVIII", "XX");
String expectedResult = "XXXVIII";
assertEquals(expectedResult, actualResult);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment