Dzielnikiem liczby n jest dowolna liczba, która równomiernie dzieli n , w tym 1 i n samo. Liczba dzielników d (n) to liczba dzielników, które ma liczba. Oto d (n) dla pierwszej pary n:
n divisors d(n)
1 1 1
2 1, 2 2
3 1, 3 2
4 1, 2, 4 3
5 1, 5 2
6 1, 2, 3, 6 4
Możemy wielokrotnie odejmować liczbę dzielników od liczby. Na przykład:
16 = 16
16 - d(16) = 16 - 5 = 11
11 - d(11) = 11 - 2 = 9
9 - d( 9) = 9 - 3 = 6
6 - d( 6) = 6 - 4 = 2
2 - d( 2) = 2 - 2 = 0
W tym przypadku zajęło 5 kroków, aby uzyskać 0.
Napisz program lub funkcję, która podając nieujemną liczbę n zwraca liczbę kroków, które należy wykonać, aby zmniejszyć ją do zera przez wielokrotne odejmowanie liczby dzielników.
Przykłady:
0, 0
1, 1
6, 2
16, 5
100, 19
100000, 7534
Odpowiedzi:
Galaretka,
109 bajtów1 bajt dzięki Dennisowi ♦ .
Port mojej odpowiedzi w Pyth .
Wypróbuj online!
Zestaw testowy.
Wyjaśnienie
źródło
Python, 49 bajtów
orlp pomógł uratować bajt! Sp3000 zaoszczędził jeszcze dwa. Dzięki!
źródło
-~
don%-~k
i usuwając dolną granicę zakresu.C, 52 bajty
źródło
Pyth, 10 bajtów
Zestaw testowy.
Wyjaśnienie
źródło
Julia, 31 bajtów
Prosta implementacja rekurencyjna.
źródło
MATL , 14 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6),
6451 bajtówNie pytaj mnie, dlaczego niepotrzebnie korzystałem z rekurencji ogona.
źródło
Java,
14793źródło
n=new Integer(100000)
zamiastn=100000
?05AB1E,
1210 bajtówKod:
Wyjaśnienie:
Wypróbuj online
Edycja: 2 bajty zapisane i błąd z wejściem 0 naprawiony dzięki @Adnan
źródło
[Ð>#Ñg-¼]¾
. Musi istnieć sposób, aby go skrócić ...D0Q#
część jest za przyrostem licznika.[Ð>#Ñg-¼]¾
Kod powinien pracować0
chociaż :).R, 50 bajtów
Dość prosta implementacja. Wypróbuj online
źródło
Mathcad, [tbd] bajty
Schemat równoważności bajtów Mathcada nie został jeszcze ustalony. Korzystając z przybliżonej równoważności klawiszy, program używa około 39 „bajtów”. Zauważ, że operatorzy while i dla programowania wykonują tylko jedną operację klawiatury, aby wprowadzić (odpowiednio ctl-] i ctl-shft- #) - w rzeczywistości można je wprowadzić tylko z klawiatury.
To, co widzisz, jest dokładnie tym, co zostaje zapisane w arkuszu Mathcad. Mathcad ocenia równania / programy i umieszcza dane wyjściowe na tym samym arkuszu (np. Za operatorem oceny „=” lub na wykresie).
źródło
MATL, 13 bajtów
Wypróbuj online
Wyjaśnienie:
źródło
Mathematica, 35 bajtów
Wykorzystując stare dobre
DivisorSigma
. @ MartinBüttner zauważa następujące alternatywy:źródło
Hoon ,
9376 bajtówNie golfowany:
Zwraca funkcję, która pobiera atomu
r
. Utwórz wartość pośrednią, która zawiera wszystkich twórcówr
(Make list [1..n], zachowaj tylko te elementy, gdzie (mod ri) == 0). Jeślir
zero wynosi zero, w przeciwnym razie zwraca wartość przyrostu rekurencji z r równym r- (dzielniki długości).Kod „tak jak jest” zajmuje głupią ilość czasu na ocenę n = 100 000, całkowicie dlatego, że znalezienie twórców dużych liczb tworzy ogromną listę i mapy nad nią. Zapamiętywanie dzielników daje prawidłową moc wyjściową dla n = 10.000, ale nie zawracałem sobie głowy czekaniem na 100.000
źródło
Haskell,
434039 bajtówProste podejście rekurencyjne. Przykład użycia:
g 16
->5
.Edycja: @ Lynn zapisał
34 bajty. Dzięki!źródło
g(sum$signum.mod n<$>[1..n])
?min 1
jest o jeden bajt krótszy niżsignum
nawetPowerShell v2 +,
7467 bajtówWydaje się dość długi w porównaniu do niektórych innych odpowiedzi ...
Pobiera dane wejściowe
$n
, wchodzi wfor
pętlę z warunkiem$n
większym niż0
. W każdej iteracji pętli ustawiamy pomocnika$a
, a następnie zapętlamy każdą liczbę od1
do$n
. Każdą wewnętrzną pętlę sprawdzamy względem każdej liczby, aby sprawdzić, czy jest to dzielnik, a jeśli tak, zwiększamy naszego pomocnika$a
(używając logicznej negacji i niejawnego rzutowania na int). Następnie odejmujemy liczbę znalezionych dzielników$n-=$a
i zwiększamy licznik$o++
. Wreszcie produkujemy$o
.Wykonanie zajmuje dużo czasu, ponieważ jest to znacząca konstrukcja dla pętli for. Na przykład uruchomienie
n = 10,000
na moim komputerze (1-letni Core i5) zajmuje prawie 3 minuty.źródło
Rakieta -
126 bajtów Do 98 bajtów91 bajtówNiezwykle naiwne rozwiązanie - prawdopodobnie można by je znacznie ograniczyć dzięki porządnemu algorytmowi i niektórym sztuczkom seplenienia, których nie znamEdycja: wyjaśnienie na żądanie. Jak powiedziałem, jest to wyjątkowo naiwne rozwiązanie rekurencyjne i może być znacznie krótsze.
Edytuj wersję 2: 98 bajtów z mniej głupim algorytmem (wciąż dość głupi i może być krótszy)Wyjaśnienie:Edycja 3: Zapisano 7 bajtów, zastępując
(cdr(build-list x values))
je(build-list x add1)
źródło
> <> , 52 + 2 = 54 bajtów
Numer wejściowy musi być obecny na stosie przy starcie programu, więc jest +2 bajty dla
-v
flagi. Wypróbuj online!4 irytujące bajty zmarnowane na problemy z wyrównaniem. Bah.
Ten działa poprzez budowanie sekwencji od
n
do0
na stosie. Po osiągnięciu 0, wciśnij go i wypisz długość pozostałego stosu.Nawiasem mówiąc, działa w
O(n^2)
czasie, więc nie próbowałbymn = 100000
...źródło
-v
to jeden bajt, a nie dwa.> <> , 36 + 3 = 39 bajtów
Implementacja jest stosunkowo prosta, z każdą iteracją
sum(n%k>0 for k in range(1,n-1))
. +3 bajty dla-v
flagi na meta .Wypróbuj online!
źródło
Rubin, 42 bajty
Wystąpił błąd przepełnienia stosu w największym przypadku testowym
100000
, więc oto iteracyjna wersja w obrębie 49 bajtów . Jednak zajmuje to trochę czasu, biorąc pod uwagęO(N^2)
złożoność.źródło
Perl 5, 40 bajtów
Dane wejściowe i wyjściowe są listami wymaganej liczby kopii
1
.źródło
C #, 63 bajty
źródło
Właściwie 17 bajtów
Wypróbuj online! (uwaga: limit czasu ostatniego testu w TIO)
Wyjaśnienie:
źródło