Cel:
Napisz funkcję, która pobiera liczbę jako dane wejściowe i zwraca liczbę rzymską krótkiej ręki dla tej liczby jako dane wyjściowe.
Symbole rzymskie:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
Na przykład, co mam na myśli, gdy mówię „krótkie cyfry rzymskie”, zastanówmy się nad znalezieniem cyfry rzymskiej reprezentującej 1983, ponieważ jest to rok, w którym się urodziłem. Jedną z opcji jest zrobienie tego w normalny sposób (10 liter):
1983 = MCMLXXXIII = (1000 - 100 + 1000 + 50 + 30 + 3)
Inną opcją jest zrobienie tego skrótem (6 znaków):
1983 = MXVIIM = (1000 - (10 + 10) + 1000 + 3)
Wiesz co to oznacza?!?!!?? Gdybym był rzymski, mógłbym zapisać 4 znaki za każdym razem, gdy zapisywałem datę urodzenia! Woot Woot !!
Zanim jednak przejdę do ekscytacji, muszę napisać pytanie, więc prawdopodobnie powinienem zdefiniować reguły liczb rzymskich w skrócie, abyśmy wszyscy byli na tej samej stronie:
Zasady liczb rzymskich z krótkiej ręki:
- Zawsze bierz pod uwagę symbole od lewej do prawej, dopóki nie będzie więcej znaków do rozważenia.
- Jeśli po prawej stronie bieżącego symbolu nie ma symboli o wyższej wartości:
- Dodaj wartość bieżącego symbolu do bieżącej sumy tej rzymskiej cyfry.
- Jeśli po prawej stronie rozważanego symbolu znajdują się symbole o wyższej wartości:
- Znajdź symbol o najwyższej wartości po prawej stronie bieżącego symbolu
- Rozważ wszystkie znaki aż do tego symbolu jako jedną cyfrę rzymską
- Obliczyć wartość tej cyfry rzymskiej, wykonując następujące kroki
- Odejmij wartość tej liczby rzymskiej od bieżącej sumy tej liczby rzymskiej.
- Przejdź do następnego symbolu po grupie, którą właśnie rozważałeś
- Każda cyfra rzymska musi zawierać co najmniej 1 symbol.
- To jest to! Wszystko zgodne z tymi zasadami zostanie zaakceptowane!
Przykłady:
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 :)
Zasady pytań:
Utwórz funkcję, która pobiera jedną liczbę jako dane wejściowe i zwraca liczbę rzymską dla tej liczby jako dane wyjściowe, korzystając z powyższych reguł. Oblicz kodGolfScore tej funkcji.
example input: 2011 example possible output: MMXI another possible output: MMVVIVV //(2000 + 10 - 4 + 5)
Korzystając z funkcji z reguły 1, wygeneruj cyfry rzymskie od -1000 (to prawda, NEGATYWNY tysiąc) do 3000. Następnie zsumuj długość znaków tych cyfr rzymskich, aby uzyskać totalCharacterCount . Oto pseudokod do wyjaśnienia:
totalCharacterCount = 0; for(currentNumber = -1000; currentNumber <= 3000; currentNumber++){ totalCharacterCount += getRomanNumeral(currentNumber).length; } return totalCharacterCount;
finalScore = kodGolfScore + totalCharacterCount
- Najniższe końcowe wyniki wygrywają!
Uwaga: Ponieważ całkowita liczba znaków będzie w dziesiątkach tysięcy +, algorytm długości znaków powinien mieć najwyższy priorytet. Wyniki gry w golfa to tylko przełom w przypadku, gdy wielu użytkowników znajdzie optymalny algorytm lub algorytmy, które są blisko siebie.
Powodzenia i baw się dobrze na jutrzejszych obchodach MMXII !!!
""
dozwolone jest zero, czy musimy go użyć, VVX
czy coś równoważnego?
IXV = -(-1 + 10) + 5 = -4
(wygrane z prawej strony) lub IXV = -1 + 10 + 5 = 14
(wygrane o najwyższej wartości)?
DDDDM
oznacza-1000
?