Если задано строго положительное целое число, верните самую короткую римскую цифру, используя только аддитивное правило. Вывод должен состоять из нуля или более каждого из символов MDCLXVI
в этом порядке. Следовательно, число 14
должно давать, XIIII
а не XIV
.
Числовые значения символов: M
= 1000, D
= 500, C
= 100, L
= 50, X
= 10, V
= 5, I
= 1.
Примеры
3
→ III
4
→ IIII
9
→ VIIII
42
→ XXXXII
796
→ DCCLXXXXVI
2017
→ MMXVII
16807
→ MMMMMMMMMMMMMMMMDCCCVII
4 -> IIII
,9 -> VIIII
а неIX
?VIIII
является единственным разрешенным выходом для 9.Ответы:
Простой английский ,
10591025678641451399 байтСохранено 34 байта путем удаления сообщения об ошибке. Тогда сэкономил 384 байта, играя в гольф. Затем сохранили 190 байтов, объединив операцию деления с операцией добавления («z») в новую операцию («p»). Затем сэкономил 52 байта, играя в гольф.
Вот не окончательная версия окончательного кода, а также ошибка для отрицательного числа:
источник
APL (Dyalog) ,
2522 байтаПопробуйте онлайн!
источник
/
) вместо Reshape (⍴
) , так что вы можете вырезать каждый и в сцеплять обжатие (¨
а,/
).⎕
) и использовать commute (⍨
) для удаления паренов и compose (∘
).{}
или не∇f∇
Retina ,
5742 байтаПреобразует в одинарный, затем жадно заменяет сгустки
I
s с более высокими значениями в порядке.Попробуйте онлайн
Сэкономили 15 байтов благодаря Мартину
источник
I
качестве единицы?Python 2 , 64 байта
Попробуйте онлайн!
Вместо того, чтобы создавать выходную строку с самого начала, жадно занимая большую часть, это создает ее с конца. Например, число
I
's'n%5
, затем числоV
's'n/5%2
и так далее. Это смешанное базовое преобразование с чередующимися соотношениями 5 и 2.Вот итерационный эквивалент:
Python 2 , 68 байт
Попробуйте онлайн!
Их
M
нужно обрабатывать отдельно, потому что может присутствовать любое их количество, так как нет большей цифры. Таким образом, после назначения других значений места оставшееся значение преобразуется вM
's'.Для сравнения жадная стратегия (69 байт):
Python 2 , 69 байт
Попробуйте онлайн!
Текущее значение цифры
d
делится на 2 или 5 для получения следующей цифры. Значениеd%3
скажите нам, какой: еслиd%3==1
, разделите на2
; и еслиd%3==2
, разделите на 5.источник
Mathematica, 81 байт
Явное использование значений и получение соответствующих цифр кажется на один байт длиннее:
источник
FromRomanNumeral@r
Excel,
236193161 байт43 байта сэкономлено благодаря @ BradCНа данный момент ответ действительно полностью принадлежит @ BradC . Еще 32 байта сохранены.
отформатирован:
источник
CONCATENATE
с&
между каждым элементом, иQUOTIENT
сINT(A/B)
.REPT
уже сокращает число, если оно не является целым числом , поэтому вы можете сохранить еще 30 байтов, удалив каждыйINT()
. Сохраните еще 2, заменив оба1000
на1E3
(хотя, похоже, Excel не захочет сохранять его таким, как только вы нажмете Enter).1E3
поведение. Ответ обновлен.Perl 5 , 66 байт
65 байт кода +
-p
флаг.Попробуйте онлайн!
Без изменения количества байтов,
MDCLXVI=~/./g
можно заменить наM,D,C,L,X,V,I
; и--$|?2:5
по$|--*3+2
.Гораздо дольше ( 99 байт ) есть:
источник
CJam ,
3528 байт-7 байт благодаря Мартину Эндеру
Попробуйте онлайн!
объяснение
источник
C #, 127 байт
Чисто жестко закодированное троичное выражение, использующее рекурсию.
Полная / Отформатированная версия:
источник
n>0
это простоn
.int
может быть неявно приведен кbool
.05AB1E ,
292625 байтПопробуйте онлайн!
объяснение
источник
JavaScript (ES6),
817569 байтСохранено 6 байтов благодаря @Neil за перенос @ ответа Йорг Хюльсерманна
Сохранено 6 байтов благодаря @Shaggy
Тестовые случаи:
Показать фрагмент кода
источник
n%=x
внутриrepeat
метода, чтобы сохранить несколько байтов.n=>'MDCLXVI'.replace(/./g,(c,i)=>c.repeat(n/a,n%=a,a/=i%2?5:2),a=1e3)
/// , 50 байт
Попробуйте онлайн!
Принимает ввод в унарном виде, и я (ab) использую поле нижнего колонтитула на TIO для ввода, поэтому выводу предшествует символ новой строки.
источник
Python 3 ,
100 97 96 94 93 9190 байтdef
; массив как параметр по умолчанию уменьшил пространство отступа; объявление нежелательной переменной удаленоa%=
сокращение(a//i)
удалены скобки[]
за счет одного отступа, таким образом экономя 1 байт.Попробуйте онлайн!
источник
a%=i
на байт короче :)b
как переменную внутри функции. Это устраняет необходимость в скобках -b=1000,500,100,50,10,5,1
Cubix , 69
7480байтПопробуйте онлайн!
Смотреть это работает
Мне удалось сжать это немного больше, но все еще есть некоторые неприятные запреты, особенно на верхней грани.
52"IVXLCDM"U
поместите необходимые делители и символы в стек. 5 и 2 будут использоваться для уменьшения значения div / mod, а символы будут отбрасываться после использования.UIN0/&0\&,/U
Развернитесь на верхнюю грань и начните длинный тур, чтобы получить ввод и толкнуть 1000 в стек. Начальное деление сделано и разворот наr
следующий фрагмент. Это была область, на которую я смотрел, чтобы сэкономить.,r%ws;rr
начало цикла divmod. целочисленное деление, поверните результат без мода, затем переставьте верхнюю часть стека, чтобы уменьшить ввод, делитель тока и результат деления.3tus
вывести текущий символ наверх и поменять его местами с результатом деления.!vsoUs(0;U
это цикл печати. в то время как результат div больше 0, поменяйте местами вывод символов, поменяйте местами назад, уменьшите, нажмите 0 и отбросьте его. На 0 перенаправить через поп стек (удалить результат деления) и вокруг куба.\u;pwpsq,!@Urq;u
с небольшим перенаправлением это удаляет персонажа из стека, поднимает 5 и 2 на вершину, меняет их местами и толкает один обратно вниз. Остальное используется для уменьшения делителя. Остановитесь, если оно уменьшится до 0, в противном случае сдвиньте 5 или 2 вниз и снова войдите в цикл.источник
Mathematica, 130 байт
источник
Python 2 ,
10990 байтПопробуйте онлайн!
источник
1000
может быть1e3
(если вы не возражаете, это плавание, которое не должно быть проблемой)float
, и вы не можете умножить строку на число с плавающей точкой: cPHP , 70 байт
Попробуйте онлайн!
источник
T-SQL, 164 байта
Добавлены разрывы строк только для удобства чтения.
Эта версия намного длиннее (230 символов), но ощущается гораздо более похожей на SQL:
Создает таблицу m со всеми сопоставлениями значений символов, а затем перебирает нахождение наибольшего значения <= число, объединяя соответствующий символ.
источник
Japt , 34 байта
Проверьте это онлайн!
источник
JavaScript (ES6), 65 байт
Рекурсивная функция.
Как?
Второй рекурсивный вызов
f(n-a)
действительно должен бытьf(n-a,a)
. Опуская второй параметр,a
иi
повторно инициализируются (до 1000 и 0 соответственно) каждый раз, когда новая римская цифра добавляется к окончательному результату. Это вызывает больше рекурсии, чем необходимо, но не изменяет результат функции и сохраняет 2 байта.Контрольные примеры
Показать фрагмент кода
источник
J ,
2623 байта3 байта сэкономлено благодаря Адаму.
Попробуйте онлайн!
Похоже на APL ответ восновном одно и то же.источник
#.inv
вместо#:
?#.inv
вместо#:
, так как что-то вроде2 #: 4
есть0
, а2 #.inv 4
есть1 0 0
#
есть/
;~
есть⍨
;$
есть⍴
;&
есть∘
;#:
есть⊤
. Разница лишь в том, что вы используете бесконечность, в_
то время как вы можете использовать0
как ответ APL.Пакет, 164 байта
Принимает участие в STDIN.
источник
Oracle SQL, 456 байт
Выходы:
Обратите внимание, что фактический размер строки составляет 460 байт, поскольку он включает в себя номер ввода (2849).
Ungolfed:
Как это работает: я вычисляю, сколько каждой буквы мне нужно, вычисляя максимум, что я могу получить с более высоким значением (бесконечность для M), а затем делаю целочисленное деление между значением текущей буквы и результатом этого.
Например, 2348, сколько
C
мне нужно?trunc((2348-mod(2348,500))/100)
= 3Затем я
listagg
переписываю это письмо 3 раза (используяCONNECT BY
для генерации 3 нужных мне строк). Наконец-то у меняlistagg
все вместе.Вроде громоздко, но большинство из них
select from dual
в таблице преобразования, и я не могу ничего с этим поделать ...источник
Java (OpenJDK 8) ,
119118 байтПопробуйте онлайн!
Сохраненный байт благодаря @TheLethalCoder
источник
v
иi
в первом цикле for сохранить байт?Древесный уголь ,
61 5046 байтовПопробуйте онлайн!
Объяснение:
источник
Nν
на один байт корочеANν
,¬‹
на один байт короче, чем вычитание 1, и если вы используете÷
(IntDivide) вместо∕
(Divide), то вы можете использоватьφ
в качестве условия внешнего цикла. Тем не менее, я думаю, что вы можете уменьшить его до 40 байт, зациклившисьMDCLXVI
напрямую.C ++, 272 байта
источник
C 183 байта
Тот же алгоритм, что и раньше, только использование простых массивов c вместо std :: map, частично вдохновленных ответом @ xnor, и использование строки для хранения букв.
источник
Common Lisp, 113 байт
Это анонимная функция, возвращающая результат в виде строки.
Ungolfed, с описательными именами переменных и комментариями:
CL имеет встроенный форматер римских цифр. К сожалению, это не работает для чисел больше 3999.
источник
Древесный уголь , 34 байта
Первоначально основано на ответе @ CarlosAlego. Порт Python-решения @ xnor также составляет 34 байта:
Изменить: Порт другого решения Python @ xnor оказывается 33 байта!
Попробуйте онлайн! Ссылка на подробную версию кода. Обратите внимание, что я использовал
⁺׳﹪φ³±¹
вместо,⁻׳﹪φ³¦¹
потому что в настоящее время девербозификатор не может вставить разделитель.источник