Einführung
Die Methode des mittleren Quadrats wird zur Erzeugung von Pseudozufallszahlen verwendet. Dies ist jedoch in der Praxis keine gute Methode, da ihre Dauer in der Regel sehr kurz ist und einige schwerwiegende Schwächen aufweist. Wie funktioniert das? Nehmen wir ein Beispiel:
Für den Samen wählen wir 123456
:
Seed 123456
Das Samenquadrat (Samen × Samen) ist gleich:
Seed² 15241383936
Wir haben mit einer 6-stelligen Zahl begonnen. Das bedeutet, dass das Startquadrat eine 12-stellige Zahl liefern sollte . Ist dies nicht der Fall, werden führende Nullen hinzugefügt, um Folgendes zu kompensieren:
Seed² 015241383936
Wir nehmen dann den mittleren Teil der Zahl mit der gleichen Größe wie der Samen:
Seed² 015241383936
^^^^^^
Das ist dann unser neues Saatgut : 241383
. Wir wiederholen den gleichen Vorgang wie oben gezeigt. Wir bekommen folgendes:
0: 123456
015241383936
| |
1: 241383
058265752689
| |
2: 265752
070624125504
| |
3: 624125
389532015625
| |
4: 532015
283039960225
| |
5: 039960
001596801600
| |
6: 596801
Und das geht noch eine Weile so ... Jetzt wissen wir, was die Mittelquadratmethode ist, und kommen zur Herausforderung:
Die Aufgabe
Jeder Same hat eine Periode . Die Periode eines n- stelligen Keims kann nicht länger als 8 n sein . Zum Beispiel den Samen 82
. Dies würde die folgende Sequenz ergeben:
82 > 72 > 18 > 32 > 02 > 00 > 00 > 00 > 00 > 00
|____|____|____|____|____|____|____|____|____|___...
0 1 2 3 4 5 6 7 8 9
Sie können sehen, dass die Periode gleich 5 ist , bevor Sie wieder dieselbe Ziffer enthalten. Ihre Aufgabe ist es, bei einem Startwert größer als 0, der keine führenden Nullen enthält, die Periode des Startwerts auszugeben . In diesem Fall müssen Sie also ausgeben 5
.
Ein anderes Beispiel ist 24
:, das folgendes ergibt:
24 > 57 > 24
|____|____|___...
0 1 2
Wie Sie sehen, enden nicht alle Sequenzen in 0
. Dieser Zyklus hat eine Periode von 1 .
Testfälle
Input > Output
24 > 1
82 > 5
123456 > 146
8989 > 68
789987 > 226
Die Pastebins mit den Sequenzen für 123456 , 8989 , 789987
Das ist Code-Golf , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!
Sie können davon ausgehen, dass der Eingang niemals eine ungerade Anzahl von Ziffern hat.
24
ist periodisch (mit Punkt 2, würde ich sagen),82
ist schließlich periodisch (mit Punkt 1).Antworten:
Jelly,
262418 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Pure Bash,
162 131 116 1131073 Bytes gespart mit
$c
...Vielen Dank an @Dennis, dass Sie mir helfen, 6 weitere Bytes zu sparen.
---- begin middleSquare ----
---- end middleSquare ----
Quadratisch formatiert, 131
---- begin middleSquare ----
---- end middleSquare ----
Alt aber mit ausgefallener Ausgabe, 162
---- begin middleSquare ----
---- end middleSquare ----
quelle
JavaScript (ES7), 82 Byte
Akzeptiert Eingaben in Form einer Zeichenfolge, z. B. "82", und gibt eine Ganzzahl zurück. Einfache rekursive Schwanz-Technik, um jeden Samen der Reihe nach gegen einen Hasch von Samen zu prüfen, die bereits gesehen wurden. Ich addiere 100 l ** zum Quadrat, um eine gleichmäßige Länge zu gewährleisten.
quelle
Python
32,13911497 BytesDanke an Seeq für das Abschlagen von 25 Bytes und danke an Dennis für das Abschlagen von 17 Bytes! Code:
Kann definitiv weiter golfen werden. Dies war auch der Code, mit dem die Testfälle erstellt wurden: P.
quelle
Pyth, 21 Bytes
Probieren Sie es online aus: Demo oder Test Suite
edit: Habe den Edge Case gefunden
1000
, der mit meinem vorherigen Code nicht funktioniert hat. Behob es für 1 Byte.Erläuterung:
quelle
sz
anstatt zu verwendenQ
?Q
, muss ich alleslz
durchl`Q
s ersetzen .input
. Ich denke, es ist wirklich dazu gedacht, ein zweites Mal gelesen zu werden ..?.z
und.Q
, obwohl diese mehrere Eingabezeilen lesen und in Listen speichern. Aber ich habe noch niemanden gesehen, der diese Funktion verwendet. Es ist nur 1 Byte, um eine Zeichenfolge auszuwerten oder eine Zahl zu kennzeichnen.Qz.Q.z
?MATL , 33
3540BytesProbieren Sie es online!
quelle
Oracle SQL 11.2, 184 Byte
Nicht golfen
Es verwendet die eingebaute Zykluserkennung, um die Rekursivität zu stoppen.
quelle
Julia, 64 Bytes
Probieren Sie es mit Coding Ground .
quelle
Mathematica, 80 Bytes
quelle
CJam, 37 Bytes
Stieß auf ein ärgerliches Problem mit der Stapelreihenfolge, das ich nicht sofort lösen kann. Es ist auch unglaublich langsam.
So funktioniert es: Bei jeder Iteration wird der neue Wert auf den Stapel verschoben. Anschließend wird der Stapel in ein Array eingebunden und überprüft, ob er mit seiner Vereinigung identisch ist (um festzustellen, ob er doppelte Elemente enthält). Wenn es doppelte Elemente gibt, halten Sie an und sehen Sie, wie viele Elemente sich im Stapel befinden.
quelle
Python 2, 82 Bytes
Probieren Sie es auf Ideone .
quelle
Python, 124 Bytes
quelle
VBSCRIPT, 131 Bytes
Das Beste, was ich mit vbscript machen konnte, das erste Mal Poster, also mach es mir leicht!
quelle