introduction
La méthode du carré central est utilisée pour la génération de nombres pseudo-aléatoires. Cependant, ce n'est pas une bonne méthode dans la pratique, car sa période est généralement très courte et présente de graves faiblesses. Comment cela marche-t-il? Prenons un exemple:
Pour la graine, nous choisissons 123456
:
Seed 123456
La graine au carré (graine × graine), est égale à:
Seed² 15241383936
Nous avons commencé avec un numéro à 6 chiffres . Cela signifie que la graine au carré doit fournir un nombre à 12 chiffres . Si ce n'est pas le cas, des zéros de tête sont ajoutés pour compenser:
Seed² 015241383936
Nous prenons ensuite la partie médiane du nombre, de la même taille que la graine:
Seed² 015241383936
^^^^^^
Voici donc notre nouvelle semence : 241383
. Nous répétons le même processus que celui indiqué ci-dessus. Nous obtenons ce qui suit:
0: 123456
015241383936
| |
1: 241383
058265752689
| |
2: 265752
070624125504
| |
3: 624125
389532015625
| |
4: 532015
283039960225
| |
5: 039960
001596801600
| |
6: 596801
Et cela continue dans un certain temps ... Maintenant que nous savons ce qu'est la méthode du carré central, relevons le défi:
La tâche
Chaque graine a une période . La période d'une graine à n chiffres ne peut pas dépasser 8 n . Par exemple, la graine 82
. Cela donnerait la séquence suivante:
82 > 72 > 18 > 32 > 02 > 00 > 00 > 00 > 00 > 00
|____|____|____|____|____|____|____|____|____|___...
0 1 2 3 4 5 6 7 8 9
Vous pouvez voir que la période est égale à 5 , avant de contenir à nouveau le même chiffre. Votre tâche consiste, si une graine supérieure à 0 ne contient pas de zéros non significatifs, à sortir la période de la graine . Donc, dans ce cas, vous devez sortir 5
.
Un autre exemple est:, 24
qui donne ce qui suit:
24 > 57 > 24
|____|____|___...
0 1 2
Comme vous pouvez le voir, toutes les séquences ne se terminent pas 0
. Ce cycle a une période de 1 .
Cas de test
Input > Output
24 > 1
82 > 5
123456 > 146
8989 > 68
789987 > 226
Les bacs à pâte avec les séquences pour 123456 , 8989 , 789987
C'est du code-golf , donc la soumission avec le moins d'octets gagne!
Vous pouvez supposer que l'entrée n'aura jamais un nombre impair de chiffres.
24
est périodique (avec la période 2, je dirais),82
est finalement périodique (avec la période 1).Réponses:
Gelée,
262418 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
Bash pur,
162 131 116 113107Enregistré 3 octets en utilisant
$c
...Merci @Dennis de m'aider à économiser 6 octets supplémentaires.
---- begin middleSquare ----
---- end middleSquare ----
Format carré, 131
---- begin middleSquare ----
---- end middleSquare ----
Vieux mais avec une sortie fantaisie, 162
---- begin middleSquare ----
---- end middleSquare ----
la source
JavaScript (ES7), 82 octets
Accepte l'entrée sous la forme d'une chaîne, par exemple "82", et retourne un entier. Technique récursive simple de queue pour comparer chaque graine à son tour contre un hachage de graines qui ont déjà été vues. J'ajoute 100 ** l au carré pour assurer une longueur homogène.
la source
Python
32,13911497 octetsMerci à Seeq pour avoir joué au golf sur 25 octets et merci à Dennis pour avoir joué au golf sur 17 octets! Code:
Peut certainement être joué plus loin. C'était aussi le code utilisé pour réaliser les cas de test: P.
la source
Pyth, 21 octets
Essayez-le en ligne: démonstration ou suite de tests
edit: Trouvé le cas de bord
1000
, qui ne fonctionnait pas avec mon code précédent. Correction de 1 octet.Explication:
la source
sz
au lieu deQ
?Q
, je dois remplacer tous leslz
parl`Q
s.input
. Je suppose que c'est vraiment destiné à permettre une deuxième lecture stdin ..?.z
et.Q
, bien qu'ils lisent plusieurs lignes d'entrée et les stockent dans des listes. Mais je n'ai pas vu quelqu'un utiliser cette fonctionnalité. Ce n'est qu'un octet pour évaluer une chaîne ou pour stringifier un nombre.Qz.Q.z
?MATL , 33
3540octetsEssayez-le en ligne!
la source
Oracle SQL 11.2, 184 octets
Non golfé
Il utilise la détection de cycle intégré pour arrêter la récursivité.
la source
Julia, 64 octets
Essayez-le avec Coding Ground .
la source
Mathematica, 80 octets
la source
CJam, 37 octets
Ran dans un problème ennuyeux d'ordre de pile que je ne vois pas immédiatement comment résoudre. C'est aussi incroyablement lent.
Comment cela fonctionne: chaque itération pousse la nouvelle valeur au-dessus de la pile, puis nous enveloppons la pile dans un tableau et voyons si elle est la même que son union avec elle-même (pour voir si elle contient des éléments en double). Lorsqu'il contient des éléments en double, arrêtez-vous et voyez combien d'éléments se trouvent dans la pile.
la source
Python 2, 82 octets
Essayez-le sur Ideone .
la source
Python, 124 octets
la source
VBSCRIPT, 131 octets
Le mieux que je puisse faire avec vbscript, première affiche, alors allez-y doucement avec moi!
la source