Cocokkan Angka Romawi

19

Tantangan

Diberikan beberapa input string, kembalikan nilai kebenaran jika itu mewakili angka romawi yang benar antara 1 (= I) dan 3999 (= MMMCMXCIX), dan nilai falsey sebaliknya.

Detail

  • Input adalah string yang tidak kosong yang hanya terdiri dari karakter IVXLCDM.
  • Angka romawi (yang kami gunakan di sini dalam tantangan ini) didefinisikan sebagai berikut:

Kami hanya menggunakan simbol berikut:

Symbol  I   V   X   L   C   D    M
Value   1   5  10  50 100 500 1000

Untuk menentukan string mana yang benar-benar angka romawi, mungkin paling mudah untuk memberikan aturan percakapan: Untuk menulis angka desimal a3 a2 a1 a0(di mana masing-masing aimewakili satu digit. Jadi misalnya untuk mewakili yang 792kita miliki a3=0, a2=7, a1=9, a0=2.) Sebagai angka romawi, kita mendekomposisikannya menjadi kekuatan puluhan. Kekuatan sepuluh yang berbeda dapat ditulis sebagai berikut:

      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

Dimulai dari sisi kiri dengan digit paling signifikan, kita dapat mengonversi angka yang diwakili oleh masing-masing digit secara terpisah dan menyatukannya. Jadi untuk contoh dari atas ini akan terlihat seperti ini:

Digit        a3    a2   a1   a0
Decimal       0     7    9    2
Roman             DCC   XC   II

Oleh karena itu angka romawi 792adalah DCCXCII. Berikut adalah daftar lengkap semua angka romawi yang relevan untuk tantangan ini: OEIS a006968.txt

Contohnya

Sejujurnya

MCCXXXIV (1234)
CMLXXXVIII (988)
DXIV (514)
CI (101)

Falsey

MMIXVIII
IVX
IXV
MMMM
XXXVX
IVI
VIV
cacat
sumber
Bagian dari tantangan konversi ini .
Shaggy
Saya masih berpikir ini tidak memenuhi syarat sebagai "subset" karena set input yang tidak valid lebih besar. Tantangan ini di sini hanya mengacu pada angka yang ditentukan dengan baik yang digunakan di OEIS A006968
flawr
2
Mengapa MMMMtidak valid? Apakah ada huruf untuk 5000 yang seharusnya digunakan untuk M <letter>?
Skyler
Lihat spesifikasinya, tidak ada surat seperti itu. Satu-satunya simbol yang digunakan adalah I,V,X,L,C,D,M.
flawr

Jawaban:

17

Verbose , 1362 byte

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

Keluaran I untuk angka romawi yang valid dalam kisaran I-MMMCMXCIXdan NULLA(0) atau menginformasikan input pengguna bukan angka romawi yang valid.

Data Kedaluwarsa
sumber
12
Saya tidak bisa memutuskan apakah ini alat yang tepat untuk pekerjaan itu atau tidak.
Vaelus
5
Apakah ini alat yang tepat untuk pekerjaan apa pun?
omzrs
8

C # (Visual C # Interactive Compiler) , 79 109 byte

Ini sepertinya tantangan Regex, saya yakin solusi yang lebih pendek dapat ditemukan ...

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})$")

Cobalah online!

Innat3
sumber
Tidak bisa Anda mempersingkat {0,3}ke {,3}?
flawr
@ flawr sepertinya tidak menangkap apa pun saat itu
Innat3
1
Ah maaf, hanya hal-hal seperti {5,}pekerjaan, tetapi tidak {,5}.
flawr
2
Anda dapat menambahkannya sebagai flag kompiler, jadi 72 byte dan bahasa harus diubah menjadi C # (Visual C # Interactive Compiler) dengan flag/u:System.Text.RegularExpressions.Regex , seperti jawaban ini :)
Kevin Cruijssen
3
Regex alternatif: ^M?M?M?(C[MD]|D?C?C?C?)(X[CL]|L?X?X?X?)(I[XV]|V?I?I?I?)$. Panjangnya sama, tetapi terlihat lebih aneh (yang tujuannya, kan?)
Perwujudan Ketidaktahuan
8

Bahasa Wolfram (Mathematica) , 35 byte

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

Cobalah online!

5 byte disimpan, terima kasih kepada @attinat

batasan [1,3999]unfortunateley biaya 7 byte ...
sini adalah kode untuk nomor romawi

Bahasa Wolfram (Mathematica) , 28 byte

Check[FromRomanNumeral@#,F]&

Cobalah online!

kode di atas berfungsi untuk nomor apa pun, bukan hanya [1,3999]

J42161217
sumber
2
@ExpiredData "Input adalah string yang tidak kosong yang hanya terdiri dari karakter IVXLCDM."
mathmandan
35 byte . Boolejuga lebih pendek (dengan satu byte) daripada menggunakan Ifcara itu.
attinat
8

Perakitan CP-1610 ( Intellivision ),  52 ... 48  47 DECLEs 1 = 59 byte

Mari kita coba ini pada sistem yang mendahului Perl selama 7 tahun. :-)

Membawa pointer ke string null-dihentikan di R4 . Atur bendera Nol jika inputnya berupa angka Romawi yang valid, atau kosongkan sebaliknya.

                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

Bagaimana?

Ekspresi reguler dapat ditulis ulang sebagai 4 grup dengan struktur yang sama, asalkan #karakter yang tidak valid yang dijamin tidak ada dalam string input.

                 +-------+---> 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

NN1(main_digit,second_suffix)

Rutin kami mencoba untuk menguraikan karakter string input berdasarkan karakter sesuai dengan pola ini dan akhirnya memeriksa apakah akhir string tercapai.

Keluaran

keluaran

tangkapan layar jzIntv


1. Sebuah opcode CP-1610 dikodekan dengan nilai 10-bit, yang dikenal sebagai 'DECLE'. Rutin ini sepanjang 47 DECLE, mulai dari $ 4876 dan berakhir pada $ 48A4 (termasuk).

Arnauld
sumber
ini tidak akan menjadi salah satu dari sedikit tempat di mana byte pecahan yang sah
ASCII-satunya
@ ASCII-saja dulu saya pikir begitu, tapi saya tidak tahu pasti. Lihat komentar dari jawaban ini untuk beberapa wawasan tentang ini.
Arnauld
@ Hanya ASCII Juga, saya baru saja menemukan posting ini dalam meta yang cenderung mengkonfirmasi mungkin terbaik untuk membulatkan ke seluruh byte.
Arnauld
ah, jadi itu hanya 10 bit ketika itu dalam RAM?
ASCII
Program tidak pernah disimpan dalam RAM, hanya dalam ROM. Jadi itu tergantung pada chip memori yang digunakan dalam cartridge. CPU dirancang untuk mengakses ROM 10-bit atau 16-bit. Arahan "ROMW 10" memaksa kompiler untuk menghasilkan kode dalam format 10-bit.
Arnauld
7

Java 8, 70 byte

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

Port of @ Innat3 jawaban C # , jadi pastikan untuk menghapusnya!

Cobalah online.

Penjelasan:

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"
Kevin Cruijssen
sumber
5

R , 74 71 56 byte

Terima kasih kepada @RobinRyder, @Giuseppe, & @MickyT atas saran mereka tentang cara menggunakan grep secara efektif dengan R yang ada di dalamnya as.roman.

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

Cobalah online!

CT Hall
sumber
as.romantoh tidak akan berfungsi, karena hanya berfungsi hingga 3899beberapa alasan.
Giuseppe
Saya benar-benar harus membaca dokumentasi dengan lebih baik, Mungkin karena 4000 tidak memiliki representasi yang pasti dalam bahasa Roman, jadi bagaimana orang melakukan 3900. Ini mirip dengan 390 dan sekarang saya baru saja menemukan masalah dengan grep saya di mana saya harus jangkar polanya.
CT Hall
@Giuseppe, ditangani, menggunakan regex yang sama dengan jawaban lainnya.
CT Hall
2
66 byte menggunakan as.roman: strip pertama inisial Mjika ada, kemudian periksa apakah hasilnya ada di as.roman(1:2999). Ini membutuhkan penanganan khusus dari kasus di mana input berada M.
Robin Ryder
1
Pertanyaan terakhir saya adalah, siapa yang memutuskan romansakan menjadi hal yang berguna untuk dimasukkan ke dalam R ??? Itu ditambahkan dalam 2.5.0 (April 2007) ...
Giuseppe
2

Jelly ,  48 47 46  44 byte

-1 Terima kasih kepada Nick Kennedy

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

IVXLCDM113999 ) atau 0(jika tidak).

Cobalah online!Atau lihat test-suite .

Bagaimana?

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
Jonathan Allan
sumber
Tampaknya ada ruang yang berlebihan di baris pertama. Byte lain. Byte lain dapat disimpan dengan menggunakan baris pertama yang lebih sederhana. Cobalah online!
Nick Kennedy
Terima kasih, saya sudah menyimpan satu lagi dari itu.
Jonathan Allan
1

Perl 5 (-p ), 57 byte

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

TIO

  • menggunakan ekspresi reguler yang hampir sama kecuali {0,3} kuantifier diubah oleh*
  • &!/(.)\1{3}/ untuk memastikan karakter yang sama tidak dapat muncul 4 kali berturut-turut.
  • tidak dapat golfed dengan -/(.)\1{3}/karena akan memberikan -1untuk IIIIVImisalnya
Nahuel Fouilleul
sumber
1

Python 2 , 81 byte

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

Cobalah online!

Mari kita lihat bagian terakhir dari regex, yang cocok dengan angka Romawi hingga 9 (termasuk string kosong)

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

Ini memiliki dua alternatif yang dipisahkan oleh |:

  • V?I{,3}: Sebuah opsional Vdiikuti oleh hingga 3 I's. Ini cocok dengan string kosong I, II, III, V,VI , VII, VIII.
  • I[VX]: Sebuah Idiikuti oleh Vatau X. Ini cocokIV dan IX.

Hal yang sama dengan X,L,Cmencocokkan puluhan, denganC,D,M mencocokkan ratusan, dan akhirnya ^M{,3}memungkinkan hingga 3M (ribuan) di awal.

Saya mencoba membuat template untuk masing-masing trio karakter daripada menulisnya 3 kali, tapi ini jauh lebih lama.

Tidak
sumber
Tidak perlu ^jangkar di awal; matchsudah tersirat cocok dengan di awal string.
ShadowRanger
@ShadowRanger Terima kasih, saya menghapus ^.
xnor
Meskipun saya pikir Anda mengacaukan hitungan di edit; harus 83, bukan 81.
ShadowRanger
@ShadowRanger Hitungannya adalah 81 karena f=tidak termasuk dalam kode karena fungsi anonynomous diizinkan. Ini hanya untuk TIO.
xnor
1
Ah, masuk akal. Mengganggu tidak ada cara untuk mengaturnya untuk menyembunyikan itu di header atau footer, tapi ya, yang belum ditugaskan lambdaadalah legal, jadi metode terikat yang disusun untuk regex yang dikompilasi harus juga bagus.
ShadowRanger
1

Retina , 56 51 byte

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

Pelabuhan @NahuelFouilleul 's Perl 5 jawaban , jadi pastikan untuk mendukungnya!

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

(.)\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"
Kevin Cruijssen
sumber
1

05AB1E , 61 9 8 byte

ŽF¯L.XIå

Kekalahan -52 byte terimakasih untuk @Adnan , karena rupanya builtin Number Roman 05AB1E tidak didokumentasikan, haha ​​.. xD

Cobalah online atau verifikasi semua kasus uji .

Penjelasan:

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

Lihat tip tambang 05AB1E ini (bagian Cara mengompres bilangan bulat besar? ) Untuk memahami alasannyaŽF¯ adalah 3999.


Jawaban asli 61 byte:

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

Cobalah online atau verifikasi semua kasus uji .

Penjelasan:

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)

Lihat ini ujung 05AB1E saya (bagian Cara string kompres bukan bagian dari kamus? , Cara kompres bilangan bulat besar? , Dan Cara kompres bilangan bulat daftar? ) Untuk memahami mengapa:

  • •1∞Γ'иÛnuÞ\₂…• adalah 397940501547566186191992778
  • Ž8в adalah 2112
  • •1∞Γ'иÛnuÞ\₂…•Ž8вв adalah [1,11,111,12,2,21,211,2111,10]
  • .•6#&‘нδ• adalah "xivcxlmcd"
Kevin Cruijssen
sumber
1
Saya tidak yakin mengapa .Xtidak didokumentasikan, tetapi saya pikir ini harus berhasil:3999L.XQO
Adnan
@Adnan Haha, -52 byte di sana. Benar-benar lupa Anda memang memberi tahu kami tentang menambahkan Nomor Romawi builtin. Akan meminta @ Mr.Xcoder dalam obrolan untuk menambahkannya ke dokumen. Apakah ada perintah lain yang hilang? ;) PS: Menyimpan byte lain dengan mengompresi 3999. :)
Kevin Cruijssen
0

perl -MRegexp :: Common -pe, 34 byte

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

Bagian &!/(.)\1{3}/ini diperlukan, karena Regexp::Commonmemungkinkan empat (tetapi bukan lima) dari karakter yang sama berturut-turut. Dengan begitu, ini cocok dengan angka romawi yang digunakan pada tampilan jam, di mana IIIIsering digunakan untuk 4.


sumber
0

Python 3 , 116 113 109 107 105 106 byte

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)

Cobalah online!

-1 byte terima kasih kepada ShadowRanger

Mie9
sumber
2
Seperti yang saya sebutkan pada jawaban Py2, pimpinan ^ tidak perlu karena matchhanya cocok di awal string.
ShadowRanger
@ShadowRanger menambahkan jangkar saat debugging dan kemudian tidak mencoba lagi tanpa mereka. Saya akan mengingatnya sekarang - terima kasih! :)
Noodle9
Yah, hanya untuk menjadi jelas, trailing $diperlukan (hanya fullmatchmenyiratkan jangkar di kedua ujungnya, dan jelas itu akan menelan biaya lebih dari a $).
ShadowRanger
@ShadowRanger Ah! Itu menjelaskan mengapa saya membutuhkan jangkar! Tidak sadar saya hanya perlu berlabuh pada akhirnya. Terima kasih lagi.
Noodle9
0

Ruby , ( -n) 56 byte

p~/^M{,3}(D?C{,3}|CM|CD)(L?X{,3}|XC|XL)(V?I{,3}|IV|IX)$/

Cobalah online!

Output 0 (benar) atau nihil (falsy).

Pasang kembali Monica - notmaynard
sumber