Created
June 16, 2012 12:10
-
-
Save haru01/2941177 to your computer and use it in GitHub Desktop.
roman_add
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
class Calc | |
constructor: -> | |
@enters = [] | |
enter: (n)-> | |
@enters.push n | |
add: -> | |
added = this.roman_to_num(@enters[0]) + this.roman_to_num(@enters[1]) | |
if (added >= 4000) | |
"ERROR" | |
else | |
this.num_to_roman(added) | |
roman_to_num: (roman) -> | |
return 900 + this.roman_to_num(roman[2..]) if "CM" == roman[0..1] | |
return 400 + this.roman_to_num(roman[2..]) if "CD" == roman[0..1] | |
return 90 + this.roman_to_num(roman[2..]) if "XC" == roman[0..1] | |
return 40 + this.roman_to_num(roman[2..]) if "XL" == roman[0..1] | |
return 9 if "IX" == roman | |
return 4 if "IV" == roman | |
return 1000 + this.roman_to_num(roman[1..]) if "M" == roman[0] | |
return 500 + this.roman_to_num(roman[1..]) if "D" == roman[0] | |
return 100 + this.roman_to_num(roman[1..]) if "C" == roman[0] | |
return 50 + this.roman_to_num(roman[1..]) if "L" == roman[0] | |
return 10 + this.roman_to_num(roman[1..]) if "X" == roman[0] | |
return 5 + this.roman_to_num(roman[1..]) if "V" == roman[0] | |
return 1 + this.roman_to_num(roman[1..]) if "I" == roman[0] | |
0 | |
num_to_roman: (num) -> | |
return "CM" if 900 == num | |
return "CD" if 400 == num | |
return "XC" if 90 == num | |
return "XL" if 40 == num | |
return "IX" if 9 == num | |
return "IV" if 4 == num | |
return "M" if 1000 == num | |
return "D" if 500 == num | |
return "C" if 100 == num | |
return "L" if 50 == num | |
return "X" if 10 == num | |
return "V" if 5 == num | |
return "I" if 1 == num | |
for base in [1000, 900, 500, 400, 100, 90, 50, 40, 10, 5, 1] | |
return this.num_to_roman(base) + this.num_to_roman(num - base) if num - base > 0 | |
"" | |
describe "ローマ数字計算", -> | |
beforeEach -> | |
@calc = new Calc | |
it "1足す1が計算できること", -> | |
@calc.enter("I") | |
@calc.enter("I") | |
@calc.add().should.equal("II") | |
it "1足す2が計算できること", -> | |
@calc.enter("I") | |
@calc.enter("II") | |
@calc.add().should.equal("III") | |
it "1111足す2888が計算できること", -> | |
@calc.enter("MCXI") | |
@calc.enter("MMDCCCLXXXVIII") | |
@calc.add().should.equal("MMMCMXCIX") | |
it "4000以上の場合はエラー文字列を返すこと", -> | |
@calc.enter("MMMCMXCIX") | |
@calc.enter("I") | |
@calc.add().should.equal("ERROR") | |
describe "num_to_roman", -> | |
beforeEach -> | |
@calc = new Calc | |
it "1から9の変換", -> | |
@calc.num_to_roman(1).should.equal("I") | |
@calc.num_to_roman(2).should.equal("II") | |
@calc.num_to_roman(3).should.equal("III") | |
@calc.num_to_roman(4).should.equal("IV") | |
@calc.num_to_roman(5).should.equal("V") | |
@calc.num_to_roman(6).should.equal("VI") | |
@calc.num_to_roman(7).should.equal("VII") | |
@calc.num_to_roman(8).should.equal("VIII") | |
@calc.num_to_roman(9).should.equal("IX") | |
it "10から99の変換", -> | |
@calc.num_to_roman(10).should.equal("X") | |
@calc.num_to_roman(20).should.equal("XX") | |
@calc.num_to_roman(41).should.equal("XLI") | |
@calc.num_to_roman(44).should.equal("XLIV") | |
@calc.num_to_roman(54).should.equal("LIV") | |
@calc.num_to_roman(90).should.equal("XC") | |
@calc.num_to_roman(99).should.equal("XCIX") | |
it "100から999の変換", -> | |
@calc.num_to_roman(109).should.equal("CIX") | |
@calc.num_to_roman(444).should.equal("CDXLIV") | |
@calc.num_to_roman(501).should.equal("DI") | |
@calc.num_to_roman(800).should.equal("DCCC") | |
@calc.num_to_roman(999).should.equal("CMXCIX") | |
it "1000から3999の変換", -> | |
@calc.num_to_roman(1000).should.equal("M") | |
@calc.num_to_roman(2001).should.equal("MMI") | |
@calc.num_to_roman(3999).should.equal("MMMCMXCIX") | |
describe "roman_to_num", -> | |
beforeEach -> | |
@calc = new Calc | |
it "IからIXの変換", -> | |
@calc.roman_to_num("I").should.equal(1) | |
@calc.roman_to_num("II").should.equal(2) | |
@calc.roman_to_num("III").should.equal(3) | |
@calc.roman_to_num("IV").should.equal(4) | |
@calc.roman_to_num("V").should.equal(5) | |
@calc.roman_to_num("VI").should.equal(6) | |
@calc.roman_to_num("VII").should.equal(7) | |
@calc.roman_to_num("VIII").should.equal(8) | |
@calc.roman_to_num("IX").should.equal(9) | |
it "XからXCIXの変換", -> | |
@calc.roman_to_num("X").should.equal(10) | |
@calc.roman_to_num("XI").should.equal(11) | |
@calc.roman_to_num("XIV").should.equal(14) | |
@calc.roman_to_num("XV").should.equal(15) | |
@calc.roman_to_num("XX").should.equal(20) | |
@calc.roman_to_num("XXX").should.equal(30) | |
@calc.roman_to_num("XL").should.equal(40) | |
@calc.roman_to_num("XLIV").should.equal(44) | |
@calc.roman_to_num("XLIX").should.equal(49) | |
@calc.roman_to_num("L").should.equal(50) | |
@calc.roman_to_num("LXIV").should.equal(64) | |
@calc.roman_to_num("XC").should.equal(90) | |
@calc.roman_to_num("XCI").should.equal(91) | |
@calc.roman_to_num("XCIV").should.equal(94) | |
@calc.roman_to_num("XCIX").should.equal(99) | |
it "CからCMXCIXの変換", -> | |
@calc.roman_to_num("C").should.equal(100) | |
@calc.roman_to_num("CC").should.equal(200) | |
@calc.roman_to_num("CD").should.equal(400) | |
@calc.roman_to_num("CDXLIV").should.equal(444) | |
@calc.roman_to_num("D").should.equal(500) | |
@calc.roman_to_num("DC").should.equal(600) | |
@calc.roman_to_num("CM").should.equal(900) | |
@calc.roman_to_num("CMXCIX").should.equal(999) | |
it "MからMMMCMXCIXの変換", -> | |
@calc.roman_to_num("M").should.equal(1000) | |
@calc.roman_to_num("MM").should.equal(2000) | |
@calc.roman_to_num("MMMCMXCIX").should.equal(3999) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment