Skip to content

Instantly share code, notes, and snippets.

@msanroman
Last active December 23, 2015 08:59
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save msanroman/6611920 to your computer and use it in GitHub Desktop.
Save msanroman/6611920 to your computer and use it in GitHub Desktop.
should = require 'should'
class ArabicToRoman
constructor: ->
@CONVERSIONS = [
{'roman': 'M', 'arabic': 1000},
{'roman': 'CM', 'arabic': 900},
{'roman': 'D', 'arabic': 500},
{'roman': 'CD', 'arabic': 400},
{'roman': 'C', 'arabic': 100},
{'roman': 'XC', 'arabic': 90},
{'roman': 'L', 'arabic': 50},
{'roman': 'XL', 'arabic': 40},
{'roman': 'X', 'arabic': 10},
{'roman': 'IX', 'arabic': 9},
{'roman': 'V', 'arabic': 5},
{'roman': 'IV', 'arabic': 4},
{'roman': 'I', 'arabic': 1}
]
retrieve_partial_conversion: (arabic) ->
return candidate for candidate in @CONVERSIONS when arabic >= candidate.arabic
can_represent_in_roman: (arabic) -> arabic >= 1
convert: (arabic, conversion = '') ->
return conversion unless @can_represent_in_roman arabic
partial_conversion = @retrieve_partial_conversion arabic
return @convert(arabic - partial_conversion.arabic, conversion + partial_conversion.roman)
describe 'ArabicToRoman', ->
before -> @converter = new ArabicToRoman
it 'converts 0 to empty string', -> @converter.convert(0).should.eql('')
it 'converts 1 to I', -> @converter.convert(1).should.eql('I')
it 'converts 2 to II', -> @converter.convert(2).should.eql('II')
it 'converts 4 to IV', -> @converter.convert(4).should.eql('IV')
it 'converts 5 to V', -> @converter.convert(5).should.eql('V')
it 'converts 6 to VI', -> @converter.convert(6).should.eql('VI')
it 'converts 9 to IX', -> @converter.convert(9).should.eql('IX')
it 'converts 10 to X', -> @converter.convert(10).should.eql('X')
it 'converts 40 to XL', -> @converter.convert(40).should.eql('XL')
it 'converts 50 to L', -> @converter.convert(50).should.eql('L')
it 'converts 90 to XC', -> @converter.convert(90).should.eql('XC')
it 'converts 100 to C', -> @converter.convert(100).should.eql('C')
it 'converts 400 to CD', -> @converter.convert(400).should.eql('CD')
it 'converts 500 to D', -> @converter.convert(500).should.eql('D')
it 'converts 900 to CM', -> @converter.convert(900).should.eql('CM')
it 'converts 1000 to M', -> @converter.convert(1000).should.eql('M')
it 'converts 3888 to MMMDCCCLXXXVIII', -> @converter.convert(3888).should.eql('MMMDCCCLXXXVIII')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment