Desafio
Dada alguma sequência de entrada, retorne um valor truthy se ele representar um numeral romano correto entre 1 (= I
) e 3999 (= MMMCMXCIX
), e um valor falsey caso contrário.
Detalhes
- A entrada é uma sequência não vazia que compreende apenas os caracteres
IVXLCDM
. - Os números romanos (que usamos aqui neste desafio) são definidos da seguinte maneira:
Usamos apenas os seguintes símbolos:
Symbol I V X L C D M
Value 1 5 10 50 100 500 1000
Para definir quais cadeias de caracteres são realmente números romanos válidos, provavelmente é mais fácil fornecer a regra da conversa: Para escrever um número decimal a3 a2 a1 a0
(onde cada ai
um representa um dígito. Por exemplo, para representar 792
nós temos a3=0, a2=7, a1=9, a0=2
.) Como um número romano, nós o decompomos no poder das dezenas. Os diferentes poderes de dez podem ser escritos da seguinte maneira:
1-9: I, II, III, IV, V, VI, VII, VIII, IX
10-90: X, XX, XXX, XL, L, LX, LXX, LXXX, XC
100-900: C, CC, CCC, CD, D, DC, DCC, DCCC, CM
1000-3000: M, MM, MMM
Começando no lado esquerdo com o dígito mais significativo do, podemos converter o número que cada dígito representa separadamente e concatená-los. Portanto, para o exemplo acima, seria assim:
Digit a3 a2 a1 a0
Decimal 0 7 9 2
Roman DCC XC II
Portanto, o numeral romano para 792
é DCCXCII
. Aqui está uma lista completa de todos os algarismos romanos relevantes para este desafio: OEIS a006968.txt
Exemplos
Truthy
MCCXXXIV (1234)
CMLXXXVIII (988)
DXIV (514)
CI (101)
Falsey
MMIXVIII
IVX
IXV
MMMM
XXXVX
IVI
VIV
MMMM
inválido? Existe uma carta para 5000 que deve ser usada em vez de M <letra>?I,V,X,L,C,D,M
.Respostas:
Detalhado , 1362 bytes
As saídas
I
para números romanos válidos no intervaloI-MMMCMXCIX
eNULLA
(0) ou informam que a entrada do usuário não é um número romano válido.fonte
C # (compilador interativo do Visual C #) ,
79109 bytesParece um desafio Regex, tenho certeza de que uma solução mais curta pode ser encontrada ...
Experimente online!
fonte
{0,3}
a{,3}
?{5,}
trabalho, mas não{,5}
./u:System.Text.RegularExpressions.Regex
, como esta resposta :)^M?M?M?(C[MD]|D?C?C?C?)(X[CL]|L?X?X?X?)(I[XV]|V?I?I?I?)$
. Mesmo comprimento, mas parece mais estranho (qual é o objetivo, certo?)Wolfram Language (Mathematica) , 35 bytes
Experimente online!
5 bytes salvos, graças a @attinat
a limitação
[1,3999]
unfortunateley custa 7 bytes ...aqui está o código para qualquer número romano
Wolfram Language (Mathematica) , 28 bytes
Experimente online!
o código acima funciona para qualquer número, não apenas [1,3999]
fonte
IVXLCDM
."Boole
também é mais curto (em um byte) do que usadoIf
dessa maneira.Montagem CP-1610 ( Intellivision ),
52 ... 4847 DECLEs 1 = 59 bytesVamos tentar isso em um sistema que antecede o Perl por uns bons 7 anos. :-)
Leva um ponteiro para uma seqüência de caracteres NULL-Terminated em R4 . Define o sinalizador Zero se a entrada for um número romano válido ou o limpa de outra forma.
Quão?
A expressão regular pode ser reescrita como 4 grupos com a mesma estrutura, desde que
#
qualquer caractere inválido garantido não esteja presente na sequência de entrada.Nossa rotina tenta analisar o caractere da string de entrada por caractere de acordo com esses padrões e, eventualmente, verifica se o fim da string é atingido.
Resultado
captura de tela do jzIntv
1. Um código de operação CP-1610 é codificado com um valor de 10 bits, conhecido como 'DECLE'. Essa rotina tem 47 DECLEs, começando em US $ 4876 e terminando em US $ 48A4 (incluído).
fonte
Java 8, 70 bytes
Porto da resposta em C # da @ Innat3 , certifique-se de vomitá-lo!
Experimente online.
Explicação:
fonte
R ,
747156 bytesObrigado a @RobinRyder, @Giuseppe e @MickyT por suas sugestões de como usar o grep efetivamente com os R's incorporados
as.roman
.Experimente online!
fonte
as.roman
de qualquer maneira, não funcionará, pois só funciona3899
por algum motivo.as.roman
: primeiro retire a inicial,M
se houver, e verifique se o resultado estáas.roman(1:2999)
. Isso requer tratamento especial do caso em que a entrada estáM
.romans
seria uma coisa útil para colocar em R ??? Foi adicionado em 2.5.0 (abril de 2007) ...Wolfram Language (Mathematica) , 32 bytes
Experimente online!
fonte
Geléia ,
48 47 4644 bytes-1 graças a Nick Kennedy
IVXLCDM
1
0
Experimente online! Ou veja a suíte de testes .
Quão?
fonte
Perl 5 (
-p
), 57 bytesTIO
{0,3}
quantificador foi alterado por*
&!/(.)\1{3}/
para garantir que o mesmo caractere não ocorra quatro vezes seguidas.-/(.)\1{3}/
porque daria-1
paraIIIIVI
, por exemplo,fonte
Python 2 , 81 bytes
Experimente online!
Vejamos a última parte da regex, que corresponde aos números romanos até 9 (incluindo a string vazia)
Isso tem duas alternativas separadas por
|
:V?I{,3}
: Um opcionalV
seguido por até 3I
's. Isto corresponde a seqüência vaziaI
,II
,III
,V
,VI
,VII
,VIII
.I[VX]
: AnI
seguido por umV
ouX
. Isso correspondeIV
eIX
.O mesmo ocorre com a
X,L,C
correspondência das dezenas, comC,D,M
as centenas e, finalmente,^M{,3}
permite até 3M
'(milhares) no início.Tentei gerar o modelo para cada trio de personagens em vez de escrevê-lo três vezes, mas isso foi muito mais longo.
fonte
^
âncora no início;match
já implica que ele corresponde no início da string.^
.f=
não está incluída no código, pois funções anônimas são permitidas. É apenas para o TIO.lambda
s não atribuídos são legais, portanto métodos vinculados não atribuídos de regex compilado também devem ser bons.Retina ,
5651 bytesPorto da resposta Perl 5 de @NahuelFouilleul , por isso não deixe de votar nele!
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
05AB1E ,
6198 bytesEnorme-52 bytes graças a @Adnan , porque aparentemente o número romano de 05AB1E embutido não foi documentado, haha .. xD
Experimente online ou verifique todos os casos de teste .
Explicação:
Veja esta minha dica 05AB1E (seção Como comprimir números inteiros grandes? ) Para entender por que
ŽF¯
é3999
.Resposta original de 61 bytes:
Experimente online ou verifique todos os casos de teste .
Explicação:
Veja este 05AB1E ponta do meu (seções Como cordas compressa não faz parte do dicionário? , Como comprimir grandes inteiros? E Como listas inteiras compressa? ) Para entender o porquê:
•1∞Γ'иÛnuÞ\₂…•
é397940501547566186191992778
Ž8в
é2112
•1∞Γ'иÛnuÞ\₂…•Ž8вв
é[1,11,111,12,2,21,211,2111,10]
.•6#&‘нδ•
é"xivcxlmcd"
fonte
.X
não está documentado, mas acho que isso deve funcionar:3999L.XQO
3999
. :)perl -MRegexp :: Common -pe, 34 bytes
o
&!/(.)\1{3}/
parte é necessária, porqueRegexp::Common
permite quatro (mas não cinco) dos mesmos caracteres seguidos. Dessa forma, ele corresponde aos números romanos usados nas faces do relógio, ondeIIII
é frequentemente usado para 4.fonte
Python 3 ,
116113109107105106 bytesExperimente online!
-1 byte graças a ShadowRanger
fonte
^
é desnecessária, poismatch
apenas corresponde ao início de uma string.$
é necessário (fullmatch
implica apenas âncoras nas duas extremidades e, obviamente, isso custaria mais do que a$
).Ruby , (
-n
) 56 bytesExperimente online!
Saídas 0 (verdade) ou nulo (falsidade).
fonte