Le but de ce puzzle est de prendre un jeu de 52 cartes et de le mélanger pour que chaque carte soit dans une position aléatoire.
Donné:
- Un tableau,
deck
de 52 entiers distincts représentant les cartes. Lorsque vous commencez,deck
contient exactement une de chaque carte dans un ordre inconnu. - Une fonction
int rand(min, max)
,, qui renvoie un entier aléatoire entre les entiersmin
etmax
, inclus. Vous pouvez supposer que cette fonction est vraiment aléatoire. - Une fonction,
void swap(x, y)
qui échange deux cartes dans le jeu. Si vous appelezswap(x, y)
, les cartes aux positionsx
ety
changeront de place.
Quand:
- Le programme appelle
shuffle()
(oushuffle(deck)
oudeck.shuffle()
ou comme votre implémentation aime s'exécuter),
Alors:
deck
doit contenir exactement une de chaque carte dans un ordre parfaitement aléatoire.
The Catch:
Vous ne pouvez déclarer aucune variable. Appelez swap
et rand
autant que vous le souhaitez, mais vous ne pouvez pas déclarer vos propres variables. Cela inclut les for
compteurs de boucles - même ceux implicites comme dans a foreach
.
Clarifications:
- Vous pouvez modifier des détails mineurs en fonction de la langue choisie. Par exemple, vous pouvez écrire
swap
pour commuter deux entiers par référence. Les changements devraient être de faire fonctionner cela avec votre langue, et non de rendre le puzzle plus facile. deck
peut être une variable globale, ou vous pouvez l'intégrer comme paramètre.- Vous pouvez faire tout ce que vous voulez sur le contenu
deck
, mais vous ne pouvez pas changer sa longueur. - Vos cartes peuvent être numérotées 0-51, 1-52 ou tout ce que vous voulez.
- Vous pouvez écrire ceci dans n'importe quelle langue, mais sans tricher avec la fonction intégrée de votre langue
shuffle
. - Oui, vous pouvez écrire la même ligne 52 fois. Personne ne sera impressionné.
- Le temps d'exécution n'a pas d'importance, mais le vrai hasard le fait.
- Ce n'est pas vraiment du golf de code, mais n'hésitez pas à minimiser / obscurcir votre code.
Edit: code de chaudière et visualiseur
Si vous avez utilisé .NET ou JavaScript, voici un code de test qui peut vous être utile:
JavaScript:
- Visualiseur JavaScript rapide et sale, avec source CoffeeScript: https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- Version exécutable (collez simplement votre
shuffle()
fonction): http://jsfiddle.net/4zxjmy42/
C #:
- Visualiseur ASP.NET avec code C # derrière: https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- Stub avec uniquement les méthodes
swap
etrand
utilitaires: https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41
Ce code trie et mélange le paquet plusieurs milliers de fois et effectue des tests d'intégrité de base: pour chaque mélange, il vérifie qu'il y a exactement 52 cartes dans le paquet sans répétition. Ensuite, le visualiseur trace la fréquence de chaque carte se terminant à chaque endroit du jeu, affichant une carte de chaleur en niveaux de gris.
La sortie du visualiseur doit ressembler à de la neige sans motif apparent. Évidemment, cela ne peut pas prouver le vrai hasard, mais c'est un moyen rapide et facile de vérifier par sondage. Je recommande de l'utiliser ou quelque chose comme ça, car certaines erreurs dans l'algorithme de brassage conduisent à des modèles très reconnaissables dans la sortie. Voici un exemple de la sortie de deux implémentations, l'une avec une faille commune:
La version défectueuse mélange partiellement le jeu, donc pourrait bien paraître si vous avez examiné le tableau à la main. Le visualiseur permet de remarquer plus facilement un motif.
deck
lui-même.
swap
votre choix, tant qu'elle remplit son objectif de base. Une partie de ma raison de faire swap
un don était pour que les gens puissent le traiter comme de la «magie» et se concentrer sur le problème principal sans avoir à se soucier qu'il fonctionne dans la langue de son choix. Vous pouvez le faire ou écrire le vôtre swap
, c'est à vous de décider.