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 aiuno representa un dígito. Así, por ejemplo, para representar 792que 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 792es 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

MMMMinvá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
Ipara números romanos válidos en el rangoI-MMMCMXCIXyNULLA(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".Booletambién es más corto (por un byte) que usarloIfde 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.romanno funcionará de todos modos, ya que solo funciona3899por alguna razón.as.roman: primero elimine la inicialMsi hay una, luego verifique si el resultado está adentroas.roman(1:2999). Esto requiere un manejo especial del caso donde está la entradaM.romansserí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
IVXLCDM10Prué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-1paraIIIIVI, 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}: OpcionalVseguido de hasta 3I's. Esto concuerda con la cadena vacíaI,II,III,V,VI,VII,VIII.I[VX]: UnIseguido de unVoX. Esto coincideIVyIX.Lo mismo con
X,L,Cigualar las decenas, con igualar losC,D,Mcientos, 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;matchya 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.lambdason 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
.Xno está documentado, pero creo que esto debería funcionar:3999L.XQO3999. :)perl -MRegexp :: Común -pe, 34 bytes
La
&!/(.)\1{3}/parte es necesaria, porqueRegexp::Commonpermite 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 aIIIImenudo se usa para 4.fuente
Python 3 ,
116113109107105106 bytesPruébalo en línea!
-1 byte gracias a ShadowRanger
fuente
^es innecesario ya quematchsolo coincide al comienzo de una cadena.$es necesario (solofullmatchimplica 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