Цель:
написать функцию, которая принимает число в качестве входных данных и возвращает сокращенную римскую цифру для этого числа в качестве выходных данных.
Римские Цифровые Символы:
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 завтра вечером !!!
""
разрешено ли для нуля, или мы должны использовать VVX
или что-то эквивалентное?
IXV = -(-1 + 10) + 5 = -4
правые выигрыши) или IXV = -1 + 10 + 5 = 14
(наиболее ценные выигрыши)?
DDDDM
стоять-1000
?