Ein Teiler einer Zahl n ist eine beliebige Zahl, die n gleichmäßig teilt , einschließlich 1 und n selbst. Die Anzahl der Teiler d (n) gibt an, wie viele Teiler eine Zahl hat. Hier ist d (n) für das erste Paar 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
Wir können wiederholt die Anzahl der Teiler von einer Zahl subtrahieren. Beispielsweise:
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
In diesem Fall dauerte es 5 Schritte, um zu 0 zu gelangen.
Schreiben Sie ein Programm oder eine Funktion, die bei einer nichtnegativen Zahl n die Anzahl der Schritte zurückgibt, die erforderlich sind, um sie durch wiederholtes Subtrahieren der Anzahl der Teiler auf 0 zu reduzieren.
Beispiele:
0, 0
1, 1
6, 2
16, 5
100, 19
100000, 7534
Antworten:
Gelee,
109 Bytes1 Byte dank Dennis ♦ .
Port meiner Antwort in Pyth .
Probieren Sie es online!
Testsuite.
Erläuterung
quelle
Python, 49 Bytes
orlp hat geholfen, ein Byte zu retten! Und Sp3000 sparte zwei weitere. Vielen Dank!
quelle
-~
inn%-~k
und das Entfernen der des Bereichs untere Grenze.C, 52 Bytes
quelle
Pyth, 10 Bytes
Testsuite.
Erläuterung
quelle
Julia, 31 Bytes
Einfache rekursive Implementierung.
quelle
MATL , 14 Bytes
Probieren Sie es online!
Erläuterung
quelle
JavaScript (ES6),
6451 ByteFragen Sie mich nicht, warum ich unnötigerweise die Schwanzrekursion verwendet habe.
quelle
Java,
14793quelle
n=new Integer(100000)
stattn=100000
?05AB1E,
1210 BytesCode:
Erläuterung:
Probieren Sie es online aus
Edit: 2 Bytes gespeichert und ein Fehler mit Eingang 0 dank @Adnan behoben
quelle
[Ð>#Ñg-¼]¾
. Es muss einen Weg geben, esD0Q#
Teil nach dem Inkrement des Zählers ist. Der[Ð>#Ñg-¼]¾
Code sollte aber funktionieren0
:).R, 50 Bytes
Ziemlich einfache Implementierung. Probieren Sie es online aus
quelle
Mathcad, [tbd] Bytes
Das Mathcad-Byte-Äquivalenzschema muss noch ermittelt werden. Unter Verwendung einer groben Tastenäquivalenz verwendet das Programm ungefähr 39 "Bytes". Beachten Sie, dass der while- und der Programmieroperator jeweils nur eine Tastatureingabe ausführen (ctl-] bzw. ctl-shft- #). Sie können tatsächlich nur auf diese Weise über die Tastatur eingegeben werden.
Was Sie sehen, ist genau das, was auf einem Mathcad-Arbeitsblatt abgelegt wird. Mathcad wertet die Gleichungen / Programme aus und legt die Ausgabe auf demselben Blatt ab (z. B. nach dem Bewertungsoperator '=' oder auf dem Plot).
quelle
MATL, 13 Bytes
Probieren Sie es online aus
Erläuterung:
quelle
Mathematica, 35 Bytes
Gutes altes gebrauchen
DivisorSigma
. @ MartinBüttner stellt folgende Alternativen fest:quelle
Hoon ,
9376 BytesUngolfed:
Gibt eine Funktion zurück, die ein Atom annimmt.
r
. Erstellen Sie einen Zwischenwert, der alle Entwickler vonr
(Liste erstellen [1..n]) enthält. Behalten Sie nur die Elemente bei, für die (mod ri) == 0 ist. Wennr
Null ist, wird Null zurückgegeben, andernfalls wird der inkrementierte Wert der Rekursion mit r = r- (Längenteiler) zurückgegeben.Der Code wie er ist braucht eine blöde Zeit, um für n = 100.000 ausgewertet zu werden, nur weil das Finden der Entwickler für große Zahlen eine riesige Liste und Karten darüber ergibt. Wenn Sie sich die Teiler merken, erhalten Sie die richtige Ausgabe für n = 10.000, aber ich habe nicht auf 100.000 gewartet
quelle
Haskell,
434039 BytesEinfacher rekursiver Ansatz. Anwendungsbeispiel:
g 16
->5
.Bearbeiten: @Lynn
34 Bytes gespeichert . Vielen Dank!quelle
g(sum$signum.mod n<$>[1..n])
?min 1
ist tatsächlich ein Byte kürzer alssignum
geradePowerShell v2 +,
74 bis67 ByteScheint im Vergleich zu anderen Antworten ziemlich langwierig ...
Übernimmt die Eingabe
$n
, tritt in einefor
Schleife mit der Bedingung ein,$n
die größer als ist0
. Bei jeder Schleifeniteration setzen wir Helfer$a
und durchlaufen dann jede Zahl von1
bis zu$n
. Jede innere Schleife wird mit jeder Zahl verglichen, um festzustellen, ob es sich um einen Divisor handelt. In diesem Fall erhöhen wir unseren Helfer$a
(mit Boolescher Negation und implizitem Cast-to-Int). Dann subtrahieren wir, wie viele Teiler wir gefunden haben,$n-=$a
und erhöhen unseren Zähler$o++
. Schließlich geben wir aus$o
.Die Ausführung dauert lange , da es sich um ein wichtiges for-loop-Konstrukt handelt. Das Ausführen
n = 10,000
auf meinem Computer (1 Jahr alter Core i5) dauert beispielsweise fast 3 Minuten.quelle
Racket -
126 Bytes Bis zu 98 Bytes91 BytesEine extrem naive Lösung - könnte wahrscheinlich mit einem anständigen Algorithmus und einigen Lisp-Tricks, die ich nicht kenne, viel reduziert werdenBearbeiten: Erklärung auf Anfrage. Wie gesagt, dies ist eine extrem naive rekursive Lösung und kann sehr viel kürzer sein.
Edit 2: 98-Byte-Version mit einem weniger dummen Algorithmus (immer noch ziemlich dumm und kann kürzer sein)Erläuterung:Bearbeiten 3: Gespeicherte 7 Bytes durch den Austausch
(cdr(build-list x values))
mit(build-list x add1)
quelle
> <> , 52 + 2 = 54 Bytes
Die eingegebene Nummer muss beim Programmstart auf dem Stack vorhanden sein, damit das
-v
Flag +2 Bytes enthält . Probieren Sie es online!4 lästige Bytes, die bei Ausrichtungsproblemen verschwendet werden. Bah.
Dieser funktioniert durch Erstellen der Sequenz von
n
bis0
auf dem Stapel erstellt wird. Sobald 0 erreicht ist, platziere es und gib die Länge des verbleibenden Stapels aus.Übrigens läuft es
O(n^2)
pünktlich, also würde ich es nicht versuchenn = 100000
...quelle
-v
ist ein Byte, nicht zwei.> <> , 36 + 3 = 39 Bytes
Die Implementierung ist mit jeder Iteration relativ einfach
sum(n%k>0 for k in range(1,n-1))
. +3 Bytes für das-v
Flag pro Meta .Probieren Sie es online!
quelle
Ruby, 42 Bytes
Beim größten Testfall ist ein Stapelüberlauffehler aufgetreten.
100000
Hier ist also eine iterative Version innerhalb von 49 Bytes . Dauert jedoch angesichts derO(N^2)
Komplexität eine Weile .quelle
Perl 5, 40 Bytes
Eingabe und Ausgabe erfolgen als Listen der erforderlichen Kopienanzahl von
1
.quelle
C #, 63 Bytes
quelle
Eigentlich 17 Bytes
Probieren Sie es online! (Hinweis: Der letzte Testfall läuft bei TIO ab.)
Erläuterung:
quelle