Einführung
Dies ist eine sehr einfache Herausforderung: Zählen Sie einfach die Teiler einer Zahl. Wir hatten schon einmal eine ähnliche, aber kompliziertere Herausforderung , aber ich beabsichtige, diese für Einsteiger zu schaffen.
Die Herausforderung
Erstellen Sie ein Programm oder eine Funktion, die bei einer streng positiven Ganzzahl N
ausgibt oder zurückgibt, wie viele Teiler sie hat, einschließlich 1 und N
.
Eingabe: Eine ganze Zahl> 0. Sie können davon ausgehen, dass die Zahl im nativen numerischen Typ Ihrer Sprache dargestellt werden kann.
Ausgabe: Die Anzahl der positiven Ganzzahlteiler, einschließlich 1, und die Anzahl selbst.
Einsendungen werden in Bytes gewertet . Möglicherweise finden Sie diese Website hilfreich, obwohl Sie jede sinnvolle Methode zum Generieren Ihrer Byteanzahl verwenden können.
Das ist Code-Golf , also gewinnt die niedrigste Punktzahl!
Bearbeiten: Es sieht aus wie FryAmTheEggman 5-Byte-Pyth-Antwort ist der Gewinner! Sie können jedoch gerne neue Antworten einreichen. Wenn Sie etwas kürzer bekommen können, ändere ich die akzeptierte Antwort.
Testfälle
ndiv(1) -> 1
ndiv(2) -> 2
ndiv(12) -> 6
ndiv(30) -> 8
ndiv(60) -> 12
ndiv(97) -> 2
ndiv(100) -> 9
Bestenlisten
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
# Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
C ++C,4357564643 BytesAuf Anregung von Martin Büttner:
quelle
i,c;f(n){for(i=c=n;i;n%i--&&--c);return c;}
LabVIEW, 4938 Bytes
Nun, es ist offensichtlich nicht für Code-Golf geeignet, aber was auch immer, also für meinen ersten Beitrag und das Lolz hier geht.
quelle
.
, die ich ziemlich sicher als Tausendertrennzeichen, nicht als Dezimalpunkt (wie es in manchen Sprachen üblich ist), gemeint habe.Haskell, 28 Bytes
Der Trick dabei ist, zu testen, ob ein Rest
0
die Anzeigefunktion verwendet0^
.Dies funktioniert, weil jede positive Potenz von 0 0 ist, wohingegen 0 ^ 0 kombinatorisch das leere Produkt von 1 ist.
Vergleichen Sie dies mit Filtern
quelle
Dyalog APL ,
76 BytesEs ist eine unbenannte Funktion, die
¨
wie folgt benannt und dann für jeden ( ) -Testfall wiederverwendet werden kann:Erläuterung:
Zählen Sie
≢
die∘
Eindeutigkeit∪
der GCD∨
für sich⊢
und jede der ganzen Zahlen bis⍳
.Danke an ngn für das Speichern eines Bytes.
Alte Version:
+/0=⍳|⊢
So funktioniert es:
⍳|⊢
1-durch-Argument Divisionsrestargument0=
Boolescher Wert, wenn 0 dem Divisionsrest entspricht+/
Summe des booleschen Werts, dh Anzahl der Einsen.quelle
Python 2, 37 Bytes
Eine rekursive Funktion. Die optionale Eingabe
i
im zu testenden Divisor. Der Ausdruck(n%i<1)
testet die Teilbarkeit mitTrue
(was gleich ist1
) für Teiler. Das Ergebnis wird zum wiederverwendbaren Ausdruck für hinzugefügti+1
. Wenni==n
erreicht, wird die ganzzahlige Floor-Division zui/n
ausgewertet1
, und dieser Wert wird als Basisfall zurückgegeben. Dabei wird berücksichtigt, dassn
er ein Teiler von istn
.38
Eine anonyme Funktion. Prüft alle möglichen Teiler
1
durchn
. Dies wird nach oben verschoben von0
durchn-1
inrange(n)
Verwendung-~
, die addiert1
. Das Zusammenfassen der Bools nutzt die Tatsache, dass PythonTrue
/False
as1
/ behandelt0
.quelle
Retina , 17 Bytes
Eingabe unär , Ausgabe dezimal.
Probieren Sie es online aus.
Beim Aufruf mit einem einzelnen regulären Ausdruck zählt Retina einfach die Übereinstimmungen. Der reguläre Ausdruck selbst entspricht einer Position , bei der die unäre Zahl links davon ein Teiler der gesamten Eingabe ist. Ich nutze auch die Tatsache, dass Lookarounds atomar sind, so dass ich keinen
^
Anker verwenden muss.Der erste Lookbehinds erfasst einfach das gesamte Präfix in der Gruppe
1
. Das kann niemals scheitern, also wissen wir nach dem Lookbehind, dass es sich um Gruppe 1 handelt und es wird sich nicht mehr ändern.Der Lookahead überprüft dann, ob wir das Ende der Zeichenfolge erreichen können, indem wir die erfasste Zeichenfolge (unseren potenziellen Teiler) 0 oder mehrmals wiederholen.
quelle
J, 10 Bytes
Dies ist ein unbenanntes, monadisches Verb. Es berechnet σ 0 (∏p k α k ) als ∏ (α k + 1) .
Versuchen Sie es online mit J.js .
Wie es funktioniert
quelle
q:
erlaubt ist, da es einen wesentlichen Teil der Herausforderung löst. Wie wäre es einfach[:+/0=]|~1+i.
q:
.Golfscript,
19181713 BytesMit Dank an Martin Büttner .
Wie es funktioniert
Ebenfalls
Von @Peter Taylor auch in 13 Bytes.
Wie es funktioniert
quelle
~:X,{)X\%!},,
J,
131211 BytesMein erstes Golf in J. Ich lerne es noch.
Dank Dennis ein Byte gespart.
Dank randomra ein weiteres Byte gespeichert.
Erläuterung:
quelle
Arcyóu , 12 Bytes
Lasst uns die Party beginnen!
Dies nutzt die eingebaute Funktion
d/
. Hier ist eine Version ohne die eingebaute (27 Bytes):Erläuterung:
quelle
CJam, 11 Bytes
Teste es hier.
Erläuterung
CJam hat keine eingebauten Funktionen, wir machen also eine Probedivision.
Bonus
Hier ist eine interessante Lösung mit 12 Bytes (von der ich vermute, dass sie in einer Sprache wie J am kürzesten ist):
Das Ergebnis entspricht der Häufigkeit, mit der
n
einen x n
Multiplikationstabelle angezeigt wird :quelle
Matlab, 20 Bytes
Führen Sie
k mod n
für jeden ausk = 1,...,n
, führen Sie dann ausnot
(wodurch jeder Nonzer auf Null und jede Null auf 1 gesetzt wird) und addieren Sie alle diese Werte.quelle
length(divisors(n))
.@(n)
, um es zu einem gültigen Untertauchen zu machenJulia, 20 Bytes
Dies ist eine anonyme Funktion, die folgendermaßen funktioniert: Prüfen Sie für jede Ganzzahl von 1 bis zur Eingabe, ob das Eingabemodul für die Ganzzahl Null ist. Wenn ja, wird der Wert
true
andernfalls seinfalse
. Wir addieren über die Booleschen Werte, die implizit in ganze Zahlen umgewandelt werden, und geben die Anzahl der Teiler an.Eine viel coolere (wenn auch viel längere) Lösung, der Vollständigkeit halber eingeschlossen, ist
Dies erhält die kanonische Faktorisierung von
n
, dh\prod_{i=1}^k p_i^e_i
, und berechnet die Divisorfunktion alsτ(n) = \prod_{i=1}^k e_i + 1
.quelle
PARI / GP, 6 Bytes
PARI / GP haben dafür ein eingebautes.
quelle
Pyth, 8 Bytes
Einfache Versuchsaufteilung.
Probieren Sie es hier online aus .
quelle
Ruby, 27 Bytes
Probelauf:
quelle
Oktave,
21 bis20 Bytesquelle
nnz
, tolle Nutzung hier =)Regex (.NET), 33 Byte
Angenommen, Eingabe und Ausgabe sind unär, und die Ausgabe wird aus der Hauptübereinstimmung des regulären Ausdrucks entnommen.
Zerfall des Regex:
.*$
Setzt den Zeiger auf das Ende der Zeichenkette, sodass wir die gesamte Eingabe x in eine Richtung haben.(?<=^\2*(.+?(?>\2?)))
Stimmt von rechts nach links überein und prüft, ob ein Teiler vorliegt, indem eine Schleife von x nach 0 ausgeführt wird.(.+?(?>\2?))
ist eine "Variable", die bei der ersten Iteration mit 1 beginnt und bei der vorherigen Iteration mit der Zahl fortfährt und bis zu x durchläuft.^\2*
prüft, ob x ein Vielfaches von "Variable" ist.Es hat im Grunde die gleiche Idee wie meine Antwort auf Phi berechnen (nicht Pi) . Nur der Scheck ist anders.
Testen Sie den Regex bei RegexStorm .
quelle
Labyrinth , 33 Bytes
Probieren Sie es online aus.
Dies implementiert die Probedivision. Ich werde später eine vollständige Erklärung hinzufügen. Es ist wahrscheinlich nicht optimal, aber es fällt mir schwer, etwas kürzeres zu finden.
quelle
Perl 6 , 17 Bytes
Verwendung:
quelle
Javascript (ES6),
605742403937 BytesDies kann wahrscheinlich besser golfen werden.
Edit 1: Ich hatte recht. Die geschweiften Klammern nach der for-Schleife wurden entfernt.
Edit 2: Golfen auf 40 Bytes dank Manatwork und Martin Büttner .
Edit 3: Speichern eines Bytes durch Basieren der Funktion auf der obigen C-Antwort.
Edit 4: Danke an ן nןuɟ ן oן und Neil , aber ich kann die Auswertung nicht zum Laufen bringen .
Edit 5: Vergessen das eval zu entfernen.
Prüfung
quelle
var
Keywords entfernen . Weitere Tipps in Tipps zum Golfen in JavaScript und Tipps zum Golfen in ECMAScript 6 .++i
und habeni++
, wählen Sie die erstere (dies hat nichts mit Golfen zu tun). Auchn%i<1
sollte ein Byte speichern.n=>{for(d=i=0;i<n;)n%++i<1&&d++;return d}
n%++i||++d
?PowerShell, 34 Byte
|
!
Wert umwandeln und dann invertieren, sodass Teiler zu $ true werden und durchgelassen werden. mit dem eingebauten Alias?
fürWhere-Object
()
und.Count
wie viele Gegenstände durch den Filter gekommen sindquelle
Gelee , 2 Bytes (nicht konkurrierend (wieder))
Probieren Sie es online!
Ich denke, dies verwendet Funktionen, die nach der anderen Jelly-Antwort implementiert wurden. Kommentar, wenn ich mich irre (ich kann nicht jedes Commit in der Reihe sehen, wissen Sie :))
quelle
Taxi, 2143 Bytes
Probieren Sie es online!
Ungolfed:
Erläuterung:
quelle
Japt , 3 Bytes
-m
flag ist für die Ausführung aller Testfälle.Versuch es
quelle
Excel-Formel,
4228 BytesEdit: Ich habe gerade festgestellt, dass ich nicht verwenden muss
INDIRECT
, um 14 Bytes zu sparen!Folgendes sollte als Matrixformel ( Ctrl+ Shift+ Enter) eingegeben werden :
Wobei N die zu testende Zahl ist.
Beispiele:
Erläuterung:
quelle
05AB1E , 2 Bytes
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Ziemlich einfach, aber hier ist es trotzdem:
quelle
Mathematica, 16 Bytes
Einfache Funktionszusammensetzung der eingebauten Funktionen.
quelle
Minkolang 0,13 , 16 Bytes
Überprüfen Sie alle Fälle hier.
Erläuterung
quelle