Entrée sortie:
Entrée : une chaîne uniformément aléatoire, infiniment longue, de «0 et de 1», prise à partir de stdin. La chaîne est supposée être vraiment aléatoire, pas pseudo-aléatoire. Il est uniforme en ce que chaque caractère est également susceptible d'être un «0» ou un «1».
Prudent! L'entrée est infiniment longue, vous ne pouvez donc pas tout stocker en mémoire en utilisant une fonction comme raw_input () en python. Si je ne me trompe pas, golfscript échouera avec une entrée infinie, car il pousse toute l'entrée sur la pile avant de courir.
Sortie : Un deck standard mélangé de manière uniforme et aléatoire, sans jokers. Il est uniforme en ce sens que toutes les commandes sont également probables.
Chaque carte dans la sortie est son rang, A, 2-9, T, J, Q ou K concaténé avec sa couleur, c, d, h ou s. Par exemple, le 10 de pique estTs
Les cartes du jeu doivent être séparées par des espaces.
Vous ne pouvez pas utiliser de bibliothèques ou de fonctions aléatoires intégrées car elles ne sont pas vraiment aléatoires, uniquement pseudo-aléatoires.
Exemple d'entrée
Vous pouvez utiliser le script python suivant pour diriger les entrées dans votre programme:
import sys, random
try:
while True:
sys.stdout.write(str(random.randint(0,1)))
except IOError:
pass
Si vous enregistrez le script sous rand.py, testez votre programme avec python rand.py | your_program
En python 3, il fonctionne comme prévu, mais en python 2.7 j'obtiens un message d'erreur après la sortie de mon programme, mais seulement après que tout soit fait, donc ignorez simplement le message d'erreur.
Exemple de sortie:
Voici comment imprimer le jeu s'il est mélangé dans un ordre trié:
Ac 2c 3c 4c 5c 6c 7c 8c 9c Tc Jc Qc Kc Ad 2d 3d 4d 5d 6d 7d 8d 9d Td Jd Qd Kd Ah 2h 3h 4h 5h 6h 7h 8h 9h Th Jh Qh Kh As 2s 3s 4s 5s 6s 7s 8s 9s Ts Js Qs Ks
Notation:
Ceci est un golf de code. Le code le plus court gagne.
Exemple de programme:
Voici une solution python 2.7, non golfée.
import sys
def next():
return int(sys.stdin.read(1))==1
def roll(n):
if n==1:
return 0
if n%2==0:
r=roll(n/2)
if next():
r+=n/2
return r
else:
r=n
while(r==n):
r=roll(n+1)
return r
deck = [rank+suit for suit in 'cdhs' for rank in 'A23456789TJQK']
while len(deck)>0:
print deck.pop(roll(len(deck))),
Réponses:
Ruby,
8987 caractèresEdit: version précédente
la source
Python 122
Explication:
Les cartes inutilisées sont stockées dans D. Cela obtient simplement le prochain index aléatoire valide du flux d'entrée et fait apparaître cet élément de D.
À moins que je manque quelque chose, il ne devrait pas y avoir de parti pris. Le script rejettera tous les index invalides>
len(D)
, mais cela n'entraîne pas de biais pour les nombres inférieurs car chaque pop successif réduira l'index de chaque élément au-delà de i.la source
Perl, 80 caractères
voici une autre implémentation qui ne souffre pas du biais et qui est plus courte de deux caractères:
ancienne implémentation (82 caractères):
ancienne description d'implémentation:
la source
sort
, ce qui entraîne un biais vers l'ordre alphabétique.C,
197178161 caractèresEDIT : Utilisation d'une nouvelle fonction aléatoire, qui est beaucoup plus courte - lit un entier à 4 chiffres
s
et utilises%64
. Chaque nombre décimal à 6 chiffres composé de 0 et 1 seulement, pris%64
donne un résultat unique, donc le caractère aléatoire est bon.Cette approche consomme beaucoup plus de bits aléatoires, mais est beaucoup plus courte.
La logique de base est simple - initialiser un tableau de 52 pouces avec 0..51, mélanger (remplacer aléatoirement l'élément x par un autre de la plage 0..x), imprimer au format (n / 4 = rang, n% 4 = costume) .
Une boucle, qui s'exécute 104 fois, effectue l'initialisation (52 premières exécutions), le mélange et l'impression (les 52 dernières exécutions).
Un nombre aléatoire est généré en tirant
n
des bits aléatoires, jusqu'à ce qu'il1<<n
soit au moins le maximum souhaité. Si le résultat est supérieur au maximum - réessayez.la source
s>7?"ATJQK"[s-8]:s+50
est plus long que le simple"A23456789TJQK"[s]
. Deuxièmement, vous pouvez utilisert/4
ett%4
au lieu det%13
ett/13
.t
dans le tableau lors de la sortieshell unix ~ 350
Ce n'est ni court ni joli, ni efficace, mais je me demandais à quel point ce serait difficile de le faire avec les utilitaires shell standard unix.
Cette réponse coupe la chaîne binaire infinie en longueurs de 6 bits et ne choisit que celles qui sont dans la plage correcte (1-52), ici la chaîne binaire infinie est simulée par urandom et xxd:
Le hachage et la sélection se fait avec fold, sed et bc:
Cela produit des lignes telles que:
Qui peut être dirigé vers bc.
À partir de ce flux de nombres, la séquence du jeu est choisie comme ceci (j'utilise zsh, mais la plupart des shells modernes devraient être adaptables à cela):
La séquence de nombres aléatoires doit maintenant être changée en noms de cartes. La séquence de noms de cartes est facilement générée avec GNU parallèle:
Combiner la sortie des deux dernières commandes avec coller et trier sur les nombres:
Le tout comme un monoplace monstrueux (uniquement testé en zsh):
Modifier - version bash ajoutée
Voici une version qui fonctionne en bash. J'ai supprimé les
{ }
index internes et les tableaux sont basés sur zéro. La vacuité des tableaux est vérifiée avec une expansion des paramètres, légèrement plus efficace et également adoptée dans l'exemple ci-dessus.la source
K&R c - 275
char
littéraux restants par desint
littérauxGolfé:
À peu près la force brute ici. Je viens de lire neuf bits de l'entrée pour former une sortie RNG minimale et faire la réduction de module de redessiner si les valeurs inutilisées à la fin pour obtenir une sortie uniforme pour alimenter un shuffle de sélection.
Cette version non-golfée diffère en ce qu'elle prend l'entrée
/dev/urandom
plutôt que le format d'entrée décrit.la source
"TJQKA"
et"cdhs"
?int
s. J'ai compris. Cela peut valoir la peine de conserver toute la ponctuation. Pourrait même prendre en compte lachar
sortiegetchar
etputchar
avec une macro pâteuse folle ...#define N
et se terminer par une nouvelle ligne qui compte comme un caractère et c'est 11, plus le bit que vous remplacez. Il y a certainement quelques caractères de plus pour remplacer une partie ou la totalité des littéraux de caractère par des littéraux int, mais il est tard ici ... peut-être que je le ferai une autre fois.PHP, 158 caractères
Des nouvelles lignes ont été ajoutées pour empêcher le bloc de code de gagner des barres de défilement, elles peuvent être supprimées en toute sécurité.
Avant qu'on me dise d'ajouter un
<?php
, sachez que vous pouvez invoquer PHP sans cette balise assez facilement, en utilisant:cat golf.php | php -a
De-golfé et commenté:
Il y a deux erreurs attendues, qui n'affectent pas la sortie du programme.
Le premier est parce que
$a
n'est pas initialisé, mais le NULL est converti en 0 et le programme continue.Le second est parce que le flux de caractères semble obtenir une nouvelle ligne quelque part, même s'il n'est pas fourni (bon vieux PHP), et c'est un index non défini dans le tableau. Il s'agit du dernier caractère d'entrée et n'affecte pas la sortie.
la source