Générateur de cartes de bingo

10

Une carte de Bingo est composée de cinq colonnes de cinq carrés chacune, le carré du milieu étant désigné "GRATUIT". Les nombres ne peuvent pas être dupliqués.

Les cinq colonnes sont remplies avec la plage de nombres suivante:

  • B: 1-15
  • I: 16-30
  • N: 31-45
  • G: 46-60
  • O: 61-75

En aussi peu de caractères que possible, sortez une chaîne qui peut être interprétée comme une carte de bingo aléatoire. Par exemple:

1,2,3,4,5,16,17,18,19,20,31,32,33,34,35,46,47,48,49,50,61,62,63,64,65

Cet exemple n'est pas randomisé pour que je puisse montrer que la colonne 1 est remplie avec 1,2,3,4,5. Notez également que l'espace libre n'a reçu aucun traitement spécial car le frontal qui interprète cette chaîne le sautera.

Un autre exemple serait:

1,16,31,46,61,2,17,32,47,62 ...

Dans cet exemple, la sortie se fait par ligne au lieu de par colonne.

Un troisième exemple pourrait être:

01020304051617181920313233343546474849506162636465

Il s'agit de la même sortie que le 1er exemple, sauf en longueur fixe.

Phillip Senn
la source
Suis-je le seul à n'avoir jamais entendu parler de Bingo mais uniquement de Bullshit Bingo?
Joey
Oui! C'est ça! Mon idée est de proposer une liste de 75 mots ou plus et de remplir la carte avec SELECT * FROM List ORDER BY NEWID ()
Phillip Senn

Réponses:

2

PHP, 86

for($o=[];25>$i=count($o);){$n=rand(1,15)+($i-$i%5)*3;$o[$n]=$n;}echo implode(",",$o);
chocochaos
la source
Bienvenue à PPCG, belle première réponse c:
Rod
Merci, je viens de remarquer un peu trop tard que cette question a 5 ans ... xD Je ne sais pas si c'est important
chocochaos
joinest un alias pour ìmplodeet vous pouvez placer l'assignation dans la boucle after. Cela raccourcira votre idée àfor($o=[];25>$i=count($o);$o[$n]=$n)$n=rand(1,15)+($i-$i%5)*3;echo join(",",$o);
Jörg Hülsermann
1

Ruby 1.9, 48 caractères

$><<(0..4).map{|i|[*1..75][15*i,15].sample 5}*?,
Ventero
la source
1

Windows PowerShell, 51 54

Je ne sais pas si j'ai bien compris votre tâche.

(0..4|%{($x=15*$_+1)..($x+14)|random -c 5})-join','

Exemples de sorties:

5,9,1,7,13,26,18,23,17,22,37,33,34,41,44,50,53,59,60,58,73,72,64,69,66
14,10,13,5,1,24,29,26,17,30,34,33,43,41,38,59,50,60,49,56,71,61,72,70,68
3,11,4,5,13,27,16,25,26,22,43,34,42,32,38,51,52,49,58,54,61,70,73,71,62
1,9,13,12,4,23,25,20,26,22,40,33,35,44,37,55,47,52,59,53,74,70,75,64,69
8,6,7,1,9,16,21,23,18,17,35,41,37,38,34,60,50,57,51,59,66,75,73,74,71
11,6,13,4,1,29,27,24,22,18,40,35,41,32,43,51,54,57,58,53,74,71,69,66,64
Joey
la source
1

PHP 106

<?$z=1;for($i=0;$i<5;$i++){for($j=0;$j<rand(1,5);$j++){$o[]=rand($z,$z+15);}$z+=15;}echo implode(",", $o);

Je ne suis pas sûr d'avoir bien compris le problème ... Pouvez-vous fournir une explication plus détaillée?

Alberto Fernández
la source
La sortie est incorrecte. Vous devez toujours sortir les 25 cases :)
chocochaos
1

R, 63 51 50 49 45 octets

Merci à Billywob pour ses suggestions continues et pour avoir encouragé ma séquence de compétitions.

cat(sapply(split(n<-1:75,cut(n,5)),sample,5))

5 14 15 3 1 20 30 28 18 27 32 45 42 43 41 49 54 50 56 47 68 66 64 73 71

rturnbull
la source
L'approche vectorisée que j'ai essayée est un peu plus courte. cat(sapply(list(15,16:30,31:45,46:60,61:75),sample,5))Edit: peu importe l'impression, ajouté à la catplace
Billywob
@Billywob Merci, c'est une excellente réponse! J'en ai depuis trouvé un qui est encore plus court. (Non vectorisé, malheureusement.)
rturnbull
1
Vous pouvez le faire tourne encore mieux: cat(sapply(split(1:75,ceiling(1:75/15)),sample,5)). Fonctionne en divisant le vecteur 1:75en une liste où chaque élément est un vecteur de longueur 15au lieu d'utiliser list()pour passer des objets sapply.
Billywob
Très agréable! J'ai fait publier votre solution pendant quelques secondes, mais j'ai ensuite compris comment vous surpasser d'un seul octet.
rturnbull
Hah! Encore mieux. Mais je ne pense pas que vous ayez besoin de l' labels = FALSEoption pour cut. Parce que tout ce qui compte, c'est qu'il y ait 5des facteurs répétitifs passés à la fonction de division, indépendamment des noms.
Billywob
0

Clojure - 52 caractères

(map #(take 5(shuffle %))(partition 15(range 1 76)))

Exemple de sortie (notez qu'il fournit les lignes séparées sous forme de sous-listes):

((4 1 12 10 2) (25 23 21 16 27) (39 33 45 44 43) (48 53 59 54 47) (73 71 61 64 63))
mikera
la source
0

Python 2, 84 octets

from random import*
print sum([sample(range(1+i*15,16+i*15),5)for i in range(5)],[])

Si la sortie en tant que liste si listes est correcte, il existe une solution à 75 octets :

from random import*
print[sample(range(1+i*15,16+i*15),5)for i in range(5)]
Karl Napf
la source