Напишите программу или функцию, которая принимает целое число в диапазоне 1..3999 в качестве входных данных и возвращает количество отрезков, необходимое для выражения этого целого числа в стандартных римских цифрах (поэтому вы должны использовать XL, но не VM). Примеры:
1 -> 1
4 -> 3
5 -> 2
9 -> 3
10 -> 2
40 -> 4
50 -> 2
90 -> 3
100 -> 1
400 -> 3
500 -> 2
900 -> 5
1000 -> 4
Римские преобразования номера встроенных команды будут разрешены, но вы можете решить эту проблему без них путем многократного вычитания наибольшего количества оставшегося из приведенного выше списка. Пример: 1234 = 4 + 1 + 1 + 2 + 2 + 2 + 3 = 15.
Это код-гольф , поэтому выигрывает самая короткая программа.
Ответы:
Pyth,
927670 байтовПопробуй это здесь!
Спасибо @FryAmTheEggman за некоторые предложения по упаковке строк, которые сэкономили мне несколько байтов!
Мне все еще интересно, есть ли математический способ кодирования этого списка. Постараюсь что-то выяснить.
объяснение
Это использует данный алгоритм.
K
содержит данный список с номерами и соответствующим количеством чередующихся отрезков. Этот список создается путем разбиения упакованной строки, которая декодируется0/0/1/1/4/3/5/2/9/3/10/2/40/4/50/2/90/3/100/1/400/3/500/2/900/5/1000/4
,/
и каждый элемент сопоставляется с целым числом.источник
С,
148129 символовМой первый код-гольф: ^). Поскольку в вопросе говорится, что я могу использовать функцию, я изменил main на функцию, чтобы обрезать некоторые символы (наиболее важно: передать c в качестве параметра, а не scanf)
распакованный
источник
Mathematica,
8072 байтаАнонимная функция, которая просто преобразует числа в римские цифры, заменяет каждый символ количеством сегментов и получает общее количество.
источник
Сетчатка, 128 байт
Простая замена, пока не останется ничего заменить. Затем подсчитываются апострофы и это наше количество отрезков.
Если разрешен ввод и вывод в унарном формате, то это 115 байт (хотя кто захочет набрать 1234?).
Попробуйте онлайн!
Попробуйте онлайн! (одинарный IO)
источник
Python 3, 95 байт
Строка Unicode состоит из кодовых точек:
источник
e=ord(e);
Java, 152 байта
Потому что, вы знаете, Java.
Простая буквальная реализация данного алгоритма. Массив упаковывает информацию о преобразовании: четные индексы на единицу меньше римской цифры, а нечетные индексы - это число для этой цифры.
Это лямбда, которая принимает и возвращает
int
/Integer
. Это включаетIntUnaryOperator
илиUnaryOperator<Integer>
.источник
JavaScript (ES6), 79 байт
Строки представляют количество линейных сегментов для единиц измерения, десятки и сотни цифр. («Тысячи» - это просто число, в четыре раза превышающее тысячу.) Этот метод кажется короче, чем другие варианты, такие как алгоритм, предложенный в вопросе.
Редактировать: 2 байта сохранены благодаря @ user81655.
источник
n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4
+
s на-
s, я могу удалить ведущий+
, но затем группировка сохраняет еще один байт.