Skip to content

Instantly share code, notes, and snippets.

@haru01
Created June 16, 2012 12:10
Show Gist options
  • Save haru01/2941177 to your computer and use it in GitHub Desktop.
Save haru01/2941177 to your computer and use it in GitHub Desktop.
roman_add
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