Twoim zadaniem jest konwersja danej dodatniej liczby całkowitej z cyfr arabskich na rzymską.
Sprawa staje się trudna, gdy policzysz do 4000.
Romanie zrobili to, dodając linię powyżej symbolu, aby pomnożyć ten symbol 1 000
. Jednak podkreślenia nie są dokładnie wyświetlane w ASCII. Istnieją również podwójne linie, aby pomnożyć symbol 1 000 000
, a następnie trzy linie, aby pomnożyć symbol 1 000 000 000
, itp ...
Dlatego postanowiłem użyć nawiasów, aby zastąpić podkreślenia.
Symbole można indywidualnie umieszczać w nawiasach. Na przykład, zarówno (VI)
i (V)(I)
są ważne reprezentacje 6 000
. (V)M
jest również prawidłową reprezentacją 6000.
(I)
jest prawidłowym sposobem reprezentacji 1 000
.
Przypadki testowe
Input: 1
Output: I
Input: 2
Output: II
Input: 3
Output: III
Input: 4
Output: IV
Input: 15
Output: XV
Input: 40
Output: XL
Input: 60
Output: LX
Input: 67
Output: LXVII
Input: 400
Output: CD
Input: 666
Output: DCLXVI
Input: 3000
Output: MMM
Input: 3999
Output: MMMCMXCIX
Input: 4000
Output: M(V)
Input: 4999
Output: M(V)CMXCIX
Input: 6000
Output: (VI)
Input: 6000000
Output: ((VI))
Input: 6006000
Output: ((VI)VI)
Input: 6666666666
Output: (((VI)DCLXVI)DCLXVI)DCLXVI
Punktacja
To jest golf golfowy . Najkrótszy kod w bajtach wygrywa.
code-golf
arithmetic
roman-numerals
Leaky Nun
źródło
źródło
(IV)
akceptowalna reprezentacja wynosi 4000?Odpowiedzi:
Mathematica, 67 bajtów
Pozwala uniknąć kłopotów z
M
konwersją danych wejściowych na bazę 1000 i konwersją każdej cyfry osobno za pomocąRomanNumeral
. Następnie składamy je, wkładając(...)
od lewej.Niestety Mathematica reprezentuje zera,
N
dlatego musimy się ich pozbyć.źródło
RomanNumeral
mogę to zrobić?MMMM
za4000
to tylko zacznie działać do specyfikacji w5000
(i wtedy masz ten sam problem dla4000000
etc.). Nawet wtedy używa overbarów zamiast nawiasów. Jeśli nie masz nic przeciwko, powinieneś to powiedzieć w specyfikacji wyzwania.JavaScript (ES6), 136 bajtów
W przypadku liczb poniżej 4000 powtarza każdą rzymską „literę” tyle razy, ile to możliwe, używając listy rzymskich „liter” i ich wartości dziesiętnych. W przeciwnym razie rekurencyjnie buduje odpowiedź z dywizji i modulo z 1000. Na szczęście
repeat
obcina się, więc nie muszę tego robić sam.źródło
Common Lisp, 108
Nie golfił
Testy
Dwa testy dają inne wyniki niż te z pytania:
źródło
R, 134
To nie jest najlepsza opcja, ale myślę, że pomysł powinien być podobny do tego.
źródło
Python, 188
194-6 bajtów od pozbycia się białych znaków
To wyzwanie przypomniało mi, kiedy uczyłem się programowania ...
To może nie być najkrótsze rozwiązanie, ale dobrze się bawiłem grając w ten problem.
Wypróbuj to!
źródło
Rubin,
137134130 bajtówFunkcja rekurencyjna, która zwraca ciąg. Jeśli to możliwe, staram się zagrać w kodowanie numeryczne, ale nie jestem pewien, jak to zrobić.
Ups, to praktycznie bezpośredni port odpowiedzi ES6 @ Neila.
źródło
Rubin,
185 161144 bajtówWydaje mi się, że ponad rok po opublikowaniu postu nauczyłem się czegoś o golfie.
Dziękuję Value Ink za cenne komentarze.
źródło
gsub
może przyjąć ciąg znaków jako pierwszy argument, eliminując potrzebę podstawienia do wzorca wyrażenia regularnego, ponieważs.gsub! x,y
robi to automatycznie. Poza tym prawdopodobnie możesz po prostu zrezygnować z przypisaniaa
tablicy, ponieważ używasz jej tylko raz i umieszczasz bezpośrednio weach_slice
wywołaniu."IVXXLCCDM".scan(/(.)(.)(.)/){|x,b,c|...
też działar[x]
Jest również funkcjonalnie równoważny zar.(x)
każdym razem, gdy w grę zaangażowane są mocne lambdyr[x]
sztuczka przyda się w moim rekurencyjnym golfie w rubinach!TCL 134 bajty
Wypróbuj tutaj: https://rextester.com/BJC92885
źródło