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 !!!
źródło
DDDDM
oznacza-1000
?""
dozwolone jest zero, czy musimy go użyć,VVX
czy coś równoważnego?IXV = -(-1 + 10) + 5 = -4
(wygrane z prawej strony) lubIXV = -1 + 10 + 5 = 14
(wygrane o najwyższej wartości)?Odpowiedzi:
Haskell, 25637 (= 268 +
25369)26045 (= 222 + 25823)do wykorzystania jako np
Możesz bezpośrednio oszacować sumę długości
Co zajmuje około minuty.
źródło
C ++, 345 znaków kodu, 25021 cyfr rzymskich = 25366
nieco przestarzały, ze sterownikiem:
V
oblicza wartość liczbową danego łańcucha liczb rzymskichs
o długościL
. Ciągi znaków są zakodowane jako podstawa 7 (pierwsza cyfra to s% 7, druga cyfra to s / 7% 7, ...). Każda cyfra jest kodowana za pomocą I = 0, V = 1, ..., M = 6.f
dokonuje wyliczenia brute-force możliwych ciągów cyfr rzymskich, aby znaleźć taki, któryV
ocenian
.Całkowita liczba cyfr rzymskich jest optymalna. Najdłuższa liczba rzymska wymagana dla [-1000,3000] to 11 cyfr (np. -827 = CMDDMLXXIII), co zajmuje około 5 minut na mojej maszynie.
źródło
LMCLXXIII
Jako odpowiedź na-777
. Czytałbym to jako-50+1000-100+50+10+10+3 = 923 ≠ -777
, że daje to tylko „ najwyższą z prawej wyższą wartość” zamiast „ najwyższej ”-777
. Ale o to prosiliście w komentarzach!VVVXI
do-4
kiedyIXVX
jest rzeczywiście krótsze, a ja po prostu zauważyłem) - ale to jest całkowicie legalne.Rubin, 25987 (= 164 + 25823)
Możesz zadzwonić
r
bezpośrednio, aby uzyskać wyniki. Suma w określonym zakresie dajektóra jest optymalną sumą, jak w przypadku innych rozwiązań.
źródło
C # 23537 (639 znaków kodu + 22898 znaków wyniku)
Liczyć:
Enumerable.Range(-1000, 3000).Sum(i => M.R(i).Length);
źródło