Создать базовый калькулятор для римских цифр.
Требования
- Опоры
+
,-
,*
,/
- Вход и выход должны ожидать только один префикс вычитателя на символ (т. Е. 3 не может быть,
IIV
потому что есть дваI
передV
) - Обращение принципа вычитания на входе и выходе должен при минимальной поддержке современных стандартных конвенций, в которых только полномочия десяти вычитаются из больших чисел (например
I
,X
,C
требуются вычитани , но неV
,L
,D
) и вычитание никогда не делается из целого ряда более 10x вычитатель (например,IX
должен поддерживаться, ноIC
не обязателен). - Вход и выход должны быть слева направо в порядке значений, начиная с наибольшего (т.е. 19 =
XIX
нетIXX
, 10 больше 9) - Слева направо, без приоритета оператора, как если бы вы использовали ручной калькулятор.
- Поддерживает ввод / вывод целых положительных чисел в диапазоне 1-4999 (нет необходимости в V̅)
- Нет библиотек, которые делают преобразование римских цифр для вас
Вам решать
- Чувствительность к регистру
- Пробелы или нет пробелов на входе
- Что произойдет, если вы получите десятичный вывод. Усекать, нет ответа, ошибка и т. Д.
- Что делать для вывода, который вы не можете обработать. Негативы или цифры в большом для печати.
- Следует ли поддерживать более либеральное использование принципа вычитания, чем минимальное требование.
Дополнительный кредит
- -50 - обрабатывать до 99999 или больше. Символы должны включать винкулюм
Пример ввода / вывода
XIX + LXXX (19+80)
XCIX
XCIX + I / L * D + IV (99+1/50*500+4)
MIV
Самый короткий код выигрывает.
code-golf
roman-numerals
Дэнни
источник
источник
IM = 999
требуется?IM
. Независимо от того, выходнойIM
илиCMXCIX
для 999 - решать вам. Оба соответствуют требованиям.Ответы:
JavaScript (ES6), 238
Использование:
Аннотированная версия:
источник
T-SQL, 1974 - 50 = 1924 байта
Я знаю, что игра в гольф в SQL эквивалентна игре в 18 лунок только с песчаным клином, но мне не помешала эта игра, и я думаю, что мне удалось сделать несколько интересных вещей методологически.
Это поддерживает Vinculum для ввода и вывода. Я принял соглашение об использовании конечной тильды для ее представления, поэтому V ~ равно 5000, X ~ равно 10000 и т. Д. Он также должен обрабатывать выходные данные до 399 999 в соответствии со стандартным использованием современных римских чисел. После этого он будет выполнять частично нестандартное римское кодирование всего, что находится в поддерживаемом INT диапазоне.
Поскольку все это целочисленная математика, любые нецелые результаты неявно округляются.
Я все еще работаю с решением на основе множеств, чтобы заменить некоторые циклы WHILE, которые могут уменьшить количество байтов и стать более элегантным примером идиоматического SQL. Есть также несколько байтов, которые можно получить, сократив использование псевдонимов таблиц до минимума. Но поскольку на этом языке это практически невозможно выиграть, я в основном здесь, чтобы похвастаться своим нарядом «Дон Кихот». :)
SELECT @i вверху повторяет ввод:
И SELECT в конце возвращает:
И вы можете проверить это самостоятельно на этом SQLFiddle
И я вернусь, чтобы добавить некоторые комментарии о том, как это работает, потому что зачем размещать явно проигрышный ответ, если вы не собираетесь использовать его для образовательной ценности?
источник
Javascript -
482476 символовПример ввода / вывода работает:
Он плохо обрабатывает и большие числа:
И он принимает, но не требует, пробелы тоже.
Но, так как я играл в гольф, у него есть некоторые проблемы:
Эта альтернативная версия обрабатывает числа от 5000 до 99999, но имеет
600598584 символов:источник
Javascript
479361348278253303 символа - 50 для вспомогательных номеров до 1 миллиона, в комплекте с поддержкой Vinculum:
Использование:
p(text)
например,p('XIX + LXXX')
возвращаетXCIX
.Код с пояснительными комментариями:
Это работает для данных образцов и для всех других, которые я пробовал. Примеры:
источник
Ruby 2.1,
353 (и многие другие итерации), 295 - 50 = 245Обработка Vinculum добавляет ~ 23 символа.
Это обрабатывает «IL» или «VM» во входных данных и завершается с ошибкой без ошибок для отрицательных значений (переход к старшим целым числам) или десятичных дробей (усечений) или любых пробелов. Теперь также обрабатывает отрицательное первое число (хотя, если сумма отрицательна, она все равно плохо работает). Также плохо работает, если вы начинаете с * или / или если результат 4 миллиона или больше.
Использует Object # send для функциональности "ручной калькулятор".
Ungolfed:
источник
Python 2 -
427418404401396395392 символовЧитает со стандартного ввода. Он обрабатывает только верхний регистр (может сделать его нечувствительным к регистру за счет 8 дополнительных символов) и требует пробелов. Без проверки - я не проверял, чтобы увидеть, как он ломается в разных случаях. Тем не менее, он обрабатывает такие числа, как VC = 95.
И негольфированная версия:
У меня такое чувство, что Perl был бы лучше, но я не знаю этого достаточно. Впрочем, для первого удара в кодовом гольфе я чувствую себя довольно хорошо.
источник
PHP -
549525524520 байтНичего особенного: нормализует операторы для обеспечения приоритета слева направо, переводит римские слова в десятичные, выполняет
eval
операторы, например, XCIX + I / L * D + IV преобразуется в нечто вроде return (((((+90 +9) + (+1)) / (+50)) * (+500)) + (+4)); , а затем преобразует десятичную обратно в римскую.например
источник
Python - 446 байт
Это может быть значительно улучшено. Я чувствовал, что должен был сделать первый удар, используя Python. Это делает 3 вещи на первом проходе
x
чтобы включить все возможные комбинации (даже если они не используются). Например, в то время какXIX
в настоящее время lexed, частичные значения"X":10
,"XI":11
и"XIX":19
добавляются в таблицу символовВ конце он вызывает
eval
исходную строку (кроме добавленных паренов) и дает ей таблицу символов.Затем я просто вставил известное решение для преобразования целого числа в римское, так как я работал над этим достаточно долго ... пожалуйста, не стесняйтесь улучшать, чтобы я узнал что-то новое :)
источник