Фон
Этот вызов вдохновлен этим сайтом, на котором опубликована следующая диаграмма:
Эта диаграмма показывает нам, что самое длинное римское числовое выражение до 250 - это 188, для выражения которого требуется 9 цифр.
Вызов
Стандартные символы , используемые для выражения наиболее римские цифры являются следующие: { I
, V
, X
, L
, C
, D
, M
}, где числовые значения характеров являются M
= 1000, D
= 500, C
= 100, L
= 50, X
= 10, V
= 5, I
= 1.
В этой задаче ваша цель состоит в том, чтобы, учитывая положительное целое число n , вычислить количество действительных представлений римских цифр, которые можно составить путем объединения n стандартных символов.
Затем ваша программа должна вывести результат этого вычисления!
Входные данные : положительное целое число n .
Выходные данные : количество действительных римских числовых выражений длины n .
Правила для римских числительных выражений
Римские цифры изначально имели только «аддитивное» спаривание, то есть цифры всегда записывались в порядке убывания, а сумма значений всех чисел была значением числа.
Позже, вычитание спаривания, использование размещения меньшего числа перед большим, чтобы вычесть меньшее из большего, стало обычным делом для сокращения выражений римскими цифрами. Субтрактивные пары не могут быть соединены, как показано в следующем недействительных выражение: IXL
.
Ниже приведены современные правила дня для аддитивного и вычитающего спаривания.
- Только один I, X и C может использоваться в качестве начального числа в части вычитающей пары.
- Я могу быть помещен перед V или X только в вычитающей паре.
- X может быть помещен только перед L или C в вычитающей паре.
- C может быть помещен только перед D или M в вычитающей паре.
- За исключением вычитающих пар, цифры должны быть в порядке убывания (это означает, что если вы отбросите ведущую цифру каждой вычитающей пары, то цифры будут в порядке убывания).
- М, С и Х не могут быть равны или превышены меньшими номиналами.
- D, L и V могут появляться только один раз.
- Только М можно повторить 4 или более раз.
Дальнейшие заметки
Мы не будем использовать штриховую нотацию; скорее мы просто добавим больше M s, чтобы выразить любое число.
Это единственные правила, которым мы будем следовать для наших римских цифр. Это означает, что нечетные выражения, такие как
IVI
, также будут считаться действительными в нашей системе.Также помните, что мы не учитываем количество чисел, имеющих выражения длины n , поскольку некоторые числа имеют несколько выражений. Вместо этого мы рассчитываем только количество допустимых выражений.
Тестовые случаи
1
→ 7
2
→ 31
3
→ 105
Я проверил вышеупомянутое вручную, поэтому, пожалуйста, не забудьте перепроверить контрольные примеры и добавить больше, если можете!
Критерии победы
Это испытание для игры в гольф , так что веселитесь! Я принимаю только те решения, которые могут обрабатывать как минимум 1 - 9 входных данных. Больше бонусов!
редактировать
В соответствии с запросом комментаторов, найдите ниже, или по этой ссылке, 105 комбинаций, которые я посчитал для n = 3
III IVI IXI IXV IXX VII XII XIV XIX XVI XXI XXV XXX XLI XLV XLX XCI XCX XCL XCL XCC LII LIV LIX LIX LVI LXI LXV LXX CII CIV CIX CIX CVI CXI CXV CXX CXL CXC CLI CLV CDX CDI CDV CDX CCX CCX CCL CCL CCL CCL CMI CMV CMX CML CMC CMD CMM DII DIV DIX DVI DXI DXV DXX DXL DXC DLI DLV DLX DLX DCI DCV DCX DCL DCC MII MIV MIX MIX MXI MXI MXV MXX MXX MXL MXC MLI MLV MLX MCI MCV MCX MCL MCL MDL MDV MDI MDV MDC MDI MDC MDC MDC MDI MDC MDC MDC MDI MDI MDC MDI MDI MDC MDI MDI MDM MDM MDM MDM MDM MDM MDI MDX MMX MML MMC MMD MMM
Изменить 2:
Используйте следующий код , не относящийся к гольфу , любезно предоставленный Джонатаном Алланом, чтобы проверить ваши результаты.
Изменить 3:
Я прошу прощения за все ошибки в этом вызове. Я обязательно сделаю лучшую работу в следующий раз!
источник
Ответы:
Сетчатка , 111 байт
Попробуйте онлайн! Это полностью переписан , как я неправильно понял Правило 1. иметь в виду , что вы можете использовать только по одному из Субтрактивные
I
,X
иC
. Объяснение: Первая часть скрипта расширяет ввод в строкуCM
пар, за которыми следуют другие возможные вычитающие пары. Каждая пара необязательна, и первый символ каждой пары также необязателен в паре. Третий этап затем расширяет список пар в список команд Retina, которые принимают входные данные и создают три копии с возможностью выбора второго или обоих символов из пары, затем обрезает и дедуплицирует результаты. На заключительном этапе затем добавляется код для выполнения заключительных задач: сначала расширить входные данные, чтобы возможно добавить окончательноеI
затем отфильтровать результаты неправильной длины, затем дедуплицировать результаты и, наконец, подсчитать результаты. Полученный скрипт Retina затем оценивается.Примечание: теоретически 15 байтов можно сохранить с конца 4-й строки, но это делает скрипт слишком медленным, чтобы демонстрировать его на TIO даже для
n=1
.источник
Python 2 ,
177 168162 байтаПопробуйте онлайн!
Я новичок, помоги мне в этом! Это проверяет фактические римские цифры, регулярное выражение должно быть скорректировано для учета нечетных случаев, таких как
IVI
-9 байт благодаря @Dead Possum!
-6 байт благодаря @ovs
источник
^M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$
93
вместо105
JavaScript (ES7), 133 байта
Редактировать : Исправлено, чтобы соответствовать результатам, возвращаемым кодом Джонатана Аллана , который был задан в качестве эталонной реализации OP.
Попробуйте онлайн!
Как?
Отныне каждая цифра будет интерпретироваться как символ римской цифры:
2) Мы заменим все действительные субтрактивные пары вида
AB
сB
:Примеры:
XLIXIV
становитсяLXV
XIIV
становитсяXIV
, оставляя,I
что сделает следующий тест провалIC
остается неизменным, что также оставляет недействительнымI
на месте3) Мы проверяем, чтобы остальные символы были в правильном порядке и не появлялись чаще, чем им разрешено:
источник
C
150123 байтаЯ недостаточно внимательно прочитал описание, так что получается число стандартных римских цифр (где выражения вроде
IVI
не учитываются). Так как я приложил некоторые усилия, я думал, что поделюсь в любом случае.Оригинал (150 байт):
источник
F(X)
иfor(X=10;X--;)