Last active
May 16, 2019 04:45
-
-
Save dschinkel/08cf5a3ac5e0ec6a74f8ae9052f4f172 to your computer and use it in GitHub Desktop.
Roman Numeral Calculator Kata
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
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; | |
} | |
} |
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
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