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.
quelle
Antworten:
Pyth,
118 BytesViel langweiliger als meine vorherige Antwort.
Jede Zahl, die eine 0-Stelle enthält, ist sich selbst zugeordnet. Jede andere Nummer ist der Nummer zugeordnet, deren Ziffern um 1 gedreht sind. Beispiel:
quelle
Python 2,
565554 BytesHier sind die ersten 21 Ausgänge:
Das Muster ist offensichtlich, wenn wir die Liste in folgende Teile aufteilen:
quelle
Pyth, 25 Bytes
Dies ist die gleiche Sequenz wie bei @ Sp3000, jedoch in geschlossener Form. Die geschlossene Form ist:
quelle
Python3, 40 Bytes
Jede Zahl, die eine 0-Stelle enthält, ist sich selbst zugeordnet. Jede andere Nummer ist der Nummer zugeordnet, deren Ziffern um 1 gedreht sind. Beispiel:
quelle
Rubin, 22 + 1 = 23
Mit Befehlszeilenflag
-p
Führen Sie ausWenn als Eingabe eine Zeichenfolgendarstellung einer Zahl (ohne abschließende Zeilenumbrüche) angegeben wird, wird die erste Ziffer konstant gehalten und der Rest nach links gedreht
1234
wird1342
.Dies kann mit auf 21 Zeichen reduziert werden
$_=$1+$'+$2if/(.)(.)/
, gibt aber eine Warnung aus.quelle
Rubin, 16 + 1 = 17
-p
Führen Sie mit dem Befehlszeilenflag ausDies ist eine kompliziertere Funktion als meine andere Antwort, ist aber zufälligerweise besser zum Golfen geeignet (und tolerant gegenüber Zeilenumbrüchen). Es wird die letzte Ziffer der Eingabe ungleich Null sowie alle nachfolgenden Nullen verwendet und an den Anfang der Zahl verschoben. So
9010300
wird es3009010
. Jede Zahl mit n Ziffern ungleich Null ist Teil eines n-langen Zyklus.Die Eingabe ist eine Zeichenfolge in einer beliebigen Basis über STDIN, die Ausgabe ist eine Zeichenfolge in dieser Basis.
quelle
Python, 43
Die Umkehrung der Sp3000-Funktion , rekursiv implementiert.
Die Funktion ist ein Ein-Zyklus, gefolgt von einem Zwei-Zyklus, gefolgt von einem Drei-Zyklus, ...
Die Operation
n%k+1
wirkt wie eink
Zyklus auf die Zahlen1..k
. So finden Sie die entsprechendenk
Gebrauch, Verschiebung alles nach unten durchk=1
, dannk=2
, und so weiter, bisn<=k
.quelle
Pyth, 15 Bytes
Die bisher kürzeste Antwort, bei der numerische Operationen anstelle von Zeichenfolgenoperationen verwendet werden.
Die Wirkung dieser Funktion auf die Binärdarstellung besteht darin, den äußersten rechten Einsenblock auf die nächste 0 zu erweitern; oder wenn es keine 0 gibt, um es wieder auf eine einzelne 1 zurückzusetzen:
Pyth, 26 Bytes, lustige Variante
Führt die obige Operation gleichzeitig mit allen Blöcken von 1 aus, nicht nur mit dem am weitesten rechts stehenden. Dabei werden nur bitweise und arithmetische Operationen verwendet.
quelle
Schnelle 1.2, 66 Bytes
quelle
Brachylog , 5 Bytes
Probieren Sie es online!
Port von @ orlps Pyth-Antwort. Kommt einfach und ordentlich heraus:
Eigentlich wollte ich die Python-Lösung von @ Sp3000 portieren, aber das hat satte 23 Bytes gekostet :
Probieren Sie es online!
quelle
JavaScript (ES6), 43 Byte
quelle
Matlab (189)
Die Funktion:
Ordnet eine beliebige Ganzzahl entsprechend ihren Primfaktoren zu. Wenn die Zahl Null ist oder in 2 oder 1 zerlegt ist, wird die Zahl auf sich selbst abgebildet. Andernfalls wählen wir den größten Primfaktor dieser Zahl aus und erhöhen die verbleibenden unterschiedlichen Primfaktoren um den nächsten größer Primfaktor , bis wir die Zahl erreichen ,
biggest_prime^n
won
ist die Summe aller Exponenten aller Faktoren, wenn wir diesen Betrag erreichen, wenden wir uns anmax_prime*2^(n-1)
und wir den gleichen Zyklus wieder reproduzieren.quelle
Matlab (137)
2
bis wir auf einen Exponenten2
stoßen, der durch die Summe der Exponenten anderer Primfaktoren teilbar ist. dann bewegen wir uns zum Anfang des Zyklus, der durch geteilt wird2^(sum of exponents of other primes)
. Die anderen Zahlen sind auf sich selbst abgebildet.quelle