编写一种算法,将字母序列解释为罗马数字。(请参阅下面的罗马数字规则)
每个不同的字母都有一个匹配的阿拉伯十进制值,没有最大值。但是您事先没有密钥,因此{A=10, I=1, X=5, ... Z=1000000}
取决于您的解释。
挑战
- 通过读取输入
STDIN
或等效和写入输出经由STDOUT
或等效 - 有效输入是大小写字母的组合,即匹配
\[a-zA-Z]+\
- 输入应经过验证,以查看字母序列是否可以解释为有效的罗马数字
- 如果输入通过验证,则有效输出应该是最低的阿拉伯十进制解释,并且所使用的键即
Aa
解释为4 {a=5, A=1}
not6 {A=5, a=1}
或9 {a=10, a=1}
罗马数字规则
只能重复表示十次幂的字母,最多重复三次,总共重复四次,例如
II
III
XXXIX
如果将一个或多个字母放置在另一个价值更高的字母之后,请添加该金额
AAaa => 22 {A=10, a=1} (20 + 2 = 22) bbAAaa => 222 {b=100, A=10, a=1} (200 + 20 + 2 = 222)
如果将一个字母放在另一个较大值的字母之前,请减去该数量
Aa => 4 {a=5, A=1} (5 – 1 = 4) AaA => 19 {A=10, a=1} (10 + 10 – 1 = 19) BbBaA => 194 {B=100, b=10, A=5, a=1} (100 + 100 - 10 + 5 - 1 = 194)
有几个规则适用于从罗马数字中减去金额:
- 仅减去十的幂,即
1, 10, 100...
不5, 50, 500...
- 因此,没有双重减法
18
被写成XVIII
不是IIXX (10 + 10 - 1 - 1)
- 不要从大于十倍的数字中减去一个数字。
您可以减去1
从5
或10
,但不从50, 100, 500...
- 仅减去十的幂,即
例
Input:
Aa
BAa
CCCXLVII
MMMCDVII
ABADDF
XVVX
FAASGSH
DXCCDA
AaBbcDEf
Output:
4 {a=5, A=1}
14 {B=10, a=5, A=1}
347 {C=100, L=50, X=10, V=5, I=1}
347 {M=100, D=50, C=10, V=5, I=1}
1921 {A=1000, B=100, D=10, F=1}
'XVVX' failed Roman numeral test
7191 {F=5000, A=1000, S=100, G=10, H=1}
'DXCCDA' failed Roman numeral test
4444 {a=5000, A=1000, b=500, B=100, D=50, c=10, f=5, E=1}
3
@IamOgbz,这已经变成了一个很好的问题,但是一路上在评论中吸引了很多问题。现在您已经有足够的声誉,我建议您使用sandbox。我发现这对于在发布之前就提出问题非常有用。
—
trichoplax
CCCLXVII不会解释为CCCXLVII,给出347吗?
—
斯凯勒
@Skyler,您绝对正确,将立即更新!谢谢。
—
iamogbz 2015年
对于单个字母可以具有的值,我没有看到任何限制(实际上您提到的是20,这不是标准罗马数字的值)。您的意思是说任何正整数都可以用罗马数字表示吗?在这种情况下,
—
msh210
Aa
其值为1(A = 1,a = 2)。
@ msh210,因为字母只能解释为罗马数字,因此,单个字母值只能是10的幂或5的10的幂。 19不是有效的减法)。希望能为您清除它。
—
iamogbz 2015年