Introdução
O método do quadrado médio é usado para a geração de números pseudo-aleatórios. No entanto, na prática, esse não é um bom método, pois seu período geralmente é muito curto e apresenta algumas deficiências graves. Como é que isso funciona? Vamos dar um exemplo:
Para a semente, escolhemos 123456
:
Seed 123456
A semente ao quadrado (semente × semente) é igual a:
Seed² 15241383936
Começamos com um número de 6 dígitos . Isso significa que a semente ao quadrado deve fornecer um número de 12 dígitos . Se não for esse o caso, os zeros à esquerda são adicionados para compensar:
Seed² 015241383936
Pegamos então a parte do meio do número, com o mesmo tamanho da semente:
Seed² 015241383936
^^^^^^
Esta é então a nossa nova semente : 241383
. Repetimos o mesmo processo como mostrado acima. Temos o seguinte:
0: 123456
015241383936
| |
1: 241383
058265752689
| |
2: 265752
070624125504
| |
3: 624125
389532015625
| |
4: 532015
283039960225
| |
5: 039960
001596801600
| |
6: 596801
E isso continua por um tempo ... Agora que sabemos qual é o método do meio do quadrado, vamos ao desafio:
A tarefa
Toda semente tem um período . O período de uma semente de n dígitos não pode ser maior que 8 n . Por exemplo, a semente 82
. Isso daria a seguinte sequência:
82 > 72 > 18 > 32 > 02 > 00 > 00 > 00 > 00 > 00
|____|____|____|____|____|____|____|____|____|___...
0 1 2 3 4 5 6 7 8 9
Você pode ver que o período é igual a 5 , antes de conter o mesmo dígito novamente. Sua tarefa é, quando uma semente maior que 0 não contém zeros à esquerda, gera o período da semente . Portanto, neste caso, você precisa produzir 5
.
Outro exemplo é 24
:, que fornece o seguinte:
24 > 57 > 24
|____|____|___...
0 1 2
Como você pode ver, nem todas as seqüências terminam 0
. Este ciclo tem um período de 1 .
Casos de teste
Input > Output
24 > 1
82 > 5
123456 > 146
8989 > 68
789987 > 226
Os pastebins com as sequências para 123456 , 8989 , 789987
Isso é código-golfe , então a submissão com a menor quantidade de bytes ganha!
Você pode assumir que a entrada nunca terá um número desigual de dígitos.
24
é periódico (com o período 2, eu diria),82
é eventualmente periódico (com o período 1).Respostas:
Geléia,
262418 bytesExperimente online!
Como funciona
fonte
Pure bash,
162 131 116 113107Salva 3 bytes usando
$c
...Obrigado @Dennis por me ajudar a economizar mais 6 bytes.
---- begin middleSquare ----
---- end middleSquare ----
Quadrado, 131
---- begin middleSquare ----
---- end middleSquare ----
Antigo, mas com produção extravagante, 162
---- begin middleSquare ----
---- end middleSquare ----
fonte
JavaScript (ES7), 82 bytes
Aceita entrada na forma de uma string, por exemplo, "82" e retorna um número inteiro. Técnica recursiva simples da cauda para verificar cada semente, por sua vez, contra um hash de sementes que já foram vistas. Eu adiciono 100 ** l ao quadrado para garantir um comprimento consistente.
fonte
Python
32,13911497 bytesAgradecimentos a Seeq por jogar fora de 25 bytes e a Dennis por jogar 17 bytes! Código:
Definitivamente pode ser jogado ainda mais. Este também foi o código usado para criar os casos de teste: P.
fonte
Pitão, 21 bytes
Experimente on-line: Demonstration or Test Suite
edit: Encontrei o case de borda
1000
, que não funcionou com o meu código anterior. Corrigido por 1 byte.Explicação:
fonte
sz
vez deQ
?Q
, tenho que substituir todoslz
porl`Q
s.input
. Eu acho que é realmente para permitir uma segunda leitura stdin ..?.z
e.Q
, embora elas leiam várias linhas de entrada e as armazenem em listas. Mas eu realmente não vi alguém usar esse recurso. É apenas 1 byte para avaliar uma sequência ou especificar um número.Qz.Q.z
?MATL , 33
3540bytesExperimente online!
fonte
Oracle SQL 11.2, 184 bytes
Sem golfe
Ele usa a construção na detecção de ciclo para interromper a recursividade.
fonte
Julia, 64 bytes
Experimente com o Coding Ground .
fonte
Mathematica, 80 bytes
fonte
CJam, 37 bytes
Ocorreu um problema irritante de ordem de pilha que não consigo ver imediatamente como resolver. Também é incrivelmente lento.
Como funciona: Cada iteração empurra o novo valor no topo da pilha, em seguida, agrupamos a pilha em uma matriz e verificamos se é a mesma que sua união consigo mesma (para ver se há elementos duplicados). Quando houver elementos duplicados, pare e veja quantos elementos estão na pilha.
fonte
Python 2, 82 bytes
Experimente em Ideone .
fonte
Python, 124 bytes
fonte
VBSCRIPT, 131 bytes
O melhor que pude fazer com o vbscript, pôster da primeira vez, vá com calma comigo!
fonte