Вызов
Для некоторой входной строки верните истинное значение, если оно представляет собой правильную римскую цифру от 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)
Falsey
MMIXVIII
IVX
IXV
MMMM
XXXVX
IVI
VIV
MMMM
недействителен? Есть ли буква за 5000, которую следует использовать вместо М <буква>?I,V,X,L,C,D,M
.Ответы:
Подробный , 1362 байта
Выходные данные
I
для действительных римских цифр в диапазонеI-MMMCMXCIX
иNULLA
(0) или информирует, что пользовательский ввод не является действительным римским числом в противном случае.источник
C # (интерактивный компилятор Visual C #) ,
79109 байтЭто похоже на вызов Regex, я уверен, что можно найти более короткое решение ...
Попробуйте онлайн!
источник
{0,3}
до{,3}
?{5,}
работа, но нет{,5}
./u:System.Text.RegularExpressions.Regex
, как этот ответ :)^M?M?M?(C[MD]|D?C?C?C?)(X[CL]|L?X?X?X?)(I[XV]|V?I?I?I?)$
. Та же длина, но выглядит страннее (какая цель, верно?)Wolfram Language (Mathematica) , 35 байт
Попробуйте онлайн!
5 байтов сохранено благодаря @attinat
ограничение
[1,3999]
неудачников стоит 7 байт ...вот код для любого римского номера
Wolfram Language (Mathematica) , 28 байт
Попробуйте онлайн!
приведенный выше код работает для любого числа, а не только для [1,3999]
источник
IVXLCDM
."Boole
также короче (на один байт), чем при использованииIf
таким образом.Сборка CP-1610 ( Intellivision ),
52 ... 4847 DECLEs 1 = 59 байтДавайте попробуем это на системе, которая предшествует Perl на хорошие 7 лет. :-)
Принимает указатель на завершающуюся нулем строку в R4 . Устанавливает флаг Zero, если ввод является действительным римским числом, или очищает его в противном случае.
Как?
Регулярное выражение может быть переписано как 4 группы с одинаковой структурой, при условии, что
#
это любой недопустимый символ, который гарантированно не будет присутствовать во входной строке.Наша подпрограмма пытается проанализировать входную строку символ за символом в соответствии с этими шаблонами и в конечном итоге проверяет, достигнут ли конец строки.
Выход
скриншот jzIntv
1. Код операции CP-1610 кодируется 10-битным значением, известным как «DECLE». Эта процедура составляет 47 DECLE, начиная с 4876 долларов и заканчивая 48A4 (в комплекте).
источник
Java 8, 70 байт
Port of @ Innat3 's C # answer , так что не забудьте его поддержать!
Попробуйте онлайн.
Объяснение:
источник
Р ,
747156 байтБлагодаря @RobinRyder, @Giuseppe, и @MickyT за их предложения , как эффективно использовать Grep с R, построенный в
as.roman
.Попробуйте онлайн!
источник
as.roman
не будет работать в любом случае, так как это работает только по3899
какой-то причине.as.roman
: сначала удалите начальный,M
если он есть, затем проверьте, есть ли результатas.roman(1:2999)
. Это требует специальной обработки случая, когда вводM
.romans
это было бы полезно поместить в R ??? Это было добавлено в 2.5.0 (апрель 2007) ...Wolfram Language (Mathematica) , 32 байта
Попробуйте онлайн!
источник
Желе ,
48 47 4644 байта-1 спасибо Нику Кеннеди
IVXLCDM
1
0
Попробуйте онлайн! Или посмотрите набор тестов .
Как?
источник
Perl 5 (
-p
), 57 байтTIO
{0,3}
квантификатор был изменен*
&!/(.)\1{3}/
чтобы один и тот же символ не появлялся 4 раза подряд.-/(.)\1{3}/
потому что даст-1
дляIIIIVI
, например ,источник
Python 2 , 81 байт
Попробуйте онлайн!
Давайте посмотрим на последнюю часть регулярного выражения, которая соответствует римским цифрам до 9 (включая пустую строку)
Это имеет две альтернативы, разделенные
|
:V?I{,3}
: ОпциональноV
до 3I
-х. Это соответствует пустой строкеI
,II
,III
,V
,VI
,VII
,VIII
.I[VX]
: AnI
СопровождаетсяV
или илиX
. Это соответствуетIV
иIX
.То же самое с
X,L,C
совпадением десятков,C,D,M
совпадением сотен и, наконец,^M{,3}
позволяет до 3M
-х (тысяч) в начале.Я пытался сгенерировать шаблон для каждого трио персонажей, а не писать его 3 раза, но это было намного дольше.
источник
^
якоре в начале;match
уже подразумевает, что это совпадает в начале строки.^
.f=
он не включен в код, поскольку разрешены анонимные функции. Это только для TIO.lambda
s являются законными, поэтому неназначенные связанные методы скомпилированного регулярного выражения тоже должны быть хорошими.Retina ,
5651 байтПорт @NahuelFouilleul 's Perl 5 answer , так что обязательно проголосуйте за него!
Попробуйте онлайн илипроверьте все контрольные примеры .
Объяснение:
источник
05AB1E ,
6198 байтовогромный-52 байта спасибо @Adnan , потому что, очевидно, встроенный римский номер 05AB1E не был задокументирован, хаха .. xD
Попробуйте онлайн или проверьте все тесты .
Объяснение:
Посмотрите эту подсказку 05AB1E (раздел Как сжать большие целые числа? ), Чтобы понять, почему
ŽF¯
это так3999
.Оригинальный 61-байтовый ответ:
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Смотрите этот 05AB1E наконечник шахты (разделы Как сжать строки не часть словаря? , Как сжать большие целые числа? , И как сжать целые списки? ) Чтобы понять, почему:
•1∞Γ'иÛnuÞ\₂…•
является397940501547566186191992778
Ž8в
является2112
•1∞Γ'иÛnuÞ\₂…•Ž8вв
является[1,11,111,12,2,21,211,2111,10]
.•6#&‘нδ•
является"xivcxlmcd"
источник
.X
это не задокументировано, но я думаю, что это должно работать:3999L.XQO
3999
. :)perl -MRegexp :: Common -pe, 34 байта
Эта
&!/(.)\1{3}/
часть необходима, потому чтоRegexp::Common
допускает четыре (но не пять) одинаковых символов подряд. Таким образом, он соответствует римским числам, используемым на циферблатах, гдеIIII
часто используется для 4.источник
Python 3 ,
116113109107105106 байтПопробуйте онлайн!
-1 байт благодаря ShadowRanger
источник
^
необходимости, поскольку онmatch
совпадает только с началом строки.$
необходим (fullmatch
подразумеваются только якоря на обоих концах, и, очевидно, это будет стоить больше, чем a$
).Ruby , (
-n
) 56 байтПопробуйте онлайн!
Выходы 0 (правда) или ноль (ложь).
источник