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,
deckde 52 entiers distincts représentant les cartes. Lorsque vous commencez,deckcontient exactement une de chaque carte dans un ordre inconnu. - Une fonction
int rand(min, max),, qui renvoie un entier aléatoire entre les entiersminetmax, 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 positionsxetychangeront de place.
Quand:
- Le programme appelle
shuffle()(oushuffle(deck)oudeck.shuffle()ou comme votre implémentation aime s'exécuter),
Alors:
deckdoit contenir exactement une de chaque carte dans un ordre parfaitement aléatoire.
The Catch:
Vous ne pouvez déclarer aucune variable. Appelez swapet randautant que vous le souhaitez, mais vous ne pouvez pas déclarer vos propres variables. Cela inclut les forcompteurs 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
swappour 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. deckpeut ê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
swapetrandutilitaires: 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.
decklui-même.
swapvotre choix, tant qu'elle remplit son objectif de base. Une partie de ma raison de faire swapun 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.