Desafío
En la menor cantidad de código:
- Calcule la duración del ciclo de permutación de una combinación perfecta en una baraja de cualquier tamaño n (donde n ≥ 2 yn es par).
- Imprima una tabla de todas las longitudes de ciclo para 2 ≤ n ≤ 1000 ( n par).
Tenga en cuenta que hay dos formas básicas de definir una combinación aleatoria perfecta. Está la combinación aleatoria , que mantiene la primera carta en la parte superior y la última carta en la parte inferior, y está la combinación aleatoria , que mueve la primera y la última carta una posición hacia el centro. Puede elegir si está haciendo una combinación aleatoria o una aleatoria; El algoritmo es casi idéntico entre los dos.
- salida de baraja de 10 cartas: [1,2,3,4,5,6,7,8,9,10] ↦ [1,6,2,7,3,8,4,9,5, 10]
- en baraja de 10 cartas: [1,2,3,4,5,6,7,8,9,10] ↦ [6,1,7,2,8,3,9,4,10, 5]
Ejemplo gráfico
Aquí, vemos que una combinación aleatoria en un mazo de 20 cartas tiene una duración de ciclo de 18 pasos. (Esto es solo para ilustración; su solución no es necesaria para generar ciclos gráficamente). La clásica baraja de 52 cartas, por otro lado, tiene una duración de ciclo de reproducción aleatoria de solo 8 pasos (no se muestra).
Una combinación aleatoria en un mazo de 20 cartas tiene una duración de ciclo de solo 6 pasos.
Ejemplo tabular de salida
Su programa debería generar algo similar a esto, aunque puede elegir el formato tabular que más le guste. Esto es para una mezcla aleatoria:
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
Preguntas
- ¿Parece haber alguna conexión entre el número de entrada ny su cuenta de ciclo, cuando n es una potencia de 2?
- ¿Qué tal cuando n no es una potencia de 2?
- Curiosamente, un mazo de 1000 cartas tiene un recuento de ciclo de shuffle de solo 36, mientras que un mazo de 500 cartas tiene un recuento de ciclo de shuffle de 166. ¿Por qué podría ser esto?
- ¿Cuál es el número más grande que puede encontrar cuyo número de ciclos c es mucho más pequeño que n , lo que significa que la relación n / c está maximizada?
fuente
Respuestas:
Haskell,
474644 (en orden aleatorio)la comprensión básica es que este es el orden de 2 en el grupo multiplicativo de módulo
n+1
.fuente
l=
- la expresión en sí es suficiente. Es un programa válido cuando se ejecuta en la línea de comandos interactiva.Pyth, 16 bytes
En barajado usando A002326 .
fuente
Pyth, 22 bytes
Pruébelo en línea: demostración . Reemplace 500 con un número más pequeño, si es demasiado lento.
Explicación:
fuente
Mathematica, 53 (mezcla aleatoria)
o, no espaciados antagónicamente
Salida:
Cada entrada en ambas columnas está centrada horizontalmente en sus columnas, pero no tengo los espacios fraccionarios
 
... 
aquí para replicar eso.Observaciones:
{2^n - 2, n}
,{2^n, 2n}
. (La combinación aleatoria se combina2^n
conn
).2
desde el extremo más cercano de la baraja se duplica en cada paso.{2, 4, 8, 15 = -5, -10, -20}
. De hecho, esto es cierto para cada tarjeta. Por lo tanto, solo necesitamos saber qué poder de2
es congruente con el1
mod,n+1
dónden
está el número de cartas. (Tenga en cuenta que en el ejemplo, las cartas en la última columna, columna-1
, se duplican a la penúltima columna,-2
lo que significa que0
es congruente con una carta más de la que está en el mazo, por lo tanto, "modn+1
".) Por lo tanto, el Orden Multiplicativa [] La función es el camino a seguir (en Mathematica).fuente
C, 86 (u 84)
La puntuación excluye espacios en blanco innecesarios, incluidos para mayor claridad.
Esta es una combinación aleatoria, que según lo señalado por otros, es solo la combinación aleatoria con las tarjetas estacionarias en ambos extremos retiradas.
Como señalaron otros, en la combinación aleatoria, la posición de cada carta se duplica cada vez, pero esto debe tomarse en módulo
n+1
. Me gusta pensar que la posición de la carta extra es la posición cero a la izquierda de la mesa (puedes pensar en esto como si tuvieras ambas cartas estacionarias de la barajadura también). Obviamente, la posición de la carta siempre debe ser positiva, por lo tanto, la posición cero siempre permanece vacía para el caso de barajar.El código se inicializa
i
al valor den
. Luego se multiplica por 2, toma el mod de resultados(n+1)
y verifica sii
ha vuelto a su valor inicial (i-n
es cero). Se incrementaj
para cada iteración, excepto la última (de ahí la necesidad de inicializarj
a 1.)En principio,
i
podría tener cualquier valor en el rango1..n
, siempre que la comparación al final verifique si se ha inicializado con el mismo número. La razón para elegirn
fue asegurarse de que el programa funciona para el cason==0
. el problema era que cualquier módulo de número(0+1)
es cero, por lo que el ciclo nunca terminaba en este caso sii
se inicializaba a una constante como 1.Los ejemplos de preguntas incluyen el caso equivalente
n==2
para la reproducción aleatoria, por lo que se interpretó que este caso es obligatorio. Si no es así,n,
se pueden guardar dos bytes inicializandoi
a 1, el mismo valor quej
.fuente