Napisz program lub funkcję, która przyjmuje na wejściu liczbę całkowitą z zakresu 1..3999 i zwraca liczbę segmentów linii wymaganych do wyrażenia tej liczby całkowitej za pomocą standardowych cyfr rzymskich (więc użyłbyś XL, ale nie VM). Przykłady:
1 -> 1
4 -> 3
5 -> 2
9 -> 3
10 -> 2
40 -> 4
50 -> 2
90 -> 3
100 -> 1
400 -> 3
500 -> 2
900 -> 5
1000 -> 4
Wbudowane konwersje liczb rzymskich są dozwolone, ale można rozwiązać problem bez nich, odejmując wielokrotnie największą pozostałą liczbę z powyższej listy. Przykład: 1234 = 4 + 1 + 1 + 2 + 2 + 2 + 3 = 15.
To jest golf golfowy , więc wygrywa najkrótszy program.
Odpowiedzi:
Pyth,
927670 bajtówWypróbuj tutaj!
Dzięki @FryAmTheEggman za sugestie dotyczące pakowania ciągów, które pozwoliły mi zaoszczędzić trochę bajtów!
Nadal zastanawiam się, czy istnieje matematyczny sposób kodowania tej listy. Spróbuję coś wymyślić.
Wyjaśnienie
Używa podanego algorytmu.
K
zawiera podaną listę z naprzemiennie liczbami i odpowiednią liczbą segmentów linii. Ta lista jest tworzona przez dzielenie spakowanego łańcucha, który jest dekodowany0/0/1/1/4/3/5/2/9/3/10/2/40/4/50/2/90/3/100/1/400/3/500/2/900/5/1000/4
,/
włączany i odwzorowywany na każdy element na liczbę całkowitą.źródło
C,
148129 znakówMój pierwszy golf-code: ^). Ponieważ pytanie mówi, że mogę użyć funkcji, zmieniłem main na funkcję w celu przycięcia niektórych znaków (co najważniejsze: przekaż c jako parametr raczej scanf)
rozpakowany
źródło
Mathematica,
8072 bajtówAnonimowa funkcja, która po prostu konwertuje liczby na cyfry rzymskie, zastępuje każdy znak liczbą segmentów i pobiera sumę.
źródło
Siatkówka, 128 bajtów
Prosta wymiana, dopóki nie zostanie nic do wymiany. Następnie liczone są apostrofy i to jest nasza liczba segmentów linii.
Jeśli wejście i wyjście w unarnym są dozwolone, ma to 115 bajtów (chociaż kto chciałby wpisać 1234?).
Wypróbuj online!
Wypróbuj online! (jednoargumentowe IO)
źródło
Python 3, 95 bajtów
Ciąg Unicode składa się z punktów kodowych:
źródło
e=ord(e);
Java, 152 bajty
Ponieważ, wiesz, Java.
Prosta dosłowna implementacja danego algorytmu. Tablica zawiera informacje o transformacji: parzyste indeksy są o jeden mniejsze niż liczba rzymska, a nieparzyste są liczbą dla tej liczby.
To jest lambda, która przyjmuje i zwraca
int
/Integer
. Obejmuje toIntUnaryOperator
lubUnaryOperator<Integer>
.źródło
JavaScript (ES6), 79 bajtów
Ciągi reprezentują liczbę segmentów linii dla jednostek, dziesiątek i setek cyfr. (Tysiące to po prostu czterokrotność cyfry tysięcy). Ta metoda wydaje się krótsza niż inne opcje, takie jak algorytm sugerowany w pytaniu.
Edycja: Zapisano 2 bajty dzięki @ user81655.
źródło
n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4
+
s na-
s pozwala mi usunąć wiodące+
, ale wtedy grupowanie zapisuje kolejny bajt.