一連の文字をローマ数字として解釈するアルゴリズムを作成します。(以下のローマ数字の規則を参照)
それぞれ異なる文字には、一致するアラビア語の10進数値があり、最大値はありません。しかし、あなたは事前にキーを持っていないので{A=10, I=1, X=5, ... Z=1000000}
、あなたの解釈によって決定されます。
チャレンジ
- 介して読み出し入力
STDIN
出力経由または同等の書き込みSTDOUT
または同等 - 有効な入力は、大文字と小文字の組み合わせ、つまり一致です
\[a-zA-Z]+\
- 入力を検証して、文字シーケンスが有効なローマ数字として解釈できるかどうかを確認する必要があります
- 入力が検証に合格した場合、有効な出力はアラビア語の10進数の最低解釈であり、使用されるキー
Aa
はそうでは4 {a=5, A=1}
ない と解釈される6 {A=5, a=1}
か、または9 {a=10, a=1}
ローマ数字の規則
10のべき乗を表す文字のみを繰り返すことができます。連続して最大3回、合計で4回などです。
II
III
XXXIX
値が大きい別の文字の後に1つ以上の文字が配置されている場合は、その量を追加します
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)
ローマ数字から金額を引くには、いくつかの規則が適用されます。
- すなわち10の減算力だけ
1, 10, 100...
ではありません5, 50, 500...
- したがって、二重減算
18
はないように書かれてXVIII
いますIIXX (10 + 10 - 1 - 1)
- 10倍を超える数値を1から減算しないでください。
あなたは引くことができます1
から、5
または10
が、ないから50, 100, 500...
- すなわち10の減算力だけ
例
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これは素晴らしい質問になりましたが、途中でコメントに多くの質問を集めました。評判が十分になったので、サンドボックスをお勧めします。投稿する直前に質問をするのにとても便利だと思います。
—
trichoplax
CCCLXVIIはCCCXLVIIと解釈され、347になりませんか?
—
スカイラー
@Skyler絶対に正しいです、今すぐ更新します!ありがとう。
—
iamogbz
個々の文字が持つことができる値に制限はありません(実際、20は標準のローマ数字の値ではありません)。あなたはそれを言うことを意味するか任意の正の整数をローマ数字で表すことができますか?その場合、
—
msh210
Aa
値は1(A = 1、a = 2)です。
文字はローマ数字としてのみ解釈できるため、@ msh210は個々の文字値は10のべき乗または10の5のべき乗の倍数にしかなれないということになります。 19は有効な減算ではありません)。それがあなたのためにそれを解決することを願っています。
—
iamogbz