Ihre Funktion nimmt eine natürliche Zahl und gibt die kleinste natürliche Zahl zurück, die genau so viele Teiler enthält, einschließlich sich selbst.
Beispiele:
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]
...
Die Funktion muss nicht die Liste der Teiler zurückgeben, sie sind nur für die Beispiele hier.
Antworten:
APL,
252423 ZeichenDefiniert eine Funktion
f
, mit der die Zahlen berechnet werden können:Die Lösung nutzt die Tatsache, dass LCM (n, x) == n, wenn x n teilt . Der Block
{+/⍵=⍵∧⍳⍵}
berechnet also einfach die Anzahl der Teiler. Diese Funktion gilt für alle Zahlen von 1 bis 2 ^ d¨⍳2*⍵
. Die resultierende Liste wird dann nach d selbst (⍳⍵
) durchsucht, was die gewünschte Funktion f (d) ist .quelle
{⍵⍳⍨(+/⊢=⊢∧⍳)¨⍳2*⍵}
f
.GolfScript,
2928 ZeichenBearbeiten: Ein einzelnes Zeichen kann gespeichert werden, wenn wir die Suche auf <2 ^ n beschränken. Dank an Peter Taylor für diese Idee.
Vorherige Version:
Ein Versuch in GolfScript, online auszuführen .
Beispiele:
Der Code enthält im Wesentlichen drei Blöcke, die in den folgenden Zeilen ausführlich erläutert werden.
quelle
1
.Python: 64
Wenn wir Bakurius Lösung überarbeiten und den Vorschlag von grc sowie den Trick aus der R-Lösung von plannapus einbeziehen, erhalten wir:
quelle
Python: 66
Das obige löst
RuntimeError: maximum recursion depth exceeded
bei kleinen Eingaben in CPython einen aus, und selbst das Festlegen des Grenzwerts auf eine große Anzahl wird wahrscheinlich einige Probleme verursachen. Bei Python-Implementierungen, die die Schwanzrekursion optimieren, sollte dies problemlos funktionieren.Eine ausführlichere Version, die keine solchen Einschränkungen haben sollte, ist die folgende 79- Byte-Lösung:
quelle
if else
mitand or
und==1
mit<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)
spart 7 Bytes.Mathematica
3836Verwendung:
Ergebnis:
Bearbeiten
Einige Erklärungen:
Da
form[i]
ich die Funktion verwende1 &
, kehrt diese immer zurück1
und berechnet die Summe der Teiler auf eine knappe Art und Weise.quelle
DivisorSum
zurückkommt (die Summe der Teiler), aber ich sehe nicht, wie dies für die Beantwortung der gestellten Frage von Bedeutung ist. Würden Sie erklären, wie es funktioniert? BTW, ich denke, Sie sollten Timing-Daten für n = 200 einschließen; Die Funktion ist bemerkenswert schnell, wenn man alle Zahlen berücksichtigt, die überprüft werden mussten.J, 33 Zeichen
Ziemlich schnell, durchläuft alle kleineren Zahlen und berechnet die Anzahl der Teiler basierend auf der Faktorisierung.
quelle
Haskell 54
Schnelle und schmutzige (also lesbare und nicht schwierige) Lösung:
quelle
K, 42
Ineffiziente rekursive Lösung, die den Stapel leicht in die Luft jagt
.
quelle
APL 33
Beispiel:
quelle
APL (25)
quelle
R - 47 Zeichen
!n%%1:n
ergibt einen Vektor von Booleschen Werten: TRUE, wenn eine Ganzzahl von 1 bis n ein Teiler von n ist, andernfalls FALSE.sum(!n%%1:n)
Erzwingt boolesche Werte zu 0, wenn FALSE und 1, wenn TRUE und summiert sie, so dassN-sum(...)
0 ist, wenn die Anzahl der Teiler N ist. 0 wird dann als FALSE interpretiert,while
wodurch dann aufhört.Verwendung:
quelle
Javascript 70
Wirklich gibt es nur 46 sinnvolle Zeichen:
Ich sollte wahrscheinlich eine Sprache mit kürzerer Syntax lernen :)
quelle
N=>eval("for(j=i=m=1;m-N||j-i;j>i?i+=m=j=1:m+=!(i%++j));i")
Haskell: 49 buchstaben
Es könnte als Verbesserung der früheren Haskell-Lösung angesehen werden, wurde jedoch eigenständig konzipiert (Warnung: Es ist sehr langsam):
Es ist eine interessante Funktion, zum Beispiel, dass f (p) = 2 ^ (p-1) ist, wobei p eine Primzahl ist.
quelle
n
Primzahlen (mit Wiederholung) zu zerlegen, absteigend zu sortieren, jede einzelne zu dekrementieren, mit einer unendlichen Folge von Primzahlen zu zipen und dann das Produkt vonp^(factor-1)
C:
6664 ZeichenEine fast kurze Lösung:
Und meine bisherige Lösung, die nicht wiederkehrt:
Es müssen viel kürzere Lösungen existieren.
quelle
Haskell (120C), eine sehr effiziente Methode
Testcode:
Diese Methode ist sehr schnell. Die Idee ist zunächst, die Primfaktoren von zu finden
k=p1*p2*...*pm
, wobei p1 <= p2 <= ... <= pm. Dann lautet die Antwortn = 2^(pm-1) * 3^(p(m-1)-1) * 5^(p(m-2)-1) ...
.Wenn wir zum Beispiel k = 18 faktorisieren, erhalten wir 18 = 2 * 3 * 3. Die ersten 3 Primzahlen sind 2, 3, 5. Also ist die Antwort n = 2 ^ (3-1) * 3 ^ (3-1) * 5 ^ (2-1) = 4 * 9 * 5 = 180
Sie können es testen unter
ghci
:quelle
Brachylog , 2 Bytes
Probieren Sie es online!
Übernimmt die Eingabe über die Ausgabevariable und gibt sie über die Eingabevariable aus.
Dieses exakt gleiche Prädikat, das Eingaben über seine Eingabevariable und Ausgaben über seine Ausgabevariable nimmt, löst stattdessen diese Herausforderung .
quelle
C 69 Zeichen
Nicht die kürzeste, sondern die erste C-Antwort:
f(n,s)
zählt Teilern
im Bereich1..s
. Sof(n,n)
zählt Teilern
.g(d)
Schleifen (durch Rekursion) bisf(x,x)==d
, dann wird x zurückgegeben.quelle
Mathematica
3836Verwendung
Erster Eintrag (vor dem
code-golf
Hinzufügen des Tags zur Frage)Ein einfaches Problem, da
Divisors[n]
die Teiler vonn
(einschließlichn
) undLength[Divisors[n]]
die Anzahl solcher Teiler zurückgegeben werden. **Beispiele
quelle
Length@Divisors@n
istDivisorSigma[0,n]
.DivisorSigma
.Gelee , 6 Bytes (nicht konkurrierend)
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
2*
? Hat jede Zahl danach mehr Teiler als n?2**(n-1)
zu diesem Bereich gehört, tut dies auch der kleinste.C ++, 87 Zeichen
quelle
Python2, 95 Zeichen, nicht rekursiv
Ein bisschen ausführlicher als die anderen Python-Lösungen, aber nicht rekursiv, sodass das Rekursionslimit von cpython nicht überschritten wird:
quelle
Perl 6 , 39 Zeichen
Anwendungsbeispiel:
quelle