Збігайте римські цифри


19

Виклик

З огляду на деякий вхідний рядок, поверніть значення truthy, якщо воно являє собою правильну римську цифру між 1 (= I) та 3999 (= MMMCMXCIX), а значення фальси - в іншому випадку.

Деталі

  • Вхід - це не порожній рядок, який містить лише символи IVXLCDM.
  • Римські цифри (які ми тут використовуємо в цьому виклику) визначаються наступним чином:

Ми використовуємо лише такі символи:

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

Щоб визначити, які рядки є дійсно дійсними римськими цифрами, мабуть, найпростіше надати правило розмови: написати десятковий номер a3 a2 a1 a0(де кожен aiпредставляє одну цифру. Так, наприклад, щоб представити у 792нас є a3=0, a2=7, a1=9, a0=2.) Як римську цифру, ми розкладаємо його в силу десятків. Різні сили десяти можна записати так:

      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. Ось повний перелік усіх римських цифр, які стосуються цього завдання: OEIS a006968.txt

Приклади

Truthy

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

Фальсі

MMIXVIII
IVX
IXV
MMMM
XXXVX
IVI
VIV


Я все ще не думаю, що це кваліфікується як "підмножина", оскільки набір недійсних входів більший. Ця проблема тут стосується лише "добре" визначених номерів, які використовуються в OEIS A006968
недолік

2
Чому MMMMнедійсний? Чи є лист на 5000, який слід використовувати замість M <letter>?
Skyler

Перевірте специфікації, такого листа немає. Єдині використовувані символи - це I,V,X,L,C,D,M.
недолік

Відповіді:


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
Я не можу вирішити, чи це правильний інструмент для роботи чи ні.
Ваелюс

5
Це правильний інструмент для будь-якої роботи?
omzrs

8

C # (Visual C # Interactive Compiler) , 79 109 байт

Це здається проблемою Regex, я впевнений, що коротше рішення можна знайти ...

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 тоді нічого не захоплює
Innat3

1
Ах вибачте, тільки такі речі, як {5,}робота, але ні {,5}.
недолік

2
Ви можете замість цього додати його як прапор компілятора, так що це 72 байти, а мову слід змінити на C # (Visual C # Interactive Compiler) з прапором/u:System.Text.RegularExpressions.Regex , як ця відповідь :)
Kevin Cruijssen

3
Alternate регулярний вираз: ^M?M?M?(C[MD]|D?C?C?C?)(X[CL]|L?X?X?X?)(I[XV]|V?I?I?I?)$. Така ж довжина, але виглядає дивніше (яка мета, правда?)
Втілення Незнання

8

Мова Вольфрама (Mathematica) , 35 байт

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

Спробуйте в Інтернеті!

5 байт збережено, завдяки @attinat

обмеження [1,3999]на жаль коштує 7 байт ...
ось код для будь-якого римського числа

Мова Вольфрама (Mathematica) , 28 байт

Check[FromRomanNumeral@#,F]&

Спробуйте в Інтернеті!

вищевказаний код працює для будь-якого числа, а не лише [1,3999]


2
@ExpiredData "Вхід - це не порожній рядок, який містить лише символи IVXLCDM."
mathmandan

35 байт . Booleтакож коротше (на один байт), ніж використання Ifтаким чином.
attinat

8

Збірка CP-1610 ( Intellivision ),  52 ... 48  47 DECLEs 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

NN1(main_digit,second_suffix)

Наша звичайна спроба проаналізувати вхідний рядок символу за символами відповідно до цих шаблонів і врешті перевіряє, чи досягнуто кінця рядка.

Вихідні дані

вихід

скріншот jzIntv


1. Оптокод CP-1610 кодується з 10-бітовим значенням, відомим як "DECLE". Ця процедура триває 47 DECLE, починаючи з $ 4876 і закінчуючи $ 48A4 (включно).


НЕ буде чи це один з небагатьох місць , де дробові байти є дійсними
ASCII-тільки

@ ASCII-тільки я раніше так думав, але не знаю точно. Дивіться коментарі цієї відповіді, щоб дізнатися про це.
Арнольд

@ ASCII-тільки Крім того, я щойно знайшов цю публікацію в мета, яка прагне підтвердити, що, мабуть, найкраще округлювати цілі байти.
Арнольд

ах, значить, це лише 10 біт, коли він знаходиться в оперативній пам'яті?
Лише ASCII

Програма ніколи не зберігається в ОЗУ, тільки в ПЗУ. Тож це залежить від мікросхем пам'яті, які використовуються в картриджі. Процесор призначений для доступу до 10-бітового або 16-бітного ПЗУ. Директива "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 «s C # відповіді , тому переконайтеся , що upvote його!

Спробуйте в Інтернеті.

Пояснення:

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 байт

Завдяки @RobinRyder, @Giuseppe, і @MickyT для їх пропозицій , як ефективно використовувати Grep з R, побудований в as.roman.

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

Спробуйте в Інтернеті!


as.romanвсе одно не працюватиме, оскільки працює лише з 3899якихось причин.
Джузеппе

Я дійсно повинен краще прочитати документацію. Мабуть, тому, що 4000 не має чіткого представлення на романській мові, так як би зробити 3900. Це схоже на 390, і тепер я просто знайшов проблему зі своєю греппією, куди мені потрібно було б закріпити візерунок.
Зал КТ

@Giuseppe, адресований, використовуючи той самий регулярний вираз, що й інші відповіді.
Зал КТ

2
66 байт, використовуючи as.roman: спочатку Mзніміть початковий, якщо такий є, а потім перевірте, чи є результат as.roman(1:2999). Це вимагає спеціального опрацювання справи, де знаходиться вхід M.
Робін Райдер

1
Моє останнє питання - хто, до біса, вирішив, що romansбуло б корисно вкласти в R ??? Додано в 2.5.0 (квітень 2007 р.) ...
Джузеппе


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

Perl 5 ( -p), 57 байт

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

ТІО

  • використовує майже той самий регулярний вираз, за ​​винятком того, що {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]

Це дві варіанти, розділені |:

  • V?I{,3}: Необов’язково V, до якого слід до 3 I's. Це відповідає порожній рядку I, II, III, V, VI, VII, VIII.
  • I[VX]: Після Iцього Vабо X. Це відповідає IVі IX.

Те саме, що X,L,Cвідповідає десяткам, C,D,Mзбігається з сотнями, і, нарешті, ^M{,3}дозволяє до початку 3 M(тисячі).

Я спробував створити шаблон для кожного тріо символів, а не писати його 3 рази, але це було набагато довше.


Немає необхідності в ^якірі на початку; matchвже має на увазі, що він збігається на початку рядка.
ShadowRanger

@ShadowRanger Спасибі, я видалив ^.
xnor

Хоча я думаю, що ви заплуталися в підрахунку в редагуванні; має бути 83, а не 81.
ShadowRanger

@ShadowRanger Кількість становить 81, оскільки f=вона не включена в код, оскільки дозволені анонімні функції. Це просто для 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

05AB1E , 61 9 8 байт

ŽF¯L.XIå

-52 bytes @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 :: Загальний -pe, 34 байти

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

&!/(.)\1{3}/Частина необхідно, тому що Regexp::Commonдозволяє чотири (але не п'ять) однакових символів в рядку. Таким чином, він відповідає римським цифрам, які використовуються на обличчях годин, де IIIIчасто використовується для 4.


0

Python 3 , 116 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)

Спробуйте в Інтернеті!

-1 байт завдяки ShadowRanger


2
Як я вже згадував у відповіді Py2, ведучий ^ є непотрібним, оскільки вже відповідає matchлише на початку рядка.
ShadowRanger

@ShadowRanger додав якорі під час налагодження, а потім не намагався повторити без них. Я зараз це пам’ятаю - дякую! :)
Noodle9

Ну, просто для того, щоб бути зрозумілим, трейлінг $необхідний ( fullmatchмається на увазі якорі на обох кінцях, і очевидно, що це коштуватиме більше, ніж а $).
ShadowRanger

@ShadowRanger Ах! Це пояснює, чому мені потрібні були якіри! Я не усвідомлював, що мені потрібно лише закріпити кінець. Знову дякую.
Noodle9

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.