Цель:
написать функцию, которая принимает число в качестве входных данных и возвращает сокращенную римскую цифру для этого числа в качестве выходных данных.
Римские Цифровые Символы:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
Для примера того, что я имею в виду, когда говорю «короткие римские цифры», давайте рассмотрим поиск римской цифры для обозначения 1983 года, потому что это год, когда я родился. Один из вариантов - сделать это обычным способом (10 букв):
1983 = MCMLXXXIII = (1000 - 100 + 1000 + 50 + 30 + 3)
Другой вариант - сделать это коротким способом (6 символов):
1983 = MXVIIM = (1000 - (10 + 10) + 1000 + 3)
Ты знаешь что это значит?!?!!?? Если бы я был римлянином, я мог бы сохранять 4 символа каждый раз, когда писал дату своего рождения! Woot Woot !!
Однако, прежде чем я забегу вперед в волнении, у меня есть вопрос, который я должен написать, поэтому я, вероятно, должен определить правила римской числовой сокращения, чтобы мы все были на одной странице:
Правила короткой римской цифры:
- Всегда рассматривайте символы слева направо, пока больше не останется символов для рассмотрения.
- Если справа от текущего символа нет более значимых символов:
- Добавьте значение текущего символа к промежуточной сумме этой римской цифры.
- Если справа от символа, который вы рассматриваете, есть более значимые символы:
- Найдите самый правый символ с наибольшим значением справа от текущего символа
- Рассмотрим все символы до этого символа как одну римскую цифру
- Рассчитайте значение этой римской цифры, используя эти шаги
- Вычтите значение этой римской цифры из промежуточной суммы этой римской цифры.
- Перейти к следующему символу после группы, которую вы только что рассмотрели
- Каждая римская цифра должна содержать как минимум 1 символ.
- Это оно! Все, что следует этим правилам, будет принято!
Примеры:
IIIIV = (-(1+1+1+1)+5) = 1 //Don't ask me why you'd want to do this!
VVX = (-(5+5) + 10) = 0 //Who said you couldn't represent 0 with roman numerals?!!?
VVXM = (-(-(5+5) + 10) + 1000) = 1000 //Again...don't ask me why you'd want to do this!
MXIIXMI = (1000-(10-(1+1)+10)+1000+1) = 1983 //Ahhh...such a great year :)
Правила вопроса:
Создайте функцию, которая принимает одно число в качестве входных данных и возвращает римские цифры для этого числа в качестве выходных данных с использованием вышеуказанных правил. Рассчитайте codeGolfScore этой функции.
example input: 2011 example possible output: MMXI another possible output: MMVVIVV //(2000 + 10 - 4 + 5)
Используя свою функцию из правила 1, сгенерируйте римские цифры от -1000 (верно, ОТРИЦАТЕЛЬНАЯ тысяча) и 3000. Затем суммируйте длину символов этих римских цифр, чтобы получить ваш totalCharacterCount . Вот некоторый псевдокод для пояснения:
totalCharacterCount = 0; for(currentNumber = -1000; currentNumber <= 3000; currentNumber++){ totalCharacterCount += getRomanNumeral(currentNumber).length; } return totalCharacterCount;
finalScore = codeGolfScore + totalCharacterCount
- Самая низкая финальная оценка побед!
Примечание. Поскольку значение totalCharacter будет равно десяти тысячам +, алгоритм длины символа должен быть главным приоритетом. Очки Code-Golf - это просто разрыв в том случае, если несколько пользователей находят оптимальный алгоритм или алгоритмы, близкие друг другу.
Удачи, и получайте удовольствие от празднования MMXII завтра вечером !!!
источник
DDDDM
стоять-1000
?""
разрешено ли для нуля, или мы должны использоватьVVX
или что-то эквивалентное?IXV = -(-1 + 10) + 5 = -4
правые выигрыши) илиIXV = -1 + 10 + 5 = 14
(наиболее ценные выигрыши)?Ответы:
Haskell, 25637 (= 268 + 25369)
26045 (= 222 + 25823)например
Вы можете оценить длину суммы с простым
Который занимает что-то в течение минуты.
источник
C ++, 345 символов кода, 25021 цифра римской цифры = 25366
немного деобфусцирован, с водителем:
V
вычисляет числовое значение заданной римской числовой строкиs
длиныL
. Строки кодируются основанием 7 (первая цифра s% 7, вторая цифра s / 7% 7, ...). Каждая цифра кодируется с I = 0, V = 1, ..., M = 6.f
выполняет перебор возможных строк римских чисел методом грубой силы, чтобы найти ту, котораяV
соответствуетn
.Общее количество римских цифр является оптимальным. Самая длинная римская цифра, необходимая для [-1000,3000], составляет 11 цифр (например, -827 = CMDDMLXXIII), что на моей машине занимает около 5 минут.
источник
LMCLXXIII
в качестве ответа-777
. Я бы прочитал это как-50+1000-100+50+10+10+3 = 923 ≠ -777
, только с « самым правым с более высоким значением » вместо «самого высокого » это дает-777
. Но это было только то, что вы просили в комментариях!VVVXI
для-4
когдаIXVX
на самом деле короче, так как я только что заметил) - но это совершенно законно.Рубин, 25987 (= 164 + 25823)
Вы можете позвонить
r
напрямую, чтобы получить результаты. Сумма за указанный диапазон даеткоторая является оптимальной суммой, как с другими решениями.
источник
C # 23537 (639 символов кода + 22898 символов вывода)
Вычислять:
Enumerable.Range(-1000, 3000).Sum(i => M.R(i).Length);
источник