Мета:
Напишіть функцію, яка приймає число як вхідне, і повертає коротке римське число для цього числа як вихід.
Римські числові символи:
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 :)
Правила запитання:
Створіть функцію, яка приймає одне число як вхідне і повертає римську цифру для цього числа як вихідну, використовуючи наведені вище правила. Обчисліть кодGolfScore цієї функції.
example input: 2011 example possible output: MMXI another possible output: MMVVIVV //(2000 + 10 - 4 + 5)
Використовуючи свою функцію з правила 1, згенеруйте римські цифри від -1000 (це правильно, НЕГАТИВНА тисяча) та 3000. Потім підсумуйте довжину символів цих римських цифр, щоб отримати загальнийCharacterCount . Ось псевдокод для уточнення:
totalCharacterCount = 0; for(currentNumber = -1000; currentNumber <= 3000; currentNumber++){ totalCharacterCount += getRomanNumeral(currentNumber).length; } return totalCharacterCount;
finalScore = codeGolfScore + totalCharacterCount
- Найнижчі виграші у FinalScore !
Примітка. Оскільки загальний підрахунок символів буде складати десять тисяч +, алгоритм довжини символів повинен бути основним пріоритетом. Оцінки гольф-коду - це лише перемикач, якщо кілька користувачів знаходять оптимальний алгоритм або алгоритми, близькі один до одного.
Удачі та весело провести час на своїх святкуваннях MMXII завтра ввечері !!!
""
дозволено нуль чи ми повинні використовувати VVX
чи щось еквівалентне?
IXV = -(-1 + 10) + 5 = -4
(кращий виграш), або IXV = -1 + 10 + 5 = 14
(виграш з найвищими цінами)?
DDDDM
стоїть-1000
?