Man kann sagen, dass eine Funktion (oder ein Programm), die Eingaben entgegennimmt und Ausgaben bereitstellt, einen Zyklus hat, wenn der wiederholte Aufruf der Funktion an ihrem eigenen Ausgang schließlich die ursprüngliche Nummer erreicht. Nehmen Sie zum Beispiel die folgende Funktion:
Input: n 1 2 3 4 5 6
Output: f(n) 5 7 1 3 4 9
Wenn wir beginnen mit n=1
, f(n)=5
, f(f(n))=f(5)=4
, f(f(f(n)))=f(4)=3
, f(f(f(f(n))))=f(3)=1
.
Das steht geschrieben (1 5 4 3)
. Da diese Schleife 4 eindeutige Zahlen enthält, handelt es sich um einen Zyklus der Länge 4.
Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die Zyklen von jeder möglichen Länge enthält. Das heißt, es muss einen Zyklus der Länge 1, der Länge 2 usw. geben.
Außerdem muss Ihre Funktion / Ihr Programm von den positiven Ganzzahlen zu den positiven Ganzzahlen reichen und bijektiv sein , dh, für jeden möglichen Ausgabewert muss über alle positiven Ganzzahlen genau ein Eingabewert vorhanden sein. Anders ausgedrückt muss die Funktion / das Programm eine Permutaion der positiven ganzen Zahlen berechnen.
Details: Jedes Standard-Eingabe- / Ausgabesystem ist zulässig, einschließlich STDIN, STDOUT, Funktionsargument, Return usw. Standardlücken sind verboten.
Sie müssen sich keine Gedanken über die Einschränkungen Ihrer Datentypen machen - die obigen Eigenschaften müssen nur unter der Annahme gelten, dass beispielsweise ein int
oder float
ein beliebiger Wert enthalten sein kann.
Es gibt keine Einschränkungen für das Verhalten der Funktion bei Eingängen, die keine positiven ganzen Zahlen sind, und diese Ein- / Ausgänge werden ignoriert.
Scoring ist Codegolf in Bytes, kürzester Code gewinnt.