Écrivez un algorithme pour interpréter une séquence de lettres comme un chiffre romain. (voir les règles des chiffres romains ci-dessous)
Chaque lettre distincte a une valeur décimale arabe correspondante, pas de maximum. Mais vous n'avez pas la clé à l'avance, c'est donc {A=10, I=1, X=5, ... Z=1000000}
votre interprétation qui en décide.
Défi
- Lire l'entrée via
STDIN
ou équivalent et écrire la sortie viaSTDOUT
ou équivalent - Les entrées valides sont des combinaisons de lettres majuscules et minuscules, c'est-à-dire une correspondance
\[a-zA-Z]+\
- L'entrée doit être validée pour voir si la séquence de lettres peut être interprétée comme un chiffre romain valide
- Si l'entrée réussit la validation, la sortie valide doit être l'interprétation décimale arabe la plus basse et la clé utilisée, c'est
Aa
-à- dire est interprétée comme4 {a=5, A=1}
non6 {A=5, a=1}
ou9 {a=10, a=1}
Règles du chiffre romain
Seules les lettres représentant des puissances de dix peuvent être répétées, au maximum trois fois successivement et quatre fois au total par exemple
II
III
XXXIX
Si une ou plusieurs lettres sont placées après une autre lettre de valeur supérieure, ajoutez ce montant
AAaa => 22 {A=10, a=1} (20 + 2 = 22) bbAAaa => 222 {b=100, A=10, a=1} (200 + 20 + 2 = 222)
Si une lettre est placée avant une autre lettre de valeur supérieure, soustrayez ce montant
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)
Plusieurs règles s'appliquent pour soustraire les montants des chiffres romains:
- Seuls les pouvoirs Soustraire de dix -à- dire
1, 10, 100...
non5, 50, 500...
- Aucune double soustraction
18
n'est donc écrite commeXVIII
nonIIXX (10 + 10 - 1 - 1)
- Ne soustrayez pas un nombre de celui qui est plus de dix fois supérieur.
Vous pouvez soustraire1
de5
ou10
, mais pas de50, 100, 500...
- Seuls les pouvoirs Soustraire de dix -à- dire
Exemple
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}
la source
Aa
a une valeur de 1 (A = 1, a = 2).Réponses:
Python 2,
415444440419416 octetsAprès tout, il n'y a pas beaucoup de chiffres romains. Ce script les crée tous et vérifie toutes les permutations de l'entrée, puis renvoie la plus petite correspondance.
la source
import itertools as i
et puisi.permutations
plus court?