Desafio
Na menor quantidade de código:
- Calcule a duração do ciclo de permutação de um baralhamento perfeito em um baralho de cartas de qualquer tamanho n (onde n ≥ 2 e n são pares).
- Emita uma tabela de todos os comprimentos de ciclo para 2 ≤ n ≤ 1000 ( n pares).
Observe que existem duas maneiras básicas de definir um shuffle perfeito. Existe a saída aleatória , que mantém a primeira carta no topo e a última carta na parte inferior, e há a entrada aleatória , que move a primeira e a última cartas uma posição em direção ao centro. Você pode escolher se está fazendo um embaralhamento ou embaralhamento; o algoritmo é quase idêntico entre os dois.
- embaralhamento do baralho de 10 cartas: [1,2,3,4,5,6,7,8,9,10] ↦ [1,6,2,7,3,8,4,9,5, 10]
- baralhamento do baralho de 10 cartas: [1,2,3,4,5,6,7,8,9,10] ↦ [6,1,7,2,8,3,9,4,10, 5]
Exemplo gráfico
Aqui, vemos que uma saída aleatória em um baralho de 20 cartas tem uma duração de ciclo de 18 etapas. (Isso é apenas ilustrativo; sua solução não é necessária para gerar ciclos graficamente.) O baralho clássico de 52 cartas, por outro lado, possui um ciclo de saída aleatória de apenas 8 etapas (não mostrado).
Um embaralhamento em um baralho de 20 cartas tem uma duração de ciclo de apenas 6 etapas.
Exemplo tabular de saída
Seu programa deve gerar algo semelhante a isso, embora você possa escolher qualquer formato tabular que mais lhe agrade. Isto é para uma saída aleatória:
2 1
4 2
6 4
8 3
10 6
12 10
14 12
16 4
18 8
20 18
22 6
24 11
26 20
28 18
30 28
32 5
34 10
36 12
38 36
40 12
...many lines omitted...
1000 36
Questões
- Parece haver alguma conexão entre a entrada numérica n e sua contagem de ciclos, quando n é uma potência de 2?
- Que tal quando n não é uma potência de 2?
- Curiosamente, um baralho de 1000 cartas tem uma contagem de ciclo de shuffle de apenas 36, enquanto um baralho de 500 cartas tem uma contagem de ciclo de shuffle de 166. Por que isso pode acontecer?
- Qual é o maior número que você pode encontrar cuja contagem de ciclos c é muito menor que n , o que significa que a razão n / c é maximizada?
fonte
Respostas:
Haskell,
474644 (em ordem aleatória)a percepção básica é que essa é a ordem de 2 no grupo multiplicativo de módulo
n+1
.fonte
l=
- a própria expressão é suficiente. Esse é um programa válido quando executado na linha de comando interativa.Pitão, 16 bytes
Em ordem aleatória usando A002326 .
fonte
Pitão, 22 bytes
Experimente online: Demonstração . Substitua 500 por um número menor, se estiver muito lento.
Explicação:
fonte
Mathematica, 53 (em ordem aleatória)
ou, não antagonisticamente espaçado
Resultado:
Cada entrada nas duas colunas é centralizada horizontalmente nas colunas, mas eu não tenho os espaços fracionários
 
... 
aqui para replicar isso.Observações:
{2^n - 2, n}
,{2^n, 2n}
. (Pares aleatórios2^n
comn
.)2
extremidade mais próxima do baralho dobra a cada passo.{2, 4, 8, 15 = -5, -10, -20}
. De fato, isso é verdade para todos os cartões. Portanto, precisamos apenas saber qual potência2
é congruente para1
modificarn+1
onden
está o número de cartões. (Observe que no exemplo, as cartas da última coluna, coluna-1
, são dobradas para a penúltima coluna,-2
o que significa que0
é congruente com mais uma carta do que no baralho, portanto, "modn+1
".) Portanto, o MultiplicativeOrder [] função é o caminho a percorrer (no Mathematica).fonte
C, 86 (ou 84)
A pontuação exclui espaços em branco desnecessários, incluídos para maior clareza.
Este é um embaralhamento, que, como indicado por outros, é apenas o embaralhamento com as cartas estacionárias nas duas extremidades removidas.
Conforme apontado por outros, no embaralhamento, a posição de cada carta dobra a cada vez, mas isso deve ser tomado como módulo
n+1
. Eu gosto de pensar que a posição extra da carta está na posição zero à esquerda da mesa (você pode pensar nisso como segurando as duas cartas estacionárias da saída aleatória também). Obviamente, a posição do cartão deve sempre ser positiva; portanto, a posição zero sempre permanece vazia para o caso de embaralhamento.O código é inicializado
i
com o valor den
. Em seguida, ele multiplica por 2, pega o resultado mod(n+1)
e verifica sei
retornou ao seu valor inicial (i-n
é zero). Ele aumentaj
para cada iteração, exceto a última (daí a necessidade de inicializarj
para 1.)Em princípio,
i
pode estar com qualquer valor no intervalo1..n
, desde que a comparação no final verifique se foi inicializada com o mesmo número. O motivo da escolhan
foi garantir que o programa funcionasse para o cason==0
. o problema era que qualquer módulo numérico(0+1)
é zero; portanto, o loop nunca terminava nesse caso sei
fosse inicializado para uma constante como 1.Os exemplos de perguntas incluem o caso equivalente
n==2
para o shuffle de saída, portanto, foi interpretado que esse caso é necessário. Caso contrário, dois bytesn,
podem ser salvos, inicializandoi
para 1, o mesmo valor quej
.fonte