Schreiben Sie einen Algorithmus, um eine Folge von Buchstaben als römische Zahl zu interpretieren. (siehe Regeln für römische Ziffern weiter unten)
Jeder einzelne Buchstabe hat einen passenden arabischen Dezimalwert, kein Maximum. Aber Sie haben den Schlüssel nicht im Voraus, also {A=10, I=1, X=5, ... Z=1000000}
entscheidet Ihre Interpretation.
Herausforderung
- Eingabe über
STDIN
oder gleichwertig lesen und Ausgabe überSTDOUT
oder gleichwertig schreiben - Gültige Eingaben sind Kombinationen aus Groß- und Kleinbuchstaben, dh Übereinstimmungen
\[a-zA-Z]+\
- Die Eingabe sollte überprüft werden, um festzustellen, ob die Buchstabenfolge als gültige römische Zahl interpretiert werden kann
- Wenn die Eingabe die Validierung besteht, sollte die gültige Ausgabe die niedrigste arabische Dezimalinterpretation sein und der verwendete Schlüssel wird
Aa
als4 {a=5, A=1}
nicht oder interpretiert6 {A=5, a=1}
9 {a=10, a=1}
Regeln für römische Ziffern
Es können nur Buchstaben mit Zehnerpotenzen wiederholt werden, maximal dreimal hintereinander und insgesamt viermal, z
II
III
XXXIX
Wenn ein oder mehrere Buchstaben nach einem anderen Buchstaben von größerem Wert platziert werden, addieren Sie diesen Betrag
AAaa => 22 {A=10, a=1} (20 + 2 = 22) bbAAaa => 222 {b=100, A=10, a=1} (200 + 20 + 2 = 222)
Wenn ein Buchstabe vor einem anderen Buchstaben von größerem Wert steht, subtrahieren Sie diesen Betrag
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)
Für das Abziehen von Beträgen von römischen Ziffern gelten mehrere Regeln:
- Subtrahieren Sie nur Zehnerpotenzen, dh
1, 10, 100...
nicht5, 50, 500...
- Daher
18
wird keine doppelte Subtraktion alsXVIII
nicht geschriebenIIXX (10 + 10 - 1 - 1)
- Subtrahieren Sie keine Zahl von einer, die mehr als zehnmal größer ist.
Sie können subtrahieren1
aus5
oder10
aber nicht aus50, 100, 500...
- Subtrahieren Sie nur Zehnerpotenzen, dh
Beispiel
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}
quelle
Aa
hat einen Wert von 1 (A = 1, a = 2).Antworten:
Python 2,
415444440419416 BytesImmerhin gibt es nicht allzu viele römische Ziffern. Dieses Skript erstellt alle und überprüft alle Permutationen der Eingabe. Anschließend wird die kleinste Übereinstimmung zurückgegeben.
quelle
import itertools as i
und danni.permutations
kürzer?