目标:
编写一个将数字作为输入并返回该数字的简写罗马数字作为输出的函数。
罗马数字符号:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
举一个我说“简写罗马数字”的意思的例子,让我们考虑找到一个代表1983年的罗马数字,因为那是我出生的年份。一种选择是按常规方式(10个字母)执行此操作:
1983年 = MCMLXXXIII =(1000-100 + 1000 + 50 + 30 + 3)
另一种选择是使用快捷方式(6个字符):
1983 = MXVIIM =(1000-(10 + 10)+ 1000 + 3)
你知道这意味着什么吗?!?!! ?? 如果我是罗马人,我每次写生日都可以保存4个字符!呜呜呜!
但是,在兴奋起来之前,我有一个问题要写,所以我可能应该定义速记罗马数字规则,以便我们都在同一页面上:
简写罗马数字规则:
- 始终从左到右考虑符号,直到没有其他要考虑的字符为止。
- 如果当前符号右侧没有高值符号:
- 将当前符号的值添加到该罗马数字的运行总计中。
- 如果该符号右边有较高值的符号,那么您正在考虑:
- 在当前符号的右边找到最右边的最高值符号
- 将直到该符号的所有字符视为一个罗马数字
- 使用以下步骤计算该罗马数字的值
- 从该罗马数字的总和中减去该罗马数字的值。
- 移至您刚刚考虑的组之后的下一个符号
- 每个罗马数字必须至少包含1个符号。
- 而已!遵循这些规则的任何内容都将被接受!
例子:
IIIIV = (-(1+1+1+1)+5) = 1 //Don't ask me why you'd want to do this!
VVX = (-(5+5) + 10) = 0 //Who said you couldn't represent 0 with roman numerals?!!?
VVXM = (-(-(5+5) + 10) + 1000) = 1000 //Again...don't ask me why you'd want to do this!
MXIIXMI = (1000-(10-(1+1)+10)+1000+1) = 1983 //Ahhh...such a great year :)
问题规则:
使用上面的规则,使一个函数以单个数字作为输入,并返回该数字的罗马数字作为输出。计算此函数的codeGolfScore。
example input: 2011 example possible output: MMXI another possible output: MMVVIVV //(2000 + 10 - 4 + 5)
使用规则1中的函数,生成-1000(正确的,负一千)和3000之间的罗马数字。然后将这些罗马数字的字符长度相加即可得出totalCharacterCount。这是一些伪代码来说明:
totalCharacterCount = 0; for(currentNumber = -1000; currentNumber <= 3000; currentNumber++){ totalCharacterCount += getRomanNumeral(currentNumber).length; } return totalCharacterCount;
finalScore = codeGolfScore + totalCharacterCount
- 最低的finalScore获胜!
注意:由于totalCharacter计数将在万以上,因此字符长度算法应具有最高优先级。如果多个用户找到了彼此接近的最佳算法,则代码高尔夫球分数只是平局。
祝您好运,明天晚上在您的MMXII庆祝活动中玩得开心!!!
""
允许为零,还是必须使用VVX
或等效的东西?
IXV = -(-1 + 10) + 5 = -4
(最右边的胜利)或IXV = -1 + 10 + 5 = 14
(最有价值的胜利)?
DDDDM
代表-1000
?