Introducción
El método del cuadrado medio se utiliza para generar números pseudoaleatorios. Sin embargo, este no es un buen método en la práctica, ya que su período suele ser muy corto y tiene algunas debilidades graves. ¿Como funciona esto? Tomemos un ejemplo:
Para la semilla, elegimos 123456
:
Seed 123456
La semilla al cuadrado (semilla × semilla) es igual a:
Seed² 15241383936
Comenzamos con un número de 6 dígitos . Eso significa que la semilla al cuadrado debe entregar un número de 12 dígitos . Si este no es el caso, se agregan ceros a la izquierda para compensar:
Seed² 015241383936
Luego tomamos la parte central del número, con el mismo tamaño que la semilla:
Seed² 015241383936
^^^^^^
Este es entonces nuestra nueva semilla : 241383
. Repetimos el mismo proceso que se muestra arriba. Obtenemos lo siguiente:
0: 123456
015241383936
| |
1: 241383
058265752689
| |
2: 265752
070624125504
| |
3: 624125
389532015625
| |
4: 532015
283039960225
| |
5: 039960
001596801600
| |
6: 596801
Y esto continúa por un tiempo ... Ahora que sabemos cuál es el método del cuadrado medio, vamos al desafío:
La tarea
Cada semilla tiene un período . El período de una semilla de n dígitos no puede ser superior a 8 n . Por ejemplo, la semilla 82
. Esto daría la siguiente secuencia:
82 > 72 > 18 > 32 > 02 > 00 > 00 > 00 > 00 > 00
|____|____|____|____|____|____|____|____|____|___...
0 1 2 3 4 5 6 7 8 9
Puede ver que el período es igual a 5 , antes de volver a contener el mismo dígito. Su tarea es, cuando se le da una semilla mayor que 0 que no contiene ceros a la izquierda, generar el período de la semilla . Entonces, en este caso, necesita salida 5
.
Otro ejemplo es:, 24
que da lo siguiente:
24 > 57 > 24
|____|____|___...
0 1 2
Como puede ver, no todas las secuencias terminan en 0
. Este ciclo tiene un período de 1 .
Casos de prueba
Input > Output
24 > 1
82 > 5
123456 > 146
8989 > 68
789987 > 226
Los pastebins con las secuencias para 123456 , 8989 , 789987
Este es el código de golf , por lo que gana el envío con la menor cantidad de bytes.
Puede suponer que la entrada nunca tendrá un número desigual de dígitos.
24
es periódica (con el período 2, diría),82
es eventualmente periódica (con el período 1).Respuestas:
Gelatina,
262418 bytesPruébalo en línea!
Cómo funciona
fuente
Fiesta pura,
162 131 116 113107Guardado 3 bytes usando
$c
...Gracias @Dennis por ayudarme a ahorrar 6 bytes más.
---- begin middleSquare ----
---- end middleSquare ----
Cuadrado formateado, 131
---- begin middleSquare ----
---- end middleSquare ----
Viejo pero con salida elegante, 162
---- begin middleSquare ----
---- end middleSquare ----
fuente
JavaScript (ES7), 82 bytes
Acepta entradas en forma de cadena, por ejemplo, "82", y devuelve un entero. Técnica recursiva de cola simple para verificar cada semilla a su vez contra un hash de semillas que ya se han visto. Agrego 100 ** l al cuadrado para asegurar una longitud consistente.
fuente
Pitón
32,13911497 bytes¡Gracias a Seeq por jugar golf con 25 bytes y gracias a Dennis por jugar golf con 17 bytes! Código:
Definitivamente se puede jugar más al golf. Este fue también el código utilizado para hacer los casos de prueba: P.
fuente
Pyth, 21 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
editar: Encontré el caso límite
1000
, que no funcionó con mi código anterior. Lo arregló por 1 byte.Explicación:
fuente
sz
lugar deQ
?Q
, tengo que reemplazar todos loslz
conl`Q
s.input
. Supongo que realmente está destinado a permitir una segunda lectura stdin ..?.z
y.Q
, aunque leen varias líneas de información y las almacenan en listas. Pero en realidad no he visto a alguien usar esta función. Es solo 1 byte para evaluar una cadena o para stringificar un número.Qz.Q.z
?MATL , 33
3540bytesPruébalo en línea!
fuente
Oracle SQL 11.2, 184 bytes
Sin golf
Utiliza la detección de ciclo incorporado para detener la recursividad.
fuente
Julia, 64 bytes
Pruébalo con Coding Ground .
fuente
Mathematica, 80 bytes
fuente
CJam, 37 bytes
Me encontré con un molesto problema de orden de pila que no puedo ver de inmediato cómo resolver. También es increíblemente lento.
Cómo funciona: cada iteración empuja el nuevo valor en la parte superior de la pila, luego envolvemos la pila en una matriz y vemos si es lo mismo que su unión consigo misma (para ver si tiene elementos duplicados). Cuando tenga elementos duplicados, deténgase y vea cuántos elementos hay en la pila.
fuente
Python 2, 82 bytes
Pruébalo en Ideone .
fuente
Python, 124 bytes
fuente
VBSCRIPT, 131 bytes
Lo mejor que pude hacer con vbscript, póster por primera vez, ¡así que sé fácil!
fuente