ローマ数字に一致


19

チャレンジ

何らかの入力文字列が与えられ、1(= I)から3999(=MMMCMXCIX)のそれ以外の場合は偽値を返します。

詳細

  • 入力は、文字のみで構成される空でない文字列ですIVXLCDM
  • ローマ数字(このチャレンジでここで使用する)は、次のように定義されます。

次の記号のみを使用します。

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

文字列が実際に有効なローマ数字であるかを定義するには、それは会話のルールを提供するために、おそらく最も簡単である10進数を書き込むにはa3 a2 a1 a0(それぞれがどこai。一桁を表し例を表すためにそうするために792、我々は持っているa3=0, a2=7, a1=9, a0=2。)ローマ数字として、我々はそれを分解する十の力に。10のべき乗は、次のように記述できます。

      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

の最上位桁から左側から始めて、各桁が個別に表す数字を変換し、それらを連結できます。したがって、上記の例では、これは次のようになります。

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

したがって、のローマ数字は792ですDCCXCII。このチャレンジに関連するすべてのローマ数字の完全なリストは次のとおりです。OEISa006968.txt

真実の

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

偽り

MMIXVIII
IVX
IXV
MMMM
XXXVX
IVI
VIV


無効な入力のセットが大きいため、これが「サブセット」と見なされるとはまだ思いません。ここでのこの課題は、OEIS A006968
flawr

2
なぜMMMM無効なのですか?M <letter>の代わりに使用する5000の文字はありますか?
スカイラー

仕様を確認してください、そのような手紙はありません。使用される記号はのみI,V,X,L,C,D,Mです。
flawr

回答:


17

詳細、1362バイト

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

I範囲内の有効なローマ数字の出力I-MMMCMXCIXおよびNULLA(0)またはユーザー入力を通知する場合は、有効なローマ数字ではありません。


12
これが仕事に適したツールであるかどうかは判断できません。
Vaelus

5
これはどんな仕事にも適したツールですか?
omzrs

8

C#(Visual C#Interactive Compiler)79 109バイト

これは正規表現の課題のように思えますが、もっと短い解決策が見つかるはずです...

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

オンラインでお試しください!


あなたは短縮できませんでした{0,3}{,3}
flawr

@flawrはそのとき何もキャプチャしていないようです
Innat3

1
ああ、ごめんなさい、{5,}仕事のようなものだけ{,5}です。
flawr

2
代わりにコンパイラフラグとして追加できるので、72バイトであり、言語はこの回答のようにflag/u:System.Text.RegularExpressions.Regexを使用してC#(Visual C#Interactive Compiler)に変更する必要があります :)
Kevin Cruijssen

3
代替正規表現:^M?M?M?(C[MD]|D?C?C?C?)(X[CL]|L?X?X?X?)(I[XV]|V?I?I?I?)$。同じ長さですが、奇妙に見えます(これが目標ですよね)
無知の

8

Wolfram言語(Mathematica)、35バイト

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

オンラインでお試しください!

@attinatのおかげで5バイト節約

[1,3999]残念ながら、制限は7バイトかかります...
はここに任意のローマ数字のコードがあります

Wolfram言語(Mathematica)、28バイト

Check[FromRomanNumeral@#,F]&

オンラインでお試しください!

上記のコードは、[1,3999]だけでなく、任意の数で機能します


2
@ExpiredData「入力は、文字のみで構成される空でない文字列ですIVXLCDM。」
マトマンダン

35バイトBooleまたIf、その方法で使用するよりも(1バイト)短くなります。
attinat

8

CP-1610アセンブリ(Intellivision)、 52 ... 48  47 DECLE 1 = 59バイト

Perlを7年前よりも前のシステムで試してみましょう。:-)

R4のヌル終了文字列へのポインタを取得します。セットのゼロ入力が有効なローマ数字であるか、そうでない場合は、それをクリアした場合のフラグ。

                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

どうやって?

正規表現は#、入力文字列に存在しないことが保証されている無効な文字であれば、同じ構造を持つ4つのグループとして書き換えることができます。

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

最初のサフィックス基のNある主桁グループのN1。したがって、ペアmain_digit second_suffix )でパターンを保存できます(main_digit,second_suffix)のみでます。

このルーチンは、これらのパターンに従って文字ごとに入力文字列を解析し、最終的に文字列の最後に到達したかどうかをチェックします。

出力

出力

jzIntvのスクリーンショット


1. CP-1610オペコードは、「DECLE」として知られる10ビット値でエンコードされます。このルーチンは、4876ドルから始まり48A4ドル(含まれる)で終わる47 DECLEの長さです。


これは、小数のバイトは数少ない場所の一つではないでしょうしている有効な
ASCIIのみ

@ASCIIのみ私はかつてそう思っていましたが、確かにわかりません。これについての洞察については、この回答のコメント参照してください。
アーナルド

@ ASCIIのみまた、私はちょうど見つけたメタでこのポストを、それが全体のバイトにラウンドにおそらく最高です確認する傾向があります。
アーナルド

ああ、RAMにあるときはたった10ビットですか?
ASCIIのみ

プログラムはRAMに保存されることはなく、ROMにのみ保存されます。そのため、カートリッジで使用されるメモリチップに依存します。CPUは、10ビットまたは16ビットのROMにアクセスするように設計されています。「ROMW 10」ディレクティブは、コンパイラーにコードを10ビット形式で生成させます。
アーナルド

7

Java 8、70バイト

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

@ Innat3のC#回答のポートなので、必ず彼に投票してください!

オンラインでお試しください。

説明:

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

R74 71 56バイト

Rの組み込みでgrepを効果的に使用する方法を提案してくれた@ RobinRyder、@ Giuseppe、および@MickyTに感謝しas.romanます。

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

オンラインでお試しください!


as.romanとにかく動作しません、それ3899は何らかの理由でしか動作しないからです。
ジュゼッペ

おそらくローマ字では4000には明確な表現がないため、ドキュメントをよりよく読む必要があります。3900ではどうなりますか。パターンを固定します。
CTホール

@Giuseppe、対処、他の回答と同じ正規表現を使用。
CTホール

2
を使用して66バイトas.roman:最初にイニシャルがあるM場合は削除し、次に結果がであるかどうかを確認しas.roman(1:2999)ます。これには、入力がの場合の特別な処理が必要ですM
ロビンライダー

1
私の最後の質問は、一体誰がそれromansをRに入れるのに役立つものだと決めたのかということです。2.5.0(2007年4月)に追加されました...
ジュゼッペ


2

ゼリー 48 47 46  44バイト

-1ニック・ケネディのおかげ

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

IVXLCDM1139990

オンラインでお試しください!またはテストスイートを見る

どうやって?

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

最初の行に冗長スペースがあるようです。別のバイト。別のバイトは、より単純な最初の行を使用して保存できます。オンラインでお試しください!
ニックケネディ

おかげで、もう1つ保存できました。
ジョナサンアラン

1

Perl 5(-p)、57バイト

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

TIO

  • を除いてほぼ同じ正規表現を使用します {0,3}数量詞が変更されたこと*
  • &!/(.)\1{3}/ 同じ文字が連続して4回出現しないようにします。
  • golfedすることはできません-/(.)\1{3}/与えるため-1のためにIIIIVI例えば

1

Python 2、81バイト

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

オンラインでお試しください!

正規表現の最後の部分を見てみましょう。9までのローマ数字に一致します(空の文字列を含む)

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

これには、次の2つの選択肢があり|ます。

  • V?I{,3}:オプションのV後に最大3個I。これは、空の文字列にマッチしIIIIIIVVIVIIVIII
  • I[VX]:のI後にVorが続きXます。これは一致しますIVIXます。

X,L,C十のマッチングと同じこと、とC,D,M 100の、および最終的に開始時に^M{,3}最大3 M桁(数千)の。

私は、3回文字を書くのではなく、文字のトリオごとにテンプレートを生成しようとしましたが、これはかなり長くなりました。


^最初はアンカーは不要です。match文字列の先頭で一致することをすでに暗示しています。
ShadowRanger

@ShadowRangerありがとう^
xnor

編集でカウントを台無しにしたと思いますが、81 83、いないする必要があります
ShadowRanger

@ShadowRanger f=匿名関数が許可されているため、コードに含まれていないため、カウントは81 です。TIO専用です。
xnor

1
ああ、理にかなっています。それを整理してヘッダーやフッターに隠す方法はありませんが、割り当てられていないlambdasは合法なので、コンパイルされた正規表現の割り当てられていないバインドされたメソッドも適切です。
ShadowRanger

1

網膜56 51バイト

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

@NahuelFouilleulのPerl 5回答のポートので、必ず彼してください!

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

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

05AB1E61 9 8バイト

ŽF¯L.XIå

なんと -52バイト おかげで @Adnanので、明らかに05AB1Eのローマ数字のビルトインは文書化されていなかったので、ハハ.. xD

オンラインで試すたり、すべてのテストケースを確認してください

説明:

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

この05AB1Eのヒント(大きな整数を圧縮する方法は?を参照して、理由を理解してくださいŽF¯3999


元の61バイトの回答:

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

オンラインで試すたり、すべてのテストケースを確認してください

説明:

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)

鉱山(セクションのこの05AB1E先を参照してくださいどのように圧縮文字列にない辞書の一部を??大きな整数を圧縮する方法、およびどのようにリストの整数圧縮方法は?理由を理解します:

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

1
なぜ私はわからない.X:文書化され、私は、これは動作するはずだと思うされていません3999L.XQO
アドナン・

@Adnan Haha、-52バイトです。ローマ数字のビルトインを追加することについて、あなたが本当に私たちに語ったことを完全に忘れました。チャットで@ Mr.Xcoderにドキュメントに追加するよう依頼します。他のコマンドがありませんか?;)PS:を圧縮して別のバイトを保存しました3999。:)
ケビン・クルーッセン

0

perl -MRegexp :: Common -pe、34バイト

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

同じ文字を4つ(5つではなく)連続して使用できる&!/(.)\1{3}/ため、この部分が必要Regexp::Commonです。これにより、IIII4でよく使用される文字盤で使用されるローマ数字と一致します。


0

Pythonの3116の 113 109 107 105 106バイト

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)

オンラインでお試しください!

ShadowRangerのおかげで-1バイト


2
Py2の回答で述べたように、文字列の先頭でのみ一致する^ ため、先頭は不要matchです。
ShadowRanger

@ShadowRangerは、デバッグ中にアンカーを追加し、アンカーなしで再試行しませんでした。私は今それを覚えています-ありがとう!:)
Noodle9

わかりやすくする$ために、トレーリングが必要です(fullmatch両端のアンカーのみを意味し、明らかにを超えるコストがかかります$)。
ShadowRanger

@ShadowRangerああ!これがなぜアンカーが必要なのかを説明しています!終わりを固定するだけでいいことに気づかなかった。再度、感謝します。
Noodle9

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.