Romen Rakamlarını Eşleştir


19

Meydan okuma

Bazı giriş dizeleri verildiğinde, 1 (= I) ve 3999 (= MMMCMXCIX) arasında doğru bir romen rakamını ve aksi takdirde bir falsey değerini temsil ediyorsa bir doğruluk değeri döndürün .

ayrıntılar

  • Giriş, yalnızca karakterlerden oluşan boş olmayan bir dizedir IVXLCDM.
  • Romen rakamları (burada bu mücadelede kullandığımız) aşağıdaki gibi tanımlanmıştır:

Sadece aşağıdaki sembolleri kullanıyoruz:

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

Dizeleri aslında geçerli romen rakamları hangi tanımlamak için, bu konuşmanın kural sağlamak muhtemelen en kolay: Bir ondalık sayı yazmak için a3 a2 a1 a0(her yerde ai. Bir basamağı temsil eder örnek temsil etmek Yani için 792elimizde a3=0, a2=7, a1=9, a0=2.) Bir roma rakamlarına, bunu ayrıştırmak onlarca gücüne. On farklı güç aşağıdaki gibi yazılabilir:

      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

Sol taraftan en önemli basamağıyla başlayarak, her basamağın ayrı ayrı temsil ettiği sayıyı dönüştürebilir ve birleştirebiliriz. Yani yukarıdaki örnek için bu şöyle görünecektir:

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

Bu nedenle için Roma rakamı 792olduğunu DCCXCII. Bu meydan okuma ile ilgili tüm romen rakamlarının tam listesi: OEIS a006968.txt

Örnekler

Doğru

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

Falsey

MMIXVIII
IVX
IXV
MMMM
XXXVX
IVI
VIV


Geçersiz girişler kümesi daha büyük olduğu için bunun bir "alt küme" olarak nitelendirdiğini hala sanmıyorum. Burada bu meydan okuma sadece OEIS A006968
flawr

2
Neden MMMMgeçersiz? Bunun yerine M <letter> için kullanılması gereken 5000 için bir mektup var mı?
Skyler

Teknik özelliklere bakın, böyle bir mektup yok. Kullanılan tek semboller I,V,X,L,C,D,M.
flawr

Yanıtlar:


17

Ayrıntılı , 1362 bayt

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

Çıkışlar Iaralığında geçerli romen rakamları için I-MMMCMXCIXve NULLA(0) veya bilgi verir kullanıcı girişi aksi geçerli bir Roma rakamı değil.


12
Bunun iş için doğru araç olup olmadığına karar veremiyorum.
Vaelus

5
Bu herhangi bir iş için doğru araç mı?
omzrs

8

C # (Visual C # Etkileşimli derleyicisi) , 79 109 bayt

Bu bir Regex meydan okuma gibi görünüyor, eminim daha kısa bir çözüm bulunabilir ...

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

Çevrimiçi deneyin!


Eğer kısaltmak edilemedi {0,3}için {,3}?
flawr

@flawr o zaman hiçbir şey yakalamak gibi görünmüyor
Innat3

1
Ah üzgünüm, sadece {5,}iş gibi şeyler , ama değil {,5}.
flawr

2
Bunun yerine derleyici bayrağı olarak ekleyebilirsiniz, bu yüzden 72 bayttır ve dil bu cevap gibi bayrakla C # (Visual C # Etkileşimli Derleyici)/u:System.Text.RegularExpressions.Regex olarak değiştirilmelidir :)
Kevin Cruijssen

3
Alternatif regex: ^M?M?M?(C[MD]|D?C?C?C?)(X[CL]|L?X?X?X?)(I[XV]|V?I?I?I?)$. Aynı uzunlukta, ama garip görünüyor (amaç bu, değil mi?)
Cehalet Tıbbı

8

Wolfram Dili (Mathematica) , 35 bayt

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

Çevrimiçi deneyin!

@Attinat sayesinde 5 bayt kaydedildi

sınırlama [1,3999]talihsizlik 7 bayt maliyeti ...
İşte herhangi bir Roma numarasının kodu

Wolfram Dili (Mathematica) , 28 bayt

Check[FromRomanNumeral@#,F]&

Çevrimiçi deneyin!

yukarıdaki kod sadece [1.3999] için değil, herhangi bir sayı için çalışır


2
@ExpiredData "Giriş, yalnızca karakterlerden oluşan boş olmayan bir dizedir IVXLCDM."
mathmandan

35 bayt . Booleaynı zamanda kullanmaktan daha kısadır (bir bayt) If.
attinat

8

CP-1610 montajı ( Intellivision ),  52 ... 48  47 DECLEs 1 = 59 bayt

Bunu Perl'i iyi bir 7 yıl öncesine dayanan bir sistemde deneyelim. :-)

R4'te boş bir sonlandırılmış dizeye işaretçi alır . Giriş geçerli bir Romen rakamıysa Sıfır bayrağını ayarlar veya aksi halde temizler.

                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

Nasıl?

Normal ifade #, giriş dizesinde bulunmadığı garanti edilen geçersiz bir karakter olması koşuluyla, aynı yapıya sahip 4 grup olarak yeniden yazılabilir .

                 +-------+---> 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 giriş dizgisini bu kalıplara göre karakter karakter ayrıştırma girişiminde bulunur ve sonunda dizenin sonuna ulaşılıp ulaşılmadığını kontrol eder.

Çıktı

çıktı

jzIntv ekran görüntüsü


1. CP-1610 op kodu, 'DECLE' olarak bilinen 10 bitlik bir değerle kodlanmıştır. Bu rutin 47 DECLE uzunluğunda, 4876 dolardan başlayıp 48A4 dolardan (dahil) sona erecek.


Bu fraksiyonel bayt birkaç yerden biri olmaz olan geçerli
ASCII sadece

@ ASCII-sadece böyle düşünürdüm, ama kesin olarak bilmiyorum. Bununla ilgili bazı bilgiler için bu cevabın yorumlarına bakın .
Arnauld

@ ASCII-only Ayrıca, bu gönderiyi tüm baytlara yuvarlamanın muhtemelen en iyi olduğunu onaylama eğilimi gösteren meta olarak buldum .
Arnauld

ah, yani RAM'de sadece 10 bit mi?
Sadece ASCII

Program asla RAM'de saklanmaz, sadece ROM'da saklanır. Bu nedenle kartuşta kullanılan bellek yongalarına bağlıdır. CPU, 10 bit veya 16 bit ROM'a erişmek için tasarlanmıştır. "ROMW 10" yönergesi, derleyiciyi 10 bit biçiminde kod üretmeye zorlar.
Arnauld

7

Java 8, 70 bayt

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 kullanıcısının C # yanıtı , bu yüzden onu onayladığınızdan emin olun!

Çevrimiçi deneyin.

Açıklama:

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 bayt

@RobinRyder, @Giuseppe & @MickyT sayesinde grep'in yerleşik R'lerle nasıl etkili bir şekilde kullanılacağına dair önerileri için teşekkürler as.roman.

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

Çevrimiçi deneyin!


as.romanzaten çalışmayacak, çünkü sadece 3899bir sebepten dolayı işe yarıyor .
Giuseppe

Belgeleri daha iyi okumalıyım, Muhtemelen 4000'in Roma'da kesin bir temsili olmadığı için, bu yüzden 3900'ü nasıl yapacaktım. Bu 390'a benzer ve şimdi sadece grep'imle ilgili bir sorun buldum deseni sabitleyin.
CT Salonu

@ Giuseppe, diğer cevaplarla aynı normal ifadeyi kullanarak hitap etti.
CT Salonu

2
66 bayt kullanarak as.roman: önce Mbir tane varsa ilk satırı soyun , ardından sonucun olup olmadığını kontrol edin as.roman(1:2999). Bu, girişin olduğu davanın özel olarak ele alınmasını gerektirir M.
Robin Ryder

1
Son sorum şu ki, kim romansbunu R içine koymak için yararlı bir şey olacağını karar verdi ??? 2.5.0 (Nisan 2007) içinde eklendi ...
Giuseppe


2

Jöle ,  48 47 46  44 bayt

-1 Nick Kennedy sayesinde

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

IVXLCDM1139990

Çevrimiçi deneyin! Veya test takımına bakın .

Nasıl?

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

İlk satırda fazladan bir alan var gibi görünüyor. Başka bir bayt. Başka bir bayt daha basit bir ilk satır kullanılarak kaydedilebilir. Çevrimiçi deneyin!
Nick Kennedy

Teşekkürler, bir tane daha kurtardım.
Jonathan Allan

1

Perl 5 ( -p), 57 bayt

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

TIO

  • {0,3}niceleyici tarafından değiştirilmedikçe neredeyse aynı normal ifadeyi kullanır*
  • &!/(.)\1{3}/ Aynı karakterin arka arkaya 4 kez oluşmamasını sağlamak için.
  • ile golfed edilemez -/(.)\1{3}/verecekti çünkü -1için IIIIVIörneğin

1

Python 2 , 81 bayt

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

Çevrimiçi deneyin!

Regex'in 9'a kadar Romen rakamlarıyla eşleşen (boş dize dahil) son bölümüne bakalım.

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

Bunun birbirinden ayrı iki alternatifi var | :

  • V?I{,3}: İsteğe bağlı Volarak 3'e kadar I. Bu maçları boş dize I, II, III, V, VI,VII , VIII.
  • I[VX]: A Iardından a Vveya X. Bu eşleşiyorIV ve ileIX .

Aynı şey X,L,Conlarca,C,D,M , yüzlerce eşleşir ve nihayet başlangıçta ^M{,3}3'e M(binlerce) kadar izin verir .

3 kez yazmak yerine her bir karakter üçlüsü için şablon oluşturmayı denedim, ama bu çok daha uzundu.


^Başlangıçta çapa gerek yok ; matchzaten dizenin başında eşleştiğini ima eder.
ShadowRanger

@ShadowRanger Teşekkürler, kaldırdım ^.
xnor

Düzenlemedeki sayımı berbat ettiğinizi düşünüyorum; 81 değil, 83 olmalıdır.
ShadowRanger

@ShadowRanger f=Anonim işlevlere izin verildiğinden kodda yer almadığı için sayı 81'dir. Sadece TIO için.
xnor

1
Ah, mantıklı. Sinir bozucu, bunu üstbilgi veya altbilgide gizlemek için organize etmenin bir yolu yoktur, ancak evet, atanmamış lambdas yasaldır, bu nedenle derlenmiş normal ifadenin atanmamış bağlı yöntemleri de iyi olmalıdır.
ShadowRanger

1

Retina , 56 51 bayt

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

Bağlantı noktası @NahuelFouilleul Perl 5 cevap , bu yüzden onu onayladığınızdan emin olun!

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

(.)\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 bayt

ŽF¯L.XIå

-52 bayt sayesinde @Adnan görünüşte 05AB1E Roman Numarası yerleşik haha, belgelenmiş değildi çünkü .., xD

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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

Neden ŽF¯olduğunu anlamak için bu 05AB1E ucuma bakın ( Büyük tamsayılar nasıl sıkıştırılır? Bölümü )3999 .


Orijinal 61 bayt cevap:

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

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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)

Benim bu 05AB1E ucu bakın (bölümler Nasıl sözlük kompres dizeleri değil parçası? , Geniş tamsayılar sıkıştırmak için nasıl? Ve kompres tamsayı listelerine nasıl? ) Anlamak için:

  • •1∞Γ'иÛnuÞ\₂…• dır-dir 397940501547566186191992778
  • Ž8в dır-dir 2112
  • •1∞Γ'иÛnuÞ\₂…•Ž8вв dır-dir [1,11,111,12,2,21,211,2111,10]
  • .•6#&‘нδ• dır-dir "xivcxlmcd"

1
Neden .Xbelgelenmediğinden emin değilim , ama bunun işe yarayacağını düşünüyorum:3999L.XQO
Adnan

@Adnan Haha, -52 bayt orada. Gerçekten bir Roma Numarası yerleşik eklemek hakkında bize söyledi unuttum. Sohbet sırasında @ Mr.Xcoder'dan dokümanlara eklemesini isteyecek. Başka komutlar eksik mi? ;) PS: Sıkıştırarak başka bir bayt sakladı 3999. :)
Kevin Cruijssen

0

perl -MRegexp :: Ortak -pe, 34 bayt

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

&!/(.)\1{3}/Çünkü parçası gereklidir Regexp::Commonüst üste aynı karakterlerin dört (ancak beş) verir. Bu şekilde, saat yüzlerinde IIIIkullanılan ve 4 için sıklıkla kullanılan roma rakamlarıyla eşleşir .


0

Python 3 , 116 113 109 107 105 106 bayt

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)

Çevrimiçi deneyin!

ShadowRanger sayesinde -1 bayt


2
Py2 cevabında bahsettiğim gibi, lider zaten ^ gereksizdir, çünkü matchsadece bir dizenin başında eşleşir.
ShadowRanger

@ShadowRanger hata ayıklama sırasında çapa ekledi ve onlarsız tekrar denemedi. Bunu şimdi hatırlayacağım - teşekkürler! :)
Noodle9

Açık olmak $gerekirse , sondaki iz gereklidir (sadece fullmatchher iki uçta çapa anlamına gelir ve açıkçası bu a'dan daha pahalıya mal olur $).
ShadowRanger

@ShadowRanger Ah! Bu neden çapa ihtiyacım olduğunu açıklıyor! Sadece sonunu tutturmam gerektiğini fark etmedim. Tekrar teşekkürler.
Erişte9

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.