Escreva um algoritmo para interpretar uma sequência de letras como um número romano. (veja as regras dos números romanos abaixo)
Cada letra distinta tem um valor decimal em árabe correspondente, no máximo. Mas você não tem a chave de antemão, por isso {A=10, I=1, X=5, ... Z=1000000}
é decidido pela sua interpretação.
Desafio
- Leia a entrada via
STDIN
ou equivalente e grave a saída viaSTDOUT
ou equivalente - Entradas válidas são combinações de letras maiúsculas e minúsculas, ou seja,
\[a-zA-Z]+\
- A entrada deve ser validada para verificar se a sequência de letras pode ser interpretada como um número romano válido
- Se a entrada for aprovada na validação, a saída válida deve ser a menor interpretação decimal árabe e a chave usada, ou seja,
Aa
é interpretada como4 {a=5, A=1}
não6 {A=5, a=1}
ou9 {a=10, a=1}
Regras dos Números Romanos
Somente letras representando potências de dez podem ser repetidas, no máximo três vezes sucessivas e quatro vezes no total, por exemplo
II
III
XXXIX
Se uma ou mais letras forem colocadas após outra letra de maior valor, adicione esse valor
AAaa => 22 {A=10, a=1} (20 + 2 = 22) bbAAaa => 222 {b=100, A=10, a=1} (200 + 20 + 2 = 222)
Se uma carta for colocada antes de outra letra de maior valor, subtraia esse valor
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)
Várias regras se aplicam para subtrair valores de algarismos romanos:
- Subtraia apenas poderes de dez, ou seja,
1, 10, 100...
não5, 50, 500...
- Portanto, nenhuma subtração dupla
18
é escrita comoXVIII
nãoIIXX (10 + 10 - 1 - 1)
- Não subtraia um número de um que seja dez vezes maior.
Você pode subtrair1
a partir de5
ou10
, mas não de50, 100, 500...
- Subtraia apenas poderes de dez, ou seja,
Exemplo
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}
fonte
Aa
tem um valor de 1 (A = 1, a = 2).Respostas:
Python 2,
415444440419416 bytesAfinal, não existem tantos números romanos. Este script cria todos eles e verifica todas as permutações da entrada e, em seguida, retorna a menor correspondência.
fonte
import itertools as i
e depoisi.permutations
mais curto?