-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinteger-to-roman.rb
More file actions
99 lines (71 loc) · 2.6 KB
/
Copy pathinteger-to-roman.rb
File metadata and controls
99 lines (71 loc) · 2.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# Seven different symbols represent Roman numerals with the following values:
# Symbol Value
# I 1
# V 5
# X 10
# L 50
# C 100
# D 500
# M 1000
# Roman numerals are formed by appending the conversions of decimal place values from highest to lowest. Converting a decimal place value into a Roman numeral has the following rules:
# If the value does not start with 4 or 9, select the symbol of the maximal value that can be subtracted from the input, append that symbol to the result, subtract its value, and convert the remainder to a Roman numeral.
# If the value starts with 4 or 9 use the subtractive form representing one symbol subtracted from the following symbol, for example, 4 is 1 (I) less than 5 (V): IV and 9 is 1 (I) less than 10 (X): IX. Only the following subtractive forms are used: 4 (IV), 9 (IX), 40 (XL), 90 (XC), 400 (CD) and 900 (CM).
# Only powers of 10 (I, X, C, M) can be appended consecutively at most 3 times to represent multiples of 10. You cannot append 5 (V), 50 (L), or 500 (D) multiple times. If you need to append a symbol 4 times use the subtractive form.
# Given an integer, convert it to a Roman numeral.
# Example 1:
# Input: num = 3749
# Output: "MMMDCCXLIX"
# Explanation:
# 3000 = MMM as 1000 (M) + 1000 (M) + 1000 (M)
# 700 = DCC as 500 (D) + 100 (C) + 100 (C)
# 40 = XL as 10 (X) less of 50 (L)
# 9 = IX as 1 (I) less of 10 (X)
# Note: 49 is not 1 (I) less of 50 (L) because the conversion is based on decimal places
# Example 2:
# Input: num = 58
# Output: "LVIII"
# Explanation:
# 50 = L
# 8 = VIII
# Example 3:
# Input: num = 1994
# Output: "MCMXCIV"
# Explanation:
# 1000 = M
# 900 = CM
# 90 = XC
# 4 = IV
# Constraints:
# 1 <= num <= 3999
# @param {Integer} num
# @return {String}
# @param {Integer} num
# @return {String}
def int_to_roman(num)
magnitudes = [1000, 100, 10, 1]
magnitude_symbols = ['M', 'C', 'X', 'I']
half_symbols = ['', 'D', 'L', 'V']
remainder = num
roman = ''
magnitudes.each_with_index do |magnitude, i|
current_value = remainder / magnitude
if current_value <= 3
current_value.times do
roman << magnitude_symbols[i]
end
elsif current_value == 4
roman << magnitude_symbols[i]
roman << half_symbols[i]
elsif current_value > 4 && current_value < 9
roman << half_symbols[i]
(current_value - 5).times do
roman << magnitude_symbols[i]
end
else
roman << magnitude_symbols[i]
roman << magnitude_symbols[i - 1]
end
remainder = remainder % magnitude
end
roman
end