Napisz algorytm interpretujący ciąg liter jako cyfrę rzymską. (patrz reguły cyfr rzymskich poniżej)
Każda odrębna litera ma pasującą arabską wartość dziesiętną, bez wartości maksymalnej. Ale nie masz klucza wcześniej, więc {A=10, I=1, X=5, ... Z=1000000}
decyduje o tym twoja interpretacja.
Wyzwanie
- Odczytaj dane wejściowe przez
STDIN
lub równoważne i napisz dane wyjściowe przezSTDOUT
lub równoważne - Prawidłowe dane wejściowe to kombinacje wielkich i małych liter, tj. Dopasowanie
\[a-zA-Z]+\
- Dane wejściowe należy sprawdzić, aby sprawdzić, czy sekwencję liter można interpretować jako prawidłową liczbę rzymską
- Jeśli dane wejściowe przejdą walidację, prawidłową wartością wyjściową powinna być najniższa arabska interpretacja dziesiętna, a użyty klucz, tzn.
Aa
Interpretowany jako4 {a=5, A=1}
nie6 {A=5, a=1}
lub9 {a=10, a=1}
Reguły liczb rzymskich
Tylko litery reprezentujące moc dziesięciu mogą być powtarzane, maksymalnie trzy razy kolejno i łącznie cztery razy, np
II
III
XXXIX
Jeśli jedna lub więcej liter jest umieszczonych po innej literze o większej wartości, dodaj tę kwotę
AAaa => 22 {A=10, a=1} (20 + 2 = 22) bbAAaa => 222 {b=100, A=10, a=1} (200 + 20 + 2 = 222)
Jeśli litera zostanie umieszczona przed inną literą o większej wartości, odejmij tę kwotę
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)
Odejmowanie kwot od cyfr rzymskich ma kilka zasad:
- Odejmuj tylko potęgi dziesięciu, czyli
1, 10, 100...
nie5, 50, 500...
- Dlatego podwójne odejmowanie nie
18
jest zapisane jakoXVIII
nieIIXX (10 + 10 - 1 - 1)
- Nie odejmuj liczby od liczby większej niż dziesięć razy.
Można odjąć1
od5
lub10
ale nie od50, 100, 500...
- Odejmuj tylko potęgi dziesięciu, czyli
Przykład
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}
code-golf
cryptography
roman-numerals
iamogbz
źródło
źródło
Aa
ma wartość 1 (A = 1, a = 2).Odpowiedzi:
Python 2,
415444440419416 bajtówW końcu nie ma tylu cyfr rzymskich. Ten skrypt tworzy je wszystkie i sprawdza wszystkie permutacje danych wejściowych, a następnie zwraca najmniejsze dopasowanie.
źródło
import itertools as i
a potem jesti.permutations
krótszy?