Scrivi un algoritmo per interpretare una sequenza di lettere come un numero romano. (vedi le regole numerali romane di seguito)
Ogni lettera distinta ha un valore decimale arabo corrispondente, nessun massimo. Ma non hai la chiave in anticipo, quindi {A=10, I=1, X=5, ... Z=1000000}
è deciso dalla tua interpretazione.
Sfida
- Leggi input via
STDIN
o equivalente e scrivi output viaSTDOUT
o equivalente - Gli input validi sono combinazioni di lettere maiuscole e minuscole, ovvero la corrispondenza
\[a-zA-Z]+\
- L'immissione deve essere convalidata per vedere se la sequenza di lettere può essere interpretata come un numero romano valido
- Se l'input supera la convalida, l'output valido deve essere l'interpretazione decimale araba più bassa e la chiave utilizzata, ovvero
Aa
viene interpretata come4 {a=5, A=1}
no6 {A=5, a=1}
o9 {a=10, a=1}
Regole numerali romane
Solo le lettere che rappresentano poteri di dieci possono essere ripetute, un massimo di tre volte consecutive e quattro volte in totale, ad es
II
III
XXXIX
Se una o più lettere vengono inserite dopo un'altra lettera di valore maggiore, aggiungi tale importo
AAaa => 22 {A=10, a=1} (20 + 2 = 22) bbAAaa => 222 {b=100, A=10, a=1} (200 + 20 + 2 = 222)
Se una lettera viene posta prima di un'altra lettera di valore maggiore, sottrarre tale importo
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)
Diverse regole si applicano per sottrarre importi da numeri romani:
- Sottrarre solo poteri di dieci cioè
1, 10, 100...
no5, 50, 500...
- Nessun doppia sottrazione quindi
18
è scritto comeXVIII
nonIIXX (10 + 10 - 1 - 1)
- Non sottrarre un numero da uno che è più di dieci volte maggiore.
È possibile sottrarre1
da5
o10
, ma non è da50, 100, 500...
- Sottrarre solo poteri di dieci cioè
Esempio
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}
Aa
ha un valore di 1 (A = 1, a = 2).