Inspiriert von dieser Frage bei Mathematics .
Das Problem
Sei
n
eine natürliche Zahl≥ 2
. Nehmen Sie den größten Teiler vonn
- der sich vonn
selbst unterscheidet - und subtrahieren Sie ihn vonn
. Wiederholen, bis Sie bekommen1
.
Die Frage
Wie viele Schritte tut , es zu erreichen nehmen 1
für eine bestimmte Anzahl n ≥ 2
.
Ausführliches Beispiel
Lassen
n = 30
.
Der größte Teiler von:
1. 30 is 15 --> 30 - 15 = 15
2. 15 is 5 --> 15 - 5 = 10
3. 10 is 5 --> 10 - 5 = 5
4. 5 is 1 --> 5 - 1 = 4
5. 4 is 2 --> 4 - 2 = 2
6. 2 is 1 --> 2 - 1 = 1
Es dauert 6 Schritte zu erreichen 1
.
Eingang
- Eingabe ist eine ganze Zahl
n
, wobein ≥ 2
. - Ihr Programm sollte die Eingabe bis zum maximalen Ganzzahlwert der Sprache unterstützen.
Ausgabe
- Geben Sie einfach die Anzahl der Schritte wie
6
. - Führende / nachfolgende Leerzeichen oder Zeilenumbrüche sind in Ordnung.
Beispiele
f(5) --> 3
f(30) --> 6
f(31) --> 7
f(32) --> 5
f(100) --> 8
f(200) --> 9
f(2016^155) --> 2015
Bedarf
- Sie können Eingaben von
STDIN
Befehlszeilenargumenten als Funktionsparameter oder von der nächstgelegenen Entsprechung erhalten. - Sie können ein Programm oder eine Funktion schreiben. Wenn es sich um eine anonyme Funktion handelt, geben Sie bitte ein Beispiel für den Aufruf an.
- Dies ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes.
- Standardlücken sind nicht zulässig.
Diese Serie gibt es auch bei OEIS: A064097
Ein durch
a(1) = 0
unda(p) = 1 + a(p-1)
if induktiv definierter Quasi-Logarithmusp
ist prim unda(n*m) = a(n) + a(m)
ifm,n > 1
.
code-golf
math
arithmetic
insertusernamehere
quelle
quelle
2^32 - 1
. Der Rest liegt bei Ihnen und Ihrem System. Hoffe, das hast du mit deiner Frage gemeint.Antworten:
Gelee , 9 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Hintergrund
Die Definition der Sequenz A064097 impliziert dies
Nach der Produktformel von Euler
wobei φ die Euler'sche Totientenfunktion bezeichnet und p nur über Primzahlen variiert.
Wir kombinieren beides und leiten daraus das Grundstück ab
wobei ω die Anzahl der verschiedenen Primfaktoren von n bezeichnet .
Wendet man die resultierende Formel k + 1 mal an, wobei k groß genug ist, dass φ k + 1 (n) = 1 ist , so erhält man
Aus dieser Eigenschaft erhalten wir die Formel
wo die letzte Gleichheit gilt, weil ω (1) = 0 .
Wie es funktioniert
quelle
05AB1E ,
1311 BytesCode:
Erläuterung:
Verwendet CP-1252- Codierung. Probieren Sie es online! .
quelle
[¼Ñü-¤ÄD#]¾
- Ich war kurz davor, ein Byte paarweise zu rasieren, na ja ...[Ð#Ò¦P-¼]¾
.Ð
ist besser alsDD
.Pyth, 11 Bytes
Testsuite
Eine einfache Wiederholungsschleife.
Erläuterung:
quelle
f
ilter.f
?f
ohne zweites Argument durchläuft alle positiven Ganzzahlen ab1
und gibt den ersten Wert zurück, der für die innere Anweisung true ergibt. Dieser Wert wird in diesem Programm nicht verwendet und gibt die Anzahl der ausgeführten Vorgänge zurück. Nicht undokumentiert, nur unorthodox :) Wenn es hilft, können Sie sich das wie einefor
Schleifefor(int i=1; some_condition_unrelated_to_i; i++) { change_stuff_that_affects_condition_but_not_i;}
f <l:T> <none>
)f
ist die erste Eingabe, bei derA(_)
die Wahrheit überwunden ist[1, 2, 3, 4...]
.Python 2,
5049 BytesDies wird den letzten Testfall nicht in Kürze beenden ...
Alternativ ist hier ein 48-Byte, das
True
anstelle von1
for zurückgibtn=2
:quelle
Gelee , 10 Bytes
Probieren Sie es online! oder überprüfen Sie die meisten Testfälle . Die letzten Testfälle enden schnell vor Ort.
Wie es funktioniert
quelle
Retina , 12
Dies setzt voraus, dass die Eingabe unär und die Ausgabe dezimal erfolgt. Wenn dies nicht akzeptabel ist, können wir dies für weitere 6 Bytes tun:
Retina , 18
Online testen - Erste Zeile hinzugefügt, um alle Testfälle auf einmal auszuführen.
Leider wird für die Berechnungen eine Einzahl verwendet, sodass die Eingabe von 2016 155 nicht praktikabel ist.
1
squelle
\b
.Pyth -
151413 BytesEin spezielles Gehäuse
1
bringt mich um.Probieren Sie es hier online aus .
quelle
1
?1
IS[]
, der einen Fehler verursacht , wenn das erste Element I nehmen. Ich muss es in besonderen Fällen1
tun , damit es wieder zurückkehrt, damit der.u
Fixpunkt endet. Ich habe einen besseren Weg gefunden als.x
try - außer das hat mir diese 2 Bytes erspart..u
Festpunkt greift irgendwann1
nach allen Eingaben, an welcher Stelle es spezielle Gehäuse geben muss.JavaScript (ES6),
* 4438Bearbeiten Sie 6 Bytes gespeichert dank @ l4m2
(* 4 gestrichen ist noch 4)
Rekursive Funktion
Weniger golfen
Prüfung
quelle
f=(n,d=n)=>n>1?n%--d?f(n,d):f(n-d)+1:0
?Mathematica, 36 Bytes
Eine unbenannte Funktion benötigt dieselben Bytes:
Dies ist eine sehr einfache Implementierung der Definition als rekursive Funktion.
quelle
Oktave,
595855 BytesProbeläufe:
quelle
end
in der oktave nötig?Haskell, 59 Bytes
Verwendungszweck:
Bei großen Zahlen kann dies ein wenig ineffizient sein, da die Liste erstellt wird.
quelle
<1
stattdessen==0
ein paar Bytes:f 1=0;f n=1+f(n-last[a|a<-[1..n
div2],mod n a<1])
Julia,
56504539 BytesDies ist eine rekursive Funktion, die eine Ganzzahl akzeptiert und eine Ganzzahl zurückgibt.
Ungolfed:
Probieren Sie es online! (beinhaltet alle Testfälle)
6 Bytes gespart dank Martin Büttner und 11 dank Dennis!
quelle
PowerShell v2 +, 81 Byte
Brutalste Gewalt.
Übernimmt die Eingabe
$a
, tritt in einefor
Schleife ein, bis$a
kleiner oder gleich ist1
. In jeder Schleife durchlaufen wir eine anderefor
Schleife, von der abwärts gezählt wird,$a
bis wir einen Divisor (!($a%$i
) finden. Im schlimmsten Fall werden wir$i=1
als Teiler finden. Wenn wir dies tun, erhöhen Sie unseren Zähler$j
, subtrahieren unseren Divisor$a-=$i
und$i=0
brechen aus der inneren Schleife aus. Irgendwann werden wir einen Zustand erreichen, in dem die äußere Schleife falsch ist (dh erreicht$a
hat1
), also ausgeben$j
und beenden.Achtung : Dies wird eine dauern lange Zeit auf eine größere Anzahl, insbesondere Primzahlen. Die Eingabe von 100.000.000 dauert auf meinem Core i5-Laptop ~ 35 Sekunden. Bearbeiten - gerade mit
[int]::MaxValue
(2 ^ 32-1) getestet , und es dauerte ~ 27 Minuten. Nicht zu schlecht, nehme ich an .quelle
Matlab, 58 Bytes
quelle
Japt , 12 Bytes (nicht konkurrierend)
Online testen! Nicht konkurrierend, da es eine Reihe von Funktionen verwendet, die nach dem Posten der Herausforderung hinzugefügt wurden.
Wie es funktioniert
Diese Technik wurde von der 05AB1E-Antwort inspiriert . Eine frühere Version verwendet
²¤
(Push a 2, Slice off der ersten beiden Elemente) anstelle von,Å
weil es ein Byte kürzer ist alss1
(Note Trailing Space); Ich erkannte erst nach der Tatsache, dass, da dies eine 2 an das Ende des Arrays und die Slices von Anfang an anfügt , es in der Tat auf einer ungeraden zusammengesetzten Zahl fehlschlägt, obwohl es auf allen gegebenen Testfällen funktioniert.quelle
Python 3,
75, 70, 67 Bytes.Dies ist eine ziemlich einfache rekursive Lösung. Bei den vielen Testfällen dauert es SEHR lange.
quelle
> <> 32 Bytes
Erwartet die eingegebene Nummer
n
auf dem Stapel.Dieses Programm erstellt die vollständige Sequenz auf dem Stapel. Die einzige Zahl, zu der es führen kann,
1
ist2
, dass die Erstellung der Sequenz beendet wird, wenn sie2
erreicht ist. Dies bewirkt auch, dass die Größe des Stapels der Anzahl der Schritte entspricht und nicht der Anzahl der Schritte +1.quelle
Ruby, 43 Bytes
Finden Sie die kleinste Zahl
i
, die sichx
teilt,x-i
und wiederholen Sie den Vorgang, bis wir sie erreichen1
.quelle
Haskell, 67 Bytes
Hier ist der Code:
Und hier ist ein Grund, warum Haskell großartig ist:
Ja, in Haskell können Sie festlegen
-->
, dass es äquivalent zu ist==
.quelle
Matlab, 107 Bytes
quelle
MATL,
1716 BytesProbieren Sie es online
Erläuterung
quelle
C99,
6261 Bytes1 Byte von @Alchymist abgegolft.
Rufen Sie als f (x, & y) auf, wobei x die Eingabe und y die Ausgabe ist.
quelle
Julia,
3936 BytesProbieren Sie es online!
quelle
Clojure,
116104 Bytes-12 Bytes, indem ein Bereich gefiltert wird, um ein Vielfaches zu finden, und dann
last
eins verwendet wird, um das größte zu erhaltenNaive Lösung, die das vom OP beschriebene Problem im Grunde nur löst. Leider nimmt das Finden des größten Divisors allein etwa die Hälfte der verwendeten Bytes in Anspruch. Zumindest sollte ich von hier aus viel Platz zum Golfen haben.
Vorgolfed und Test:
quelle
Perl 6 , 35 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Pyth,
1716 BytesProbieren Sie es online! (Das
y.v
am Ende ist für den Funktionsaufruf)Ursprüngliche 17 Bytes:
Probieren Sie es online! (Das
y.v
am Ende ist für den Funktionsaufruf)(Diese Frage habe ich tatsächlich mit diesem Pyth-Programm beantwortet.)
quelle
u
ist sie wahrscheinlich kürzer als die tatsächliche Rekursion.Pyke, 11 Bytes (nicht konkurrierend)
Dies verwendet ein neues Verhalten, bei dem, wenn nach einem Sprung eine Ausnahme ausgelöst wird, der Zustand vor dem Sprung wiederhergestellt wird (mit Ausnahme von Variablendefinitionen) und fortgesetzt wird. In diesem Fall entspricht es dem folgenden Python-Code:
Dies ist alles mit Pyke ohne eine while-Schleife möglich - na los!
Probieren Sie es hier aus!
quelle
JavaScript (ES6),
7054 BytesImplementierung der bereitgestellten rekursiven Formel, die jetzt aktualisiert wurde, um mithilfe der Rekursion auch den Divisor zu finden.
quelle
Perl, 57 + 1 (
-p
Flag) = 58 BytesVerwendungszweck:
Ungolfed:
quelle
Clojure,
9896 BytesVerwendet
for
:when
, um den größten Divisor zu finden, Schleifen, bis kein größerer Wert als eins gefunden wird.quelle