El objetivo de este rompecabezas es tomar un mazo de 52 cartas y barajarlo para que cada carta esté en una posición aleatoria.
Dado:
- Una matriz,
deck
de 52 enteros distintos que representan las cartas. Cuando comienzas,deck
contiene exactamente una de cada tarjeta en un orden desconocido. - Una función,
int rand(min, max)
que devuelve un entero aleatorio entre intsmin
emax
inclusive. Puede suponer que esta función es verdaderamente aleatoria. - Una función,
void swap(x, y)
que intercambia dos cartas en el mazo. Si llamaswap(x, y)
, las tarjetas en las posicionesx
yy
cambiarán de lugar.
Cuando:
- El programa llama
shuffle()
(oshuffle(deck)
odeck.shuffle()
o como quiera que se ejecute su implementación),
Luego:
deck
debe contener exactamente una de cada tarjeta en orden perfectamente aleatorio.
La captura:
No puedes declarar ninguna variable. Llama swap
y rand
tanto como quieras, pero no puedes declarar ninguna variable propia. Esto incluye for
contadores de bucle, incluso los implícitos como en a foreach
.
Aclaraciones:
- Puede cambiar detalles menores para adaptarlos al idioma elegido. Por ejemplo, puede escribir
swap
para cambiar dos enteros por referencia. Los cambios deberían ser para que esto funcione con su idioma, no para facilitar el rompecabezas. deck
puede ser una variable global o puede tomarlo como parámetro.- Puede hacer lo que quiera con el contenido
deck
, pero no puede cambiar su longitud. - Sus tarjetas pueden estar numeradas del 0 al 51, del 1 al 52 o de lo que desee.
- Puede escribir esto en cualquier idioma, pero no hacer trampa con la
shuffle
función incorporada de su idioma . - Sí, podrías escribir la misma línea 52 veces. Nadie quedará impresionado.
- El tiempo de ejecución no importa, pero la verdadera aleatoriedad sí.
- Esto no es realmente golf de código, pero siéntase libre de minimizar / ofuscar su código.
Editar: código repetitivo y visualizador
Si usó .NET o JavaScript, aquí hay algunos códigos de prueba que pueden resultarle útiles:
JavaScript:
- Visualizador JavaScript rápido y sucio, con fuente de CoffeeScript: https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- Versión ejecutable (solo pegue en su
shuffle()
función): http://jsfiddle.net/4zxjmy42/
C#:
- Visualizador ASP.NET con código C # detrás: https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- Stub con sólo las
swap
yrand
de servicios públicos métodos: https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41
Este código clasifica y baraja el mazo varios miles de veces y realiza algunas pruebas básicas de cordura: para cada barajado, verifica que hay exactamente 52 cartas en el mazo sin repeticiones. Luego, el visualizador traza la frecuencia de cada carta que termina en cada lugar del mazo, mostrando un mapa de calor en escala de grises.
La salida del visualizador debe verse como nieve sin un patrón aparente. Obviamente, no puede probar la verdadera aleatoriedad, pero es una forma rápida y fácil de verificar. Recomiendo usarlo o algo así, porque ciertos errores en el algoritmo de barajado conducen a patrones muy reconocibles en la salida. Aquí hay un ejemplo del resultado de dos implementaciones, una con una falla común:
La versión defectuosa baraja parcialmente el mazo, por lo que podría verse bien si examinaras la matriz a mano. El visualizador hace que sea más fácil notar un patrón.
deck
sí mismo.
swap
desee, siempre y cuando cumpla con su propósito básico. Parte de mi razón para hacer swap
un hecho era que las personas pudieran tratarlo como 'mágico' y concentrarse en el problema principal sin tener que preocuparse de que funcione en el idioma de su elección. Puedes hacer eso o escribir el tuyo swap
, depende de ti.