Skip to content

Instantly share code, notes, and snippets.

@vglebov
Last active January 30, 2017 04:30
Show Gist options
  • Save vglebov/c6e86659f7f9bf57dad5fe8e01c39146 to your computer and use it in GitHub Desktop.
Save vglebov/c6e86659f7f9bf57dad5fe8e01c39146 to your computer and use it in GitHub Desktop.
class NumberConverter
def to_roman(number)
numbers = {
1000 => {roman: 'M', prev: 100},
500 => {roman: 'D', prev: 100},
100 => {roman: 'C', prev: 10},
50 => {roman: 'L', prev: 10},
10 => {roman: 'X', prev: 1},
5 => {roman: 'V', prev: 1},
1 => {roman: 'I', prev: 0},
}
numbers.each do |normal, n|
return n[:roman] if number == normal
return n[:roman] + to_roman(number - normal) if number > normal
return numbers[n[:prev]][:roman] + to_roman(number + n[:prev]) if number.between?(normal - n[:prev] , normal - 1)
end
end
end
describe NumberConverter do
before do
@converter = NumberConverter.new
end
{
1 => 'I',
2 => 'II',
3 => 'III',
4 => 'IV',
5 => 'V',
6 => 'VI',
7 => 'VII',
8 => 'VIII',
9 => 'IX',
10 => 'X',
11 => 'XI',
12 => 'XII',
19 => 'XIX',
20 => 'XX',
30 => 'XXX',
40 => 'XL',
45 => 'XLV',
46 => 'XLVI',
49 => 'XLIX',
50 => 'L',
51 => 'LI',
94 => 'XCIV',
99 => 'XCIX',
100 => 'C',
101 => 'CI',
146 => 'CXLVI',
149 => 'CXLIX',
249 => 'CCXLIX',
500 => 'D',
480 => 'CDLXXX',
494 => 'CDXCIV',
495 => 'CDXCV',
499 => 'CDXCIX',
999 => 'CMXCIX',
1000 => 'M',
2751 => 'MMDCCLI',
5999 => 'MMMMMCMXCIX'
}.each do |normal_number, roman_number|
it "арабская #{normal_number} = римская #{roman_number}" do
expect(@converter.to_roman normal_number).to eql roman_number
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment