Wejście:
Dodatnia liczba całkowita n, która wynosi 1 <= n <= 25000
.
Wynik:
- W tej sekwencji zaczynamy od liczby dziesiętnej 1 / n .
- Następnie bierzemy sumę cyfr aż do n -tej cyfry po przecinku (indeks 1); następnie suma cyfr w górę do ( n -1), następnie ( n -2), itd. Kontynuuj, aż n będzie 1.
- Dane wyjściowe są sumą wszystkich tych razem.
Na przykład:
n = 7
1/7 = 0.1428571428...
7th digit-sum = 1+4+2+8+5+7+1 = 28
6th digit-sum = 1+4+2+8+5+7 = 27
5th digit-sum = 1+4+2+8+5 = 20
4th digit-sum = 1+4+2+8 = 15
3rd digit-sum = 1+4+2 = 7
2nd digit-sum = 1+4 = 5
1st digit = 1
Output = 28+27+20+15+7+5+1 = 103
Zasady konkursu:
- Jeśli po przecinku 1 / n nie ma n cyfr po przecinku, brakujące będą liczone jako 0 (tj
1/2 = 0.50 => (5+0) + (5) = 10
.). - Bierzesz cyfry bez zaokrąglania (tzn. Cyfry
1/6
są166666
i nie166667
)
Główne zasady:
- 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.
Pierwsze 1–50 w sekwencji:
0, 10, 18, 23, 10, 96, 103, 52, 45, 10, 270, 253, 402, 403, 630, 183, 660, 765, 819, 95, 975, 1034, 1221, 1500, 96, 1479, 1197, 1658, 1953, 1305, 1674, 321, 816, 2490, 2704, 4235, 2022, 3242, 2295, 268, 2944, 3787, 3874, 4097, 1980, 4380, 4968, 3424, 4854, 98
Ostatnie 24990 - 25000 w sekwencji:
1405098782, 1417995426, 1364392256, 1404501980, 1408005544, 1377273489, 1395684561, 1405849947, 1406216741, 1142066735, 99984
code-golf
sequence
number-theory
Kevin Cruijssen
źródło
źródło
Odpowiedzi:
Galaretka , 9 bajtów
Raczej powolny, ale krótki. Wypróbuj online! lub sprawdź pierwsze 50 przypadków testowych .
Jak to działa
źródło
Mathematica, 42 bajty
lub
lub
Wyjaśnienie
Weź przykład ze specyfikacji wyzwania. Chcemy obliczyć:
Zmiana układu to:
gdzie
.
jest iloczyn skalarny dwóch wektorów.To prawie wszystko rozwiązanie.
Daje nam to pierwsze
N
cyfry dziesiętne1/N
(#&@@
wyodrębnia pierwszy elementRealDigits
wyniku, ponieważ zwraca również przesunięcie pierwszej cyfry, o którą nie dbamy).Następnie otrzymujemy listę od
N
dołu do1
albo za pomocą(#-Range@#+1)
alboRange[#,1,-1]
, oba są krótsze niżReverse@Range@#
, i bierzemy iloczyn skalarny.Zamiast tego alternatywne rozwiązanie
Accumulate
oblicza listę wszystkich sum prefiksów, a następnie sumuje te sumy prefiksówTr
.Ponieważ jest to naprawdę szybkie nawet w przypadku dużych danych wejściowych, oto wykres rozproszenia sekwencji do
N = 100,000
(zrobienie ich wszystkich i wykreślenie ich zajęło jednak trochę czasu):Kliknij, aby zobaczyć większą wersję.
Niebieska linia to naiwna górna granica
9 N (N+1) / 2
(jeśli wszystkie cyfry dziesiętne były9
), a pomarańczowa linia to dokładnie połowa tej granicy. Nic dziwnego, że jest to bezpośrednio w głównej gałęzi wykresu, ponieważ statystycznie spodziewalibyśmy się, że średnia cyfra wyniesie 4,5.Cienka linia punktów wykresu widoczna poniżej głównej gałęzi to ułamki, które kończą się
...3333...
, ponieważ wszystkie leżą bardzo blisko siebie3 N (N+1) / 2
.źródło
05AB1E ,
1211 bajtówWypróbuj online! lub pakiet testowy dla pierwszych 50 numerów.
Wyjaśnienie
Bardziej wydajna wersja do wypróbowywania dużych liczb w TIO
Różnica w stosunku do krótszej wersji polega na tym, że sumujemy iloczyn cyfr i odwrócenie ich indeksu opartego na 1 zamiast sumowania cyfr w prefiksach.
Wypróbuj online!
źródło
Java 8,
181169166153 153142 bajtówWyjaśnienie:
Wypróbuj tutaj.
źródło
PHP,
6665 bajtówNa podstawie tej odpowiedzi (również przeze mnie): Podział niezbyt małych liczb i sugerowana edycja Jörga Hülsermanna. Użyj jak:
edycja: poprawiono błąd dla +1 bajtów i spasował przypisanie $ a do $ argv [1] dla -2 bajtów dla 1 bajta mniej netto.
źródło
Scala, 84 bajtów
Nie golfowany:
Wyjaśnienie:
Mógłbym zaoszczędzić kilka bajtów, wykorzystując sposób, w jaki kompilator tokenizuje: Wywołując argument
&
, możesz pisać1 to&map
zamiast1 to n map
. Ta sama zasada dotyczydef?
.źródło
Galaretka , 11 bajtów
TryItOnline
First 50
Zbyt wolny dla dużych przypadków testowych.
W jaki sposób?
źródło
R⁵*
jako ekwiwalent od lewej do prawej, ale potem ten piękny prostą :)PHP, 76 bajtów
(Edytuj -1 bajtów - Dzięki użytkownik 59178 - Twoje rozwiązanie jest jeszcze lepsze)
źródło
$c=blah
do pierwszej częścifor(;;)
MATL, 19 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Groovy, 87 bajtów
Było to mniej bolesne niż się spodziewałem i opiera się na mojej odpowiedzi tutaj :
Wyjaśnienie
1.0g
- Użyj notacji BigDecimal dla tego jednego..divide(n, n, 1)+""
- Podziel przez n z dokładnością n (tylko funkcja BigDecimal) i przekonwertuj na str.(...)[2..x+1].getChars()
- Pobierz podciąg bieżącej iteracji jako tablicę znaków char..sum()-48*(x)
- Zsumuj wartości ASCII znaków i zmniejsz o 48 dla każdego elementu. To zmienia wartość z cyfry ASCII na liczbę całkowitą, zasadniczo oszczędzając bajty*.toInteger()
.(1..n).collect{...}.sum()
- Iteruj po każdej cyfrze w podziale, wykonując tę funkcję, umieść je wszystkie w jednej tablicy i sumie.Zaoszczędzono 2 bajty i poświęcono wydajność ...
Jest to bardziej wydajna wersja, która nie przelicza BigDecimal przy każdej iteracji.
źródło
J, 27 bajtów
Stosowanie
Dane wejściowe to rozszerzona liczba całkowita.
Wydajność jest dobra i wymaga tylko około 3 sekund na obliczenie dużych przypadków testowych.
Wyjaśnienie
źródło
Galaretka , 10 bajtów
Nie najkrótsze podejście , ale dość wydajne. Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Python 2, 90 bajtów
Niezbyt ładne, ale zrobione przez dzielenie zmiennoprzecinkowe, a następnie konwersję na ciąg, a następnie iteracyjny wybór indeksu ciągów, aby uzyskać trójkąt liczb, a następnie wykonać odczyt listy i przekonwertować każdy znak na liczbę całkowitą, a na końcu zsumować je wszystkie.
źródło
JavaScript (ES6), 47 bajtów
Jak to działa
Ta odpowiedź pokazuje technikę obliczania c cyfr dziesiętnych a / b :
Będzie to doskonały punkt wyjścia do tego wyzwania. Najpierw możemy go nieco zmienić, aby obliczał b cyfry dziesiętne 1 / b , zmieniając kolejność parametrów i ustawiając wartości domyślne:
Następnie możemy to zmienić, tak aby obliczał sumę pierwszych b cyfr dziesiętnych, zamiast je łączyć (eliminuje to
d
parametr):Jesteśmy prawie na rozwiązaniu; teraz musimy tylko pomnożyć każdą cyfrę przez c + 1 :
Hmm, to wydaje się trochę długie. Co jeśli zwiększymy c o 1 na początek?
To oszczędza jeden bajt. A oto sposób na uratowanie jeszcze jednego:
A teraz mamy naszą odpowiedź.
f(7)
to 103,f(11)
to 270,f(1)
to ... 2? Och, zapomnieliśmy wziąć pod uwagę przypadek, w którym a / b wynosi 1 przy pierwszej iteracji (tj. B wynosi 1). Zróbmy coś z tym:1 mod b wynosi zawsze 1 , chyba że b wynosi 1 , w którym to przypadku będzie wynosić 0 . Nasz program jest teraz poprawny dla wszystkich danych wejściowych, przy 47 bajtach .
źródło
Python 2, 49 bajtów
Przetestuj na Ideone .
źródło
C, 53 bajty
Poniżej głównej do wykonania testu ...
źródło
f(n,i,x,s){while(i)x=10*(x%n),s+=i--*(x/n);return s;}
ma tylko 53 bajty.