Wejście:
Liczba całkowita.
Wynik:
- Najpierw przekonwertuj liczbę całkowitą na odpowiadającą jej liczbę rzymską.
- Następnie przekonwertuj każdą wielką literę tej cyfry rzymskiej na ich wartość dziesiętną ASCII / UNICODE.
- I wypisz ich sumę.
Przykład:
1991 -> MCMXCI -> 77+67+77+88+67+73 -> 449
^ input ^ output
Cyfry rzymskie: Oto prawdopodobnie przydatny konwerter cyfr rzymskich.
Zasady konkursu:
- Stosowane są standardowe reguły liczb rzymskich, więc nie ma alternatywnych form takich jak
IIII
lubVIIII
zamiastIV
iIX
. * - Linie Macrona powyżej cyfr rzymskich powyżej 1000 to
¯
(UNICODE nr. 175). Więc jedna linia liczy się jako,+175
a dwie jak+350
. - Możesz używać dowolnego rodzaju danych wejściowych i wyjściowych, o ile reprezentują one liczby całkowite.
- Przypadki testowe będą w zakresie
1 - 2,147,483,647
.
* Reguły cyfr rzymskich (cytat z Wikipedii):
Liczby są tworzone przez łączenie symboli i dodawanie wartości, podobnie jak
II
dwa (dwa) iXIII
trzynaście (dziesięć i trzy). Ponieważ każda cyfra ma stałą wartość, a nie reprezentuje wielokrotność dziesięciu, stu itd., Zgodnie z pozycją, nie ma potrzeby zerowania miejsca, jak w liczbach takich jak 207 lub 1066; liczby te zapisano jakoCCVII
(dwieście, pięć i dwa) iMLXVI
(tysiąc, pięćdziesiąt, dziesięć, pięć i jeden).Symbole są umieszczane od lewej do prawej w kolejności wartości, zaczynając od największej. Jednak w kilku szczególnych przypadkach, aby uniknąć powtarzania się czterech znaków kolejno (takich jak
IIII
lubXXXX
), notacja odejmująca jest często stosowana w następujący sposób:
I
umieszczone przedV
lubX
wskazuje jeden mniej, więc cztery toIV
(jeden mniej niż pięć), a dziewięć toIX
(jeden mniej niż dziesięć)X
umieszczone przedL
lubC
wskazuje dziesięć mniej, więc czterdzieści toXL
(dziesięć mniej niż pięćdziesiąt), a dziewięćdziesiąt toXC
(dziesięć mniej niż sto)C
umieszczone przedD
lubM
wskazuje sto mniej, więc czterysta toCD
(sto mniej niż pięćset), a dziewięćset toCM
(sto mniej niż tysiąc)
Na przykład,MCMIV
to tysiąc dziewięćset cztery, 1904 (M
to tysiąc,CM
to dziewięćset iIV
cztery).Niektóre przykłady współczesnego użycia cyfr rzymskich obejmują:
1954 asMCMLIV
; 1990 jakoMCMXC
; 2014 jakoMMXIV
ŹRÓDŁO
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem swojego kodu.
- W razie potrzeby dodaj również wyjaśnienie.
Przypadki testowe:
100 -> 67
1 -> 73
4 -> 159
22 -> 322
5000 -> 261
2016 -> 401
1000000000 -> 427
1991 -> 449
9999 -> 800
1111111111 -> 2344
2147483647 -> 5362
źródło
9999
->M(X)CMXCIX
->77+263+67+77+88+67+73+88
->800
i2147483647
->((MMCXLV)MMCDLXXX)MMMDCXLVII
->427+427+417+438+426+436 + 252+252+242+243+251+263+263+263 + 77+77+77+68+67+88+76+86+73+73
->5362
. Więc poprawiłem drugi, ale9999
był poprawny.2222222222
nie znajduje się w podanym zakresie. Też się zgadzam5362
.Odpowiedzi:
Mathematica,
181173166151 bajtówGrał w golfa
Bez golfa
RomanNumeral
Implementacja Mathematica daje (IX) CMXCIX dla 9999, więc program zwraca 971 dla tej liczby.Jak napisano, cyfra rzymska typu ((...)) (...) ... zwraca zagnieżdżoną listę kodów ASCII dla cyfr rzymskich o długości 4, ((...)) ... zwraca listę o długości 3, (...) ... zwraca listę o długości 2 i ... zwraca listę o długości 1. Ostatni wiersz konwertuje te reguły na odpowiednią liczbę makronów dla każdej sekcji list, dodaje te makra do, a następnie sumuje całą zagnieżdżoną listę, aby zwrócić dane wyjściowe.
źródło
Python 3,
281278273269 bajtówMoja pierwsza próba codegolf, proszę bardzo. Próbowałem to zrobić, nie patrząc na powiązane pytanie, więc prawdopodobnie jest to okropne :)
8 bajtów mniejszych, dzięki Gáborowi Fekete
Nie golfowany:
źródło
return 0 if n==0 else
zreturn 0if n<1else
f
, gdy nazwa funkcji tog
.n//9*10>=10*l
abyn//9>=l
zaoszczędzić trochę więcej.Rubinowy, 188 bajtów
Dostosowanie oparte na mojej starej odpowiedzi Ruby na konwersję cyfr rzymskich . Wypróbuj online!
źródło
Mathematica, 198 bajtów
Niestety, wbudowane niewiele tu pomaga, ale jestem pewien, że można w niego grać o wiele więcej.
Uwaga: ocenia
9999 -> 971
zgodnie z tutaj .źródło
Partia, 373 bajtów
Działa poprzez tłumaczenia każdą cyfrę numeru według tabeli odnośników do wartości 1, 4, 5 i 9. zastosowań
M(V)
,M(X)
,(M(V))
i(M(X))
. Jeśli wolisz(IV)
,(IX)
,((IV))
a((IX))
następnie wykorzystaćcall:l 77 509 261 511
icall:l 252 859 436 861
odpowiednio.źródło
JavaScript (ES6), 183 bajtów
Uwaga: preferuje nie tylko
(IV)
doM(V)
, ale również preferuje(VI)
się(V)M
; w rzeczywistości użyje M tylko na samym początku numeru.źródło
Python, 263 bajty
źródło
R, 115 bajtów
Więc ... Publikuję swoje rozwiązanie, ponieważ uważam, że pytanie jest dość interesujące. Zrobiłem mój najlepszy z R 's zdolności do radzenia sobie z liczbami rzymskimi bez pakietów: można tylko wejście numery między
1
i3899
, jako żeas.roman
jest dokumentacja wyjaśnia.Właśnie dlatego oszukałem trochę, podając zakres od
1
do w pętli:jest to długośćwyjścia (). W rzeczywistości, zgodnie z tą witryną , najdłuższa liczba rzymska to (14 znaków), co odpowiada11
14
for
as.roman(3899)
MMMDCCCXCIX
MMDCCCLXXXVIII
2888
.Ponadto nie można obliczyć
length
wyniku tej funkcji.Jeśli ktoś widzi rozwiązanie tego problemu, prosimy o komentarz.
źródło
Python 3, 315 bajtów
Wersja bez golfa:
Wyjaśnienie: Ta wersja wykorzystuje inne podejście, zlicza występowanie cyfr rzymskich w liczbie.
[abs(((n-4)%5)-1)]
jest liczbąI
s cyfrą rzymską.[((n+10**g)//(10**g*5))%2for g in r(10)]
jest liczbąV,L,D,(V),(L),(D),((V)),((L)),((D))
s w liczbie.[(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)]
jest liczbąX,C,M,(X),(C),(M),((X)),((C)),((M))
s w liczbie.Następnie mnoży wystąpienia przez wartość znaku i zwraca jego sumę.
źródło