Twoja funkcja przyjmuje liczbę naturalną i zwraca najmniejszą liczbę naturalną, która ma dokładnie taką liczbę dzielników, w tym siebie.
Przykłady:
f(1) = 1 [1]
f(2) = 2 [1, 2]
f(3) = 4 [1, 2, 4]
f(4) = 6 [1, 2, 3, 6]
f(5) = 16 [1, 2, 4, 8, 16]
f(6) = 12 [1, 2, 3, 4, 6, 12]
...
Funkcja nie musi zwracać listy dzielników, są one tylko dla przykładów.
Odpowiedzi:
APL,
252423 znakówDefiniuje funkcję,
f
której można następnie użyć do obliczenia liczb:Rozwiązanie wykorzystuje fakt, że LCM (n, x) == n iff x dzieli n . Zatem blok
{+/⍵=⍵∧⍳⍵}
po prostu oblicza liczbę dzielników. Ta funkcja jest stosowana do wszystkich liczb od 1 do 2 ^ d¨⍳2*⍵
. Wynikowa lista jest następnie przeszukiwana pod kątem samej d (⍳⍵
), która jest pożądaną funkcją f (d) .źródło
{⍵⍳⍨(+/⊢=⊢∧⍳)¨⍳2*⍵}
f
.GolfScript,
2928 znakówEdycja: Pojedynczy znak może zostać zapisany, jeśli ograniczymy wyszukiwanie do <2 ^ n, dzięki Peterowi Taylorowi za ten pomysł.
Poprzednia wersja:
Próba w GolfScript, uruchom online .
Przykłady:
Kod zawiera zasadniczo trzy bloki, które zostały szczegółowo wyjaśnione w poniższych wierszach.
źródło
1
.Python: 64
Przeglądając rozwiązanie Bakuriu i włączając sugestię grc, a także sztuczkę z rozwiązania R plannapusa, otrzymujemy:
źródło
Python: 66
Powyższe podniesie wartość
RuntimeError: maximum recursion depth exceeded
przy niewielkich nakładach w CPython, a nawet ustawienie limitu na ogromną liczbę prawdopodobnie spowoduje pewne problemy. W implementacjach Pythona, które optymalizują rekurencję ogona, powinno działać dobrze.A more verbose version, which shouldn't have such limitations, is the following 79 bytes solution:
źródło
if else
withand or
and==1
with<1
:f=lambda n,k=1:n==sum(k%i<1for i in range(1,k+1))and k or f(n,k+1)
sum(k%-~i<1for i in range(k))
f=lambda n,k=1:n==sum(k%-~i<1for i in range(k))or-~f(n,k+1)
saves 7 bytes.Mathematica
3836Usage:
Result:
Edit
Some explanation:
As
form[i]
I am using the function1 &
, that returns always1
, so effectively computing the sum of the divisors in a terse way.źródło
DivisorSum
returns (the sum of the divisors) but I don't see how that is instrumental for answering the question posed. Would you explain how it works. BTW, I think you should include timing data for n=200; the function is remarkably fast, given all the numbers it had to check.J, 33 chars
Fairly quick, goes through all smaller numbers and computes number of divisors based on factorization.
źródło
Haskell 54
Quick and dirty (so readable and non-tricky) solution:
źródło
K, 42
Inefficient recursive solution that blows up the stack quite easily
.
źródło
APL 33
Example:
źródło
APL (25)
źródło
R - 47 characters
!n%%1:n
gives a vector of booleans: TRUE when an integer from 1 to n is a divisor of n and FALSE if not.sum(!n%%1:n)
coerces booleans to 0 if FALSE and 1 if TRUE and sums them, so thatN-sum(...)
is 0 when number of divisors is N. 0 is then interpreted as FALSE bywhile
which then stops.Usage:
źródło
Javascript 70
Really there are only 46 meaningful characters:
I probably should learn a language with shorter syntax :)
źródło
N=>eval("for(j=i=m=1;m-N||j-i;j>i?i+=m=j=1:m+=!(i%++j));i")
Haskell: 49 characters
It could be seen as an improvement of the earlier Haskell solution, but it was conceived in its own right (warning: it's very slow):
It's quite an interesting function, for example note that f(p) = 2^(p-1), where p is a prime number.
źródło
n
into primes (with repetition), sort descending, decrement each one, zip with an infinite sequence of primes, and then fold the product ofp^(factor-1)
C:
6664 charactersAn almost short solution:
And my previous solution that doesn't recurse:
Much shorter solutions must exist.
źródło
Haskell (120C), a very efficient method
Test code:
This method is very fast. The idea is first to find the prime factors of
k=p1*p2*...*pm
, where p1 <= p2 <= ... <= pm. Then the answer isn = 2^(pm-1) * 3^(p(m-1)-1) * 5^(p(m-2)-1) ...
.For example, factorizing k=18, we get 18 = 2 * 3 * 3. The first 3 primes is 2, 3, 5. So the answer n = 2^(3-1) * 3^(3-1) * 5^(2-1) = 4 * 9 * 5 = 180
You can test it under
ghci
:źródło
Brachylog, 2 bytes
Try it online!
Takes input through its output variable and outputs through its input variable.
This exact same predicate, taking input through its input variable and outputting through its output variable, solves this challenge instead.
źródło
C, 69 chars
Not the shortest, but the first C answer:
f(n,s)
counts divisors ofn
in the range1..s
. Sof(n,n)
counts divisors ofn
.g(d)
loops (by recursion) untilf(x,x)==d
, then returns x.źródło
Mathematica
3836Usage
First entry (before the
code-golf
tag was added to the question.)A straightforward problem, given that
Divisors[n]
returns the divisors ofn
(includingn
) andLength[Divisors[n]]
returns the number of such divisors.**Examples
źródło
Length@Divisors@n
isDivisorSigma[0,n]
.DivisorSigma
.Jelly, 6 bytes (non-competing)
Try it online! or verify all test cases.
How it works
źródło
2*
? Is it that every number after that has more divisors than n?2**(n-1)
belongs to that range, the smallest one does as well.C++, 87 characters
źródło
Python2, 95 characters, Non-recursive
A bit more verbose than the other python solutions but it's non-recursive so it doesn't hit cpython's recursion limit:
źródło
Perl 6, 39 chars
Example usage:
źródło