// this is a txt file because Splash won't let me upload a .java // file so rename it -- jaz import java.util.*; import java.text.*; class Pair { public final String fst; public final String snd; public Pair( String first, String second ) { fst = first; snd = second; } } class Lst extends LinkedList { public Lst pr( String first, String second ) { add( new Pair(first, second) ); return this; } } public class RomanNum extends Number { private static LinkedList alterations = (new Lst()). pr("IIIII","V"). pr("IIII","IV"). pr("VV","X"). pr("VIV","IX"). pr("XXXXX","L"). pr("XXXX","XL"). pr("LL","C"). pr("LXL","XC"). pr("CCCCC","D"). pr("CCCC","CD"). pr("DD","M"). pr("DCD","CM") ; public RomanNum() { super(); } public static String toRoman( Number n) { String s = n.toString(); Iterator guide = alterations.iterator(); while( guide.hasNext() ) { Pair pr = guide.next(); s = s.replace( pr.fst, pr.snd ); } return s; } public static Number fromRoman(String s) { // convert to "III..." Iterator guide = alterations.descendingIterator(); while( guide.hasNext() ) { Pair pr = guide.next(); s = s.replace( pr.snd, pr.fst ); } // convert to stone list StringCharacterIterator ichar = new StringCharacterIterator(s); Number n = new Number(); for( char c= ichar.first(); c!=StringCharacterIterator.DONE; c = ichar.next() ) { n.addOne(); } return n; } /// test methods /// protected static void p(String s) { System.out.println(s); } public static void main( String [] ignore) { Number x = fromRoman( "MCMXLIII" ); Number y = fromRoman( "LXXI" ); if( toDecimal(x)!=1943 ) { p("decimal conversion to 1943 failed"); return; } else if( !"MCMXLIII".equals(toRoman(x)) ) { p("roman conversion to MCMXLIII failed"); return; } else if( 71!=toDecimal(y) || !"LXXI".equals(toRoman(y)) ) { p("LXXI, 71 conversions failed"); return; } else { x.add(y); if( toDecimal(x)!=2014 || !toRoman(x).equals("MMXIV") ) { p("addition failed"); return; } else if ( !toRoman(x.sub(y)).equals("MCMXLIII") ) { p("subtraction failed"); return; } } p("test passsed!"); } }