- 22, Oct 2024
- #1
Цель:
Напишите функцию, которая принимает число в качестве входных данных и возвращает сокращенную римскую цифру для этого числа в качестве выходных данных.
Символы римских цифр:
totalCharacterCount = 0; for(currentNumber = -1000; currentNumber <= 3000; currentNumber++){ totalCharacterCount += getRomanNumeral(currentNumber).length; } return totalCharacterCount;
В качестве примера того, что я имею в виду, когда говорю «сокращенные римские цифры», давайте рассмотрим поиск римской цифры, обозначающей 1983 год, потому что это год моего рождения. Один из вариантов — сделать это обычным способом (10 букв):
1983 = MCMLXXXIII = (1000 - 100 + 1000 + 50 + 30 + 3)
Другой вариант — сделать это сокращенно (6 символов):
1983 = MXVIIM = (1000 - (10 + 10) + 1000 + 3)
Вы знаете, что это значит?!?!!?? Если бы я был римлянином, я мог бы сохранять 4 символа каждый раз, когда писал дату своего рождения! Ву-у-у!
Однако, прежде чем я забегу вперед в волнении, мне нужно написать вопрос, поэтому мне, вероятно, следует определить правила сокращений римских цифр, чтобы мы все были на одной волне:
Правила краткого написания римских цифр:
- Всегда рассматривайте символы слева направо до тех пор, пока не останется больше символов, подлежащих рассмотрению.
- Если справа от текущего символа нет символов с более высоким значением:
- Добавьте значение текущего символа к промежуточной сумме этой римской цифры.
- Если справа от рассматриваемого вами символа есть символы с более высоким значением:
- Найдите самый правый символ с самым высоким значением справа от текущего символа.
- Считайте все символы до этого символа одной римской цифрой.
- Рассчитайте значение этой римской цифры, используя следующие шаги.
- Вычтите значение этой римской цифры из промежуточной суммы этой римской цифры.
- Перейти к следующему символу после группы, которую вы только что рассмотрели.
- Каждая римская цифра должна содержать хотя бы 1 символ.
- Вот и все! Все, что соответствует этим правилам, будет принято!
Примеры:
example input: 2011
example possible output: MMXI
another possible output: MMVVIVV //(2000 + 10 - 4 + 5)
Правила вопросов:
Создайте функцию, которая принимает одно число в качестве входных данных и возвращает римскую цифру для этого числа в качестве выходных данных, используя приведенные выше правила. Рассчитайте кодGolfScore этой функции.
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 :)
Используя функцию из правила 1, сгенерируйте римские цифры от -1000 (верно, ОТРИЦАТЕЛЬНАЯ тысяча) до 3000. Затем просуммируйте длину символов этих римских цифр, чтобы получить общее количество символов. Вот псевдокод для пояснения:
Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1,000
FinalScore = кодGolfScore + TotalCharacterCount
- Самый низкий FinalScore побеждает!
Примечание. Поскольку общее количество символов будет превышать десять тысяч, алгоритм определения длины символов должен иметь высший приоритет. Очки в код-гольфе — это всего лишь решающий момент на случай, если несколько пользователей найдут оптимальный алгоритм или алгоритмы, близкие друг к другу.
Удачи и веселитесь завтра вечером на праздновании MMXII!!!
#код-гольф #римские цифры