Emparejar números romanos


19

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


Todavía no creo que esto califique como un "subconjunto" ya que el conjunto de entradas no válidas es más grande. Este desafío aquí solo se refiere a los números definidos "bien" que se usan en OEIS A006968
falla

2
¿Por qué es MMMMinválido? ¿Hay una letra para 5000 que debería usarse en lugar de M <letter>?
Skyler

Echa un vistazo a las especificaciones, no hay tal carta. Los únicos símbolos utilizados son I,V,X,L,C,D,M.
falla

Respuestas:


17

Detallado , 1362 bytes

GET A ROMAN NUMERAL TYPED IN BY THE CURRENT PERSON USING THIS PROGRAM AND PUT IT ONTO THE TOP OF THE PROGRAM STACK
PUT THE NUMBER MMMM ONTO THE TOP OF THE PROGRAM STACK
MOVE THE FIRST ELEMENT OF THE PROGRAM STACK TO THE SECOND ELEMENT'S PLACE AND THE SECOND ELEMENT OF THE STACK TO THE FIRST ELEMENT'S PLACE
DIVIDE THE FIRST ELEMENT OF THE PROGRAM STACK BY THE SECOND ELEMENT OF THE PROGRAM STACK AND PUT THE RESULT ONTO THE TOP OF THE PROGRAM STACK
PUT THE NUMBER V ONTO THE TOP OF THE PROGRAM STACK
GET THE FIRST ELEMENT OF THE PROGRAM STACK AND THE SECOND ELEMENT OF THE PROGRAM STACK AND IF THE SECOND ELEMENT OF THE PROGRAM STACK IS NOT ZERO JUMP TO THE INSTRUCTION THAT IS THE CURRENT INSTRUCTION NUMBER AND THE FIRST ELEMENT ADDED TOGETHER'S RESULT
PUT THE NUMBER I ONTO THE TOP OF THE PROGRAM STACK
GET THE TOP ELEMENT OF THE STACK AND OUTPUT IT FOR THE CURRENT PERSON USING THIS PROGRAM TO SEE
PUT THE NUMBER III ONTO THE TOP OF THE PROGRAM STACK
GET THE FIRST ELEMENT OF THE PROGRAM STACK AND THE SECOND ELEMENT OF THE PROGRAM STACK AND IF THE SECOND ELEMENT OF THE PROGRAM STACK IS NOT ZERO JUMP TO THE INSTRUCTION THAT IS THE CURRENT INSTRUCTION NUMBER AND THE FIRST ELEMENT ADDED TOGETHER'S RESULT
PUT THE NUMBER NULLA ONTO THE TOP OF THE PROGRAM STACK
GET THE TOP ELEMENT OF THE STACK AND OUTPUT IT FOR THE CURRENT PERSON USING THIS PROGRAM TO SEE

Las salidas Ipara números romanos válidos en el rango I-MMMCMXCIXy NULLA(0) o informa que la entrada del usuario no es un número romano válido de lo contrario.


12
No puedo decidir si esta es la herramienta adecuada para el trabajo o no.
Vaelus

55
¿Es esta la herramienta adecuada para cualquier trabajo?
omzrs

8

C # (Visual C # interactivo Compilador) , 79 109 bytes

Esto parece un desafío Regex, estoy seguro de que se puede encontrar una solución más corta ...

s=>System.Text.RegularExpressions.Regex.IsMatch(s,"^M{0,3}(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$")

Pruébalo en línea!


¿No podría acortar {0,3}a {,3}?
flawr

@flawr no parece capturar nada entonces
Innat3

1
Ah lo siento, solo cosas como el {5,}trabajo, pero no {,5}.
flawr

2
En su lugar, puede agregarlo como indicador del compilador, por lo que son 72 bytes y el idioma debe cambiarse a C # (compilador interactivo de Visual C #) con un indicador/u:System.Text.RegularExpressions.Regex , como esta respuesta :)
Kevin Cruijssen

3
Expresiones regulares alternativo: ^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?)
Encarnación de la ignorancia

8

Wolfram Language (Mathematica) , 35 bytes

Check[FromRomanNumeral@#<3999,1<0]&

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

Check[FromRomanNumeral@#,F]&

Pruébalo en línea!

el código anterior funciona para cualquier número, no solo [1,3999]


2
@ExpiredData "La entrada es una cadena no vacía que solo comprende los caracteres IVXLCDM".
Mathmandan

35 bytes . Booletambién es más corto (por un byte) que usarlo Ifde esa manera.
attinat

8

Conjunto CP-1610 ( Intellivision ),  52 ... 48  47 DECLEs 1 = 59 bytes

Probemos 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.

                ROMW    10              ; use 10-bit ROM width
                ORG     $4800           ; map this program at $4800

                ;; ------------------------------------------------------------- ;;
                ;;  test code                                                    ;;
                ;; ------------------------------------------------------------- ;;
4800            EIS                     ; enable interrupts

4801            SDBD                    ; R5 = pointer into test case index
4802            MVII    #ndx,     R5
4805            MVII    #$214,    R3    ; R3 = backtab pointer
4807            MVII    #11,      R0    ; R0 = number of test cases

4809  loop      SDBD                    ; R4 = pointer to next test case
480A            MVI@    R5,       R4
480B            PSHR    R0              ; save R0, R3, R5 onto the stack
480C            PSHR    R3
480D            PSHR    R5
480E            CALL    isRoman         ; invoke our routine
4811            PULR    R5              ; restore R5 and R3
4812            PULR    R3

4813            MVII    #$1A7,    R0    ; use a white 'T' by default
4815            BEQ     disp

4817            MVII    #$137,    R0    ; or a white 'F' is the Z flag was cleared

4819  disp      MVO@    R0,       R3    ; draw it
481A            INCR    R3              ; increment the backtab pointer

481B            PULR    R0              ; restore R0
481C            DECR    R0              ; and advance to the next test case, if any
481D            BNEQ    loop

481F            DECR    R7              ; loop forever

                ;; ------------------------------------------------------------- ;;
                ;;  test cases                                                   ;;
                ;; ------------------------------------------------------------- ;;
4820  ndx       BIDECLE test0, test1, test2, test3
4828            BIDECLE test4, test5, test6, test7, test8, test9, test10

                ; truthy
4836  test0     STRING  "MCCXXXIV", 0
483F  test1     STRING  "CMLXXXVIII", 0
484A  test2     STRING  "DXIV", 0
484F  test3     STRING  "CI", 0

                ; falsy
4852  test4     STRING  "MMIXVIII", 0
485B  test5     STRING  "IVX", 0
485F  test6     STRING  "IXV", 0
4863  test7     STRING  "MMMM", 0
4868  test8     STRING  "XXXVX", 0
486E  test9     STRING  "IVI", 0
4872  test10    STRING  "VIV", 0

                ;; ------------------------------------------------------------- ;;
                ;;  routine                                                      ;;
                ;; ------------------------------------------------------------- ;;
      isRoman   PROC

4876            PSHR    R5              ; push the return address

4877            MOVR    R7,       R2    ; R2 = dummy 1st suffix
4878            MOVR    R2,       R5    ; R5 = pointer into table
4879            ADDI    #@tbl-$+1,R5

487B  @loop     MVI@    R5,       R1    ; R1 = main digit (M, C, X, I)
487C            MVI@    R5,       R3    ; R3 = prefix or 2nd suffix (-, D, L, V)

487D            MVI@    R4,       R0    ; R0 = next digit

487E            CMPR    R0,       R3    ; if this is the prefix ...
487F            BNEQ    @main

4881            COMR    R2              ; ... disable the suffixes
4882            COMR    R3              ; by setting them to invalid values
4883            MVI@    R4,       R0    ; and read R0 again

4884  @main     CMPR    R0,       R1    ; if R0 is not equal to the main digit,
4885            BNEQ    @back           ; assume that this part is over

4887            MVI@    R4,       R0    ; R0 = next digit
4888            CMPR    R0,       R1    ; if this is a 2nd occurrence
4889            BNEQ    @suffix         ; of the main digit ...

488B            CMP@    R4,       R1    ; ... it may be followed by a 3rd occurrence
488C            BNEQ    @back

488E            MOVR    R2,       R0    ; if so, force the test below to succeed

488F  @suffix   CMPR    R0,       R2    ; otherwise, it may be either the 1st suffix
4890            BEQ     @next
4892            CMPR    R0,       R3    ; or the 2nd suffix (these tests always fail
4893            BEQ     @next           ; if the suffixes were disabled above)

4895  @back     DECR    R4              ; the last digit either belongs to the next
                                        ; iteration or is invalid

4896  @next     MOVR    R1,       R2    ; use the current main digit
                                        ; as the next 1st suffix

4897            SUBI    #'I',     R1    ; was it the last iteration? ...
4899            BNEQ    @loop

489B            CMP@    R4,       R1    ; ... yes: make sure that we've also reached
                                        ; the end of the input

489C            PULR    R7              ; return

489D  @tbl      DECLE   'M', '-'        ; table format: main digit, 2nd suffix
489F            DECLE   'C', 'D'
48A1            DECLE   'X', 'L'
48A3            DECLE   'I', 'V'

                ENDP

¿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.

                 +-------+---> main digit
                 |       |
(M[##]|#?M{0,3})(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})
                   ||  |
                   |+--+-----> prefix or second suffix
                   |
                   +---------> first suffix

nortenorte-1(main_digit,second_suffix)

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

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).


¿No sería este uno de los pocos lugares donde los bytes fraccionales son válidos
Solo ASCII

@ Solo ASCII Solía ​​pensarlo, pero no estoy seguro. Vea los comentarios de esta respuesta para obtener una idea de esto.
Arnauld

@ Solo ASCII Además, acabo de encontrar esta publicación en meta que tiende a confirmar que probablemente sea mejor redondear a bytes completos.
Arnauld

ah, ¿entonces solo son 10 bits cuando está en RAM?
ASCII solo el

El programa nunca se almacena en la RAM, solo en la ROM. Por lo tanto, depende de los chips de memoria utilizados en el cartucho. La CPU está diseñada para acceder a ROM de 10 bits o de 16 bits. La directiva "ROMW 10" obliga al compilador a generar código en formato de 10 bits.
Arnauld

7

Java 8, 70 bytes

s->s.matches("M{0,3}(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})")

Respuesta de C # del puerto de @ Innat3 , ¡así que asegúrese de votarlo!

Pruébalo en línea.

Explicación:

s->                // Method with String parameter and boolean return-type
  s.matches("...") //  Check if the string matches the regex fully
                   //  (which implicitly adds a leading "^" and trailing "$")

M{0,3}             // No, 1, 2, or 3 adjacent "M"
(     |        )   // Followed by either:
 C[MD]             //  A "C" with an "M" or "D" after it
      |            // or:
       D?          //  An optional "D"
         C{0,3}    //  Followed by no, 1, 2, or 3 adjacent "C"
(     |        )   // Followed by either:
 X[CL]             //  An "X" with a "C" or "L" after it
      |            // or:
       L?          //  An optional "L"
         X{0,3}    //  Followed by no, 1, 2, or 3 adjacent "X"
(     |        )   // Followed by either:
 I[XV]             //  An "I" with an "X" or "V" after it
      |            // or:
       V?          //  An optional "V"
         I{0,3}    //  Followed by no, 1, 2, or 3 adjacent "I"

5

R , 74 71 56 bytes

Gracias a @RobinRyder, @Giuseppe y @MickyT por sus sugerencias sobre cómo usar grep de manera efectiva con las R incorporadas as.roman.

sub("^M(.+)","\\1",scan(,""))%in%paste(as.roman(1:2999))

Pruébalo en línea!


as.romanno funcionará de todos modos, ya que solo funciona 3899por alguna razón.
Giuseppe

Realmente debería leer mejor la documentación, probablemente porque 4000 no tiene una representación definida en romano, entonces, ¿cómo haría uno 3900. Esto es similar a 390 y ahora acabo de encontrar un problema con mi grep donde tendría que Anclar el patrón.
CT Hall

@Giuseppe, dirigido, usando la misma expresión regular que las otras respuestas.
CT Hall

2
66 bytes usando as.roman: primero elimine la inicial Msi hay una, luego verifique si el resultado está adentro as.roman(1:2999). Esto requiere un manejo especial del caso donde está la entrada M.
Robin Ryder

1
Mi última pregunta es, ¿quién diablos decidió que romanssería algo útil poner en R? Fue agregado en 2.5.0 (abril de 2007) ...
Giuseppe


2

Gelatina ,  48 47 46  44 bytes

-1 gracias a Nick Kennedy

5Żo7;“ÆæC‘ð“IVXLCDM”ṃ@3Ƥm2”MẋⱮ3¤ṭŻ€ṚŒpF€ḟ€0ċ

IVXLCDM1139990

Pruébalo en línea! O vea el conjunto de pruebas .

¿Cómo?

5Żo7;“ÆæC‘ð“IVXLCDM”ṃ@3Ƥm2”MẋⱮ3¤ṭŻ€ṚŒpF€ḟ€0ċ  - Main Link: list of characters S

5Żo7;“ÆæC‘  - chain 1: f(S) -> X
5Ż          - zero range of five = [0,1,2,3,4,5]
  o7        - OR seven             [7,1,2,3,4,5]
     “ÆæC‘  - list of code-page indices        [13,22,67]
    ;       - concatenate          [7,1,2,3,4,5,13,22,67]

          ð - start a new dyadic chain...

“IVXLCDM”ṃ@3Ƥm2”MẋⱮ3¤ṭŻ€ṚŒpF€ḟ€0ċ - chain 2: f(X,S) -> isValid
“IVXLCDM”                         - list of characters, IVXLCDM
           3Ƥ                     - for infixes of length three:
                                  - (i.e. IVX VXL XLC LCD CDM)
         ṃ@                       -   base decompression with swapped arguments
                                  -   (i.e. use characters as base-3 digits of X's values)
                                  -   (e.g. IVX -> VI I V IX II IV III VII VIII)
             m2                   - modulo two slice (results for IVX XLC and CDM only)
                    ¤             - nilad followed by link(s) as a nilad:
               ”M                 -   character 'M'
                  Ɱ3              -   map across [1,2,3] with:
                 ẋ                -     repeat -> M MM MMM
                     ṭ            - tack
                      Ż€          - prepend a zero to each
                        Ṛ         - reverse
                                  -   -- now we have the table: 
                                  -    0 M MM MMM
                                  -    0 DC C D CM CC CD CCC DCC DCCC
                                  -    0 LX X L XC XX XL XXX LXX LXXX
                                  -    0 VI I V IX II IV III VII VIII
                         Œp       - Cartesian product   [[0,0,0,0],...,["M","CM",0,"IV"],...]
                           F€     - flatten €ach  [[0,0,0,0],...,['M','C','M',0,'I','V'],...]
                             ḟ€0  - filter out the zeros from €ach       ["",...,"MCMIV",...]
                                ċ - count occurrences of S

Parece que hay un espacio redundante en la primera línea. Otro byte. Se puede guardar otro byte utilizando una primera línea más simple. Pruébalo en línea!
Nick Kennedy el

Gracias, he guardado uno más.
Jonathan Allan

1

Perl 5 ( -p), 57 bytes

$_=/^M*(C[MD]|D?C*)(X[CL]|L?X*)(I[XV]|V?I*)$/&!/(.)\1{3}/

TIO

  • usa casi la misma expresión regular, excepto que el {0,3}cuantificador fue cambiado por*
  • &!/(.)\1{3}/ para garantizar que el mismo personaje no pueda aparecer 4 veces seguidas.
  • no puede ser jugado golf con -/(.)\1{3}/porque daría -1para IIIIVI, por ejemplo,

1

Python 2 , 81 bytes

import re
re.compile('M{,3}(D?C{,3}|C[DM])(L?X{,3}|X[LC])(V?I{,3}|I[VX])$').match

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)

V?I{,3}|I[VX]

Esto tiene dos alternativas separadas por |:

  • V?I{,3}: Opcional Vseguido de hasta 3 I's. Esto concuerda con la cadena vacía I, II, III, V, VI, VII, VIII.
  • I[VX]: Un Iseguido de un Vo X. Esto coincide IVy IX.

Lo mismo con X,L,Cigualar las decenas, con igualar los C,D,Mcientos, y finalmente ^M{,3}permite hasta 3 M(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.


No es necesario el ^ancla al principio; matchya implica que coincide al comienzo de la cadena.
ShadowRanger

@ShadowRanger Gracias, eliminé el ^.
xnor

Aunque creo que arruinaste el conteo en la edición; debería ser 83, no 81.
ShadowRanger

@ShadowRanger El recuento es 81 porque f=no está incluido en el código ya que se permiten funciones anónimas. Es solo para TIO.
xnor

1
Ah, tiene sentido. Molesto, no hay forma de organizarlo para ocultarlo en el encabezado o pie de página, pero sí, los mensajes no asignados lambdason legales, por lo que los métodos vinculados no asignados de expresiones regulares compiladas también deberían ser buenos.
ShadowRanger

1

Retina , 56 51 bytes

(.)\1{3}
0
^M*(C[MD]|D?C*)(X[CL]|L?X*)(I[XV]|V?I*)$

Puerto 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:

(.)\1{3}        # If four adjacent characters can be found which are the same
0               # Replace it with a 0

^...$           # Then check if the string matches the following fully:
 M*             #  No or any amount of adjacent "M"
 (     |    )   #  Followed by either:
  C[MD]         #   A "C" with an "M" or "D" after it
       |        #  or:
        D?      #   An optional "D"
          C*    #   Followed by no or any amount of adjacent "C"
 (     |    )   #  Followed by either:
  X[CL]         #   An "X" with a "C" or "L" after it
       |        #  or:
        L?      #   An optional "L"
          X*    #   Followed by no or any amount of adjacent "X"
 (     |    )   #  Followed by either:
  I[XV]         #   An "I" with an "X" or "V" after it
       |        #  or:
        V?      #   An optional "V"
          I*    #   Followed by no or any amount of adjacent "I"

1

05AB1E , 61 9 8 bytes

ŽF¯L.XIå

-52 bytes , porque aparentemente el número romano de 05AB1E no estaba documentado, jaja ... xD

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

ŽF¯       # Push comressed integer 3999
   L      # Create a list in the range [1,3999]
    .X    # Convert each integer in this list to a roman number string
      Iå  # Check if the input is in this list
          # (and output the result implicitly)

Ver este consejo 05AB1E mío (sección Cómo comprimir grandes números enteros? ) Para entender por qué ŽF¯es 3999.


Respuesta original de 61 bytes:

•1∞Γ'иÛnuÞ\₂…•Ž8вв€SÐ)v.•6#&‘нδ•u3ôNèyè}'M3L×)Rεõš}`3Fâ}€˜JIå

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

1∞Γ'иÛnuÞ\₂…•             '# Push compressed integer 397940501547566186191992778
              Ž8в           # Push compressed integer 2112
                 в          # Convert the integer to Base-2112 as list:
                            #  [1,11,111,12,2,21,211,2111,10]
S                          # Convert each number to a list of digits
  Ð                         # Triplicate this list
   )                        # And wrap it into a list of lists (of lists)
    v                       # Loop `y` over each these three lists:
     .•6#&‘нδ•              #  Push compressed string "xivcxlmcd"
              u             #  Uppercased
               3ô           #  And split into parts of size 3: ["XIV","CXL","MCD"]
     Nè                     #  Use the loop index to get the current part
       yè                   #  And index the list of lists of digits into this string
    }'M                    '# After the loop: push "M"
       3L                   # Push list [1,2,3]
         ×                  # Repeat the "M" that many times: ["M","MM","MMM"]
          )                 # Wrap all lists on the stack into a list:
                            # [[["I"],["I","I"],["I","I","I"],["I","V"],["V"],["V","I"],["V","I","I"],["V","I","I","I"],["I","X"]],[["X"],["X","X"],["X","X","X"],["X","L"],["L"],["L","X"],["L","X","X"],["L","X","X","X"],["X","C"]],[["C"],["C","C"],["C","C","C"],["C","D"],["D"],["D","C"],["D","C","C"],["D","C","C","C"],["C","M"]],["M","MM","MMM"]]
           R                # Reverse this list
            εõš}            # Prepend an empty string "" before each inner list
                `           # Push the four lists onto the stack
                 3F         # Loop 3 times:
                   â        #  Take the cartesian product of the two top lists
                    }€˜     # After the loop: flatten each inner list
                       J    # Join each inner list together to a single string
                        Iå  # And check if the input is in this list
                            # (after which the result is output implicitly)

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Þ\₂…• es 397940501547566186191992778
  • Ž8в es 2112
  • •1∞Γ'иÛnuÞ\₂…•Ž8вв es [1,11,111,12,2,21,211,2111,10]
  • .•6#&‘нδ• es "xivcxlmcd"

1
No estoy seguro de por qué .Xno está documentado, pero creo que esto debería funcionar:3999L.XQO
Adnan

@Adnan Haha, -52 bytes allí mismo. Olvidé por completo que de hecho nos hablaste sobre agregar un número romano incorporado. Le pedirá a @ Mr.Xcoder en el chat que lo agregue a los documentos. ¿Faltan otros comandos? ;) PD: se guardó otro byte al comprimir 3999. :)
Kevin Cruijssen

0

perl -MRegexp :: Común -pe, 34 bytes

$_=/^$RE{num}{roman}$/&!/(.)\1{3}/

La &!/(.)\1{3}/parte es necesaria, porque Regexp::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 a IIIImenudo se usa para 4.


0

Python 3 , 116 113 109 107 105 106 bytes

import re
lambda n:re.match(r'(M{,3}(C(M|CC?|D)?|DC{,3}))(X(C|XX?|L)?|(LX{,3}))?(I(X|II?|V)?|VI{,3})?$',n)

Pruébalo en línea!

-1 byte gracias a ShadowRanger


2
Como mencioné en la respuesta de Py2, el inicio ^ es innecesario ya que matchsolo coincide al comienzo de una cadena.
ShadowRanger

@ShadowRanger agregó anclas durante la depuración y luego no volvió a intentarlo sin ellas. Lo recordaré ahora, ¡gracias! :)
Noodle9

Bueno, para ser claros, el seguimiento $es necesario (solofullmatch implica anclajes en ambos extremos, y obviamente eso costaría más que a $).
ShadowRanger

@ShadowRanger ¡Ah! ¡Eso explica por qué necesitaba anclas! No me di cuenta de que solo necesitaba anclar el final. Gracias de nuevo.
Noodle9

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.