Desafío
Dada alguna cadena de entrada, devuelve un valor verdadero si representa un número romano correcto entre 1 (= I
) y 3999 (= MMMCMXCIX
), y un valor falso de lo contrario.
Detalles
- La entrada es una cadena no vacía que solo comprende los caracteres
IVXLCDM
. - Los números romanos (que usamos aquí en este desafío) se definen de la siguiente manera:
Utilizamos solo los siguientes símbolos:
Symbol I V X L C D M
Value 1 5 10 50 100 500 1000
Para definir qué cadenas son en realidad números romanos válidos, probablemente sea más fácil proporcionar la regla de conversación: para escribir un número decimal a3 a2 a1 a0
(donde cada ai
uno representa un dígito. Así, por ejemplo, para representar 792
que tenemos a3=0, a2=7, a1=9, a0=2
) como un número romano, lo descomponemos en el poder de las decenas. Las diferentes potencias de diez se pueden escribir de la siguiente manera:
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
Comenzando en el lado izquierdo con el dígito más significativo del, podemos convertir el número que cada dígito representa por separado y concatenarlos. Entonces, para el ejemplo anterior, esto se vería así:
Digit a3 a2 a1 a0
Decimal 0 7 9 2
Roman DCC XC II
Por lo tanto, el número romano para 792
es DCCXCII
. Aquí hay una lista completa de todos los números romanos que son relevantes para este desafío: OEIS a006968.txt
Ejemplos
Verdad
MCCXXXIV (1234)
CMLXXXVIII (988)
DXIV (514)
CI (101)
Falsey
MMIXVIII
IVX
IXV
MMMM
XXXVX
IVI
VIV
MMMM
inválido? ¿Hay una letra para 5000 que debería usarse en lugar de M <letter>?I,V,X,L,C,D,M
.Respuestas:
Detallado , 1362 bytes
Las salidas
I
para números romanos válidos en el rangoI-MMMCMXCIX
yNULLA
(0) o informa que la entrada del usuario no es un número romano válido de lo contrario.fuente
C # (Visual C # interactivo Compilador) ,
79109 bytesEsto parece un desafío Regex, estoy seguro de que se puede encontrar una solución más corta ...
Pruébalo en línea!
fuente
{0,3}
a{,3}
?{5,}
trabajo, pero no{,5}
./u:System.Text.RegularExpressions.Regex
, como esta respuesta :)^M?M?M?(C[MD]|D?C?C?C?)(X[CL]|L?X?X?X?)(I[XV]|V?I?I?I?)$
. Misma longitud, pero se ve más raro (¿cuál es el objetivo, verdad?)Wolfram Language (Mathematica) , 35 bytes
Pruébalo en línea!
5 bytes guardados, gracias a @attinat
la limitación
[1,3999]
desafortunadamente cuesta 7 bytes ...aquí está el código para cualquier número romano
Wolfram Language (Mathematica) , 28 bytes
Pruébalo en línea!
el código anterior funciona para cualquier número, no solo [1,3999]
fuente
IVXLCDM
".Boole
también es más corto (por un byte) que usarloIf
de esa manera.Conjunto CP-1610 ( Intellivision ),
52 ... 4847 DECLEs 1 = 59 bytesProbemos esto en un sistema que precede a Perl por unos buenos 7 años. :-)
Toma un puntero a una cadena terminada en nulo en R4 . Establece el indicador de cero si la entrada es un número romano válido, o lo borra de lo contrario.
¿Cómo?
La expresión regular se puede reescribir como 4 grupos con la misma estructura, siempre que
#
sea un carácter no válido que se garantice que no esté presente en la cadena de entrada.Nuestra rutina intenta analizar la cadena de entrada carácter por carácter de acuerdo con estos patrones y eventualmente verifica si se alcanza el final de la cadena.
Salida
captura de pantalla de jzIntv
1. Un código de operación CP-1610 está codificado con un valor de 10 bits, conocido como 'DECLE'. Esta rutina tiene 47 DECLEs de largo, comenzando en $ 4876 y terminando en $ 48A4 (incluido).
fuente
Java 8, 70 bytes
Respuesta de C # del puerto de @ Innat3 , ¡así que asegúrese de votarlo!
Pruébalo en línea.
Explicación:
fuente
R ,
747156 bytesGracias a @RobinRyder, @Giuseppe y @MickyT por sus sugerencias sobre cómo usar grep de manera efectiva con las R incorporadas
as.roman
.Pruébalo en línea!
fuente
as.roman
no funcionará de todos modos, ya que solo funciona3899
por alguna razón.as.roman
: primero elimine la inicialM
si hay una, luego verifique si el resultado está adentroas.roman(1:2999)
. Esto requiere un manejo especial del caso donde está la entradaM
.romans
sería algo útil poner en R? Fue agregado en 2.5.0 (abril de 2007) ...Wolfram Language (Mathematica) , 32 bytes
Pruébalo en línea!
fuente
Gelatina ,
48 47 4644 bytes-1 gracias a Nick Kennedy
IVXLCDM
1
0
Pruébalo en línea! O vea el conjunto de pruebas .
¿Cómo?
fuente
Perl 5 (
-p
), 57 bytesTIO
{0,3}
cuantificador fue cambiado por*
&!/(.)\1{3}/
para garantizar que el mismo personaje no pueda aparecer 4 veces seguidas.-/(.)\1{3}/
porque daría-1
paraIIIIVI
, por ejemplo,fuente
Python 2 , 81 bytes
Pruébalo en línea!
Veamos la última parte de la expresión regular, que coincide con los números romanos hasta el 9 (incluida la cadena vacía)
Esto tiene dos alternativas separadas por
|
:V?I{,3}
: OpcionalV
seguido de hasta 3I
's. Esto concuerda con la cadena vacíaI
,II
,III
,V
,VI
,VII
,VIII
.I[VX]
: UnI
seguido de unV
oX
. Esto coincideIV
yIX
.Lo mismo con
X,L,C
igualar las decenas, con igualar losC,D,M
cientos, y finalmente^M{,3}
permite hasta 3M
(miles) al comienzo.Intenté generar la plantilla para cada trío de caracteres en lugar de escribirla 3 veces, pero esto fue mucho más largo.
fuente
^
ancla al principio;match
ya implica que coincide al comienzo de la cadena.^
.f=
no está incluido en el código ya que se permiten funciones anónimas. Es solo para TIO.lambda
son legales, por lo que los métodos vinculados no asignados de expresiones regulares compiladas también deberían ser buenos.Retina ,
5651 bytesPuerto de la respuesta de Perl 5 de @NahuelFouilleul , ¡así que asegúrate de votarlo!
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
05AB1E ,
6198 bytesPruébelo en línea o verifique todos los casos de prueba .
Explicación:
Ver este consejo 05AB1E mío (sección Cómo comprimir grandes números enteros? ) Para entender por qué
ŽF¯
es3999
.Respuesta original de 61 bytes:
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Vea esta sugerencia mía 05AB1E (secciones ¿Cómo comprimir cadenas que no forman parte del diccionario ? , ¿Cómo comprimir enteros grandes? Y ¿Cómo comprimir listas enteras? ) Para comprender por qué:
•1∞Γ'иÛnuÞ\₂…•
es397940501547566186191992778
Ž8в
es2112
•1∞Γ'иÛnuÞ\₂…•Ž8вв
es[1,11,111,12,2,21,211,2111,10]
.•6#&‘нδ•
es"xivcxlmcd"
fuente
.X
no está documentado, pero creo que esto debería funcionar:3999L.XQO
3999
. :)perl -MRegexp :: Común -pe, 34 bytes
La
&!/(.)\1{3}/
parte es necesaria, porqueRegexp::Common
permite cuatro (pero no cinco) de los mismos caracteres en una fila. De esa manera, coincide con los números romanos utilizados en las caras de los relojes, donde aIIII
menudo se usa para 4.fuente
Python 3 ,
116113109107105106 bytesPruébalo en línea!
-1 byte gracias a ShadowRanger
fuente
^
es innecesario ya quematch
solo coincide al comienzo de una cadena.$
es necesario (solofullmatch
implica anclajes en ambos extremos, y obviamente eso costaría más que a$
).Ruby , (
-n
) 56 bytesPruébalo en línea!
Salidas 0 (verdadero) o nulo (falso).
fuente