Ваша задача - преобразовать данное положительное целое число из арабской цифры в римскую цифру.
Все становится сложнее, если считать до 4000.
Римляне сделали это, добавив строку над символом, чтобы умножить этот символ на 1 000
. Однако в ASCII обводки не отображаются точно. Кроме того, существуют двойные пометки для умножения символа на 1 000 000
, а затем тройные пометки для умножения символа на 1 000 000 000
и т. Д.
Поэтому я решил использовать круглые скобки, чтобы заменить подчеркивания.
Символы могут быть индивидуально помещены в скобки. Например, оба (VI)
и (V)(I)
являются действительными представлениями 6 000
.(V)M
также является действительным представлением 6000.
(I)
это правильный способ представлять 1 000
.
Testcases
Input: 1
Output: I
Input: 2
Output: II
Input: 3
Output: III
Input: 4
Output: IV
Input: 15
Output: XV
Input: 40
Output: XL
Input: 60
Output: LX
Input: 67
Output: LXVII
Input: 400
Output: CD
Input: 666
Output: DCLXVI
Input: 3000
Output: MMM
Input: 3999
Output: MMMCMXCIX
Input: 4000
Output: M(V)
Input: 4999
Output: M(V)CMXCIX
Input: 6000
Output: (VI)
Input: 6000000
Output: ((VI))
Input: 6006000
Output: ((VI)VI)
Input: 6666666666
Output: (((VI)DCLXVI)DCLXVI)DCLXVI
счет
Это код-гольф . Самый короткий код в байтах побеждает.
источник
(IV)
ли приемлемое представление 4000?Ответы:
Mathematica, 67 байт
Предотвращает все проблемы
M
путем преобразования ввода в базу 1000 и преобразования каждой цифры отдельно с помощьюRomanNumeral
. Затем мы складываем их, вставляя(...)
слева.К сожалению, Mathematica представляет нули,
N
поэтому мы должны избавиться от них.источник
RomanNumeral
может это сделать?MMMM
для4000
, он только начинает работать по спецификации5000
(а затем вы получаете ту же проблему для4000000
и т. Д.). Даже тогда он использует надстрочные знаки вместо скобок. Если вы в порядке с этим, вы должны сказать об этом в спецификации вызова.JavaScript (ES6), 136 байт
Для чисел до 4000 повторяется каждая римская «буква» столько раз, сколько возможно, используя список римских «букв» и их десятичных значений. В противном случае рекурсивно строит ответ от деления и по модулю с 1000. К счастью,
repeat
усекает, поэтому мне не нужно делать это самому.источник
Common Lisp, 108
Ungolfed
тесты
Два теста дают разные результаты, чем те, которые приведены в вопросе:
источник
R 134
Это в значительной степени не лучший вариант, но я думаю, что идея должна идти примерно так.
источник
Питон, 188
194-6 байт от избавления от пробелов
Эта проблема вернула меня к тому времени, когда я только начинал учиться программировать ...
Возможно, это не самое короткое решение, но я получил удовольствие от игры в гольф.
Попробуйте!
источник
Рубин,
137134130 байтовРекурсивная функция, которая возвращает строку. Я пытаюсь поиграть в цифровые кодировки немного больше, если это возможно, но я не уверен, как.
Ой, теперь это практически прямой порт ответа @ Neil's ES6.
источник
Рубин,
185 161144 байтаСпустя год после первоначального поста, я думаю, что узнал кое-что о гольфе.
Спасибо Value Ink за ваши ценные комментарии.
источник
gsub
может принимать строку в качестве первого аргумента, устраняя необходимость в подстановках в шаблоне регулярных выражений, посколькуs.gsub! x,y
делает это автоматически. Кроме этого, вы, вероятно, можете просто отказаться от назначения вашегоa
массива, поскольку вы используете его только один раз и вставляете его непосредственно вeach_slice
вызов."IVXXLCCDM".scan(/(.)(.)(.)/){|x,b,c|...
тоже работаетr[x]
, функционально эквивалентен тому, чтоr.(x)
когда-либо участвуют колбасные лямбдыr[x]
трюк будет полезен всем моим рекурсивным гольфам в рубине!TCL 134 байта
Попробуйте это здесь: https://rextester.com/BJC92885
источник