Generador de tarjetas de bingo

10

Una tarjeta de Bingo tiene cinco columnas de cinco casillas cada una, con la casilla central designada "GRATIS". Los números no pueden duplicarse.

Las cinco columnas se rellenan con el siguiente rango de números:

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

En la menor cantidad de caracteres posible, genere una cadena que se pueda interpretar como una tarjeta de Bingo aleatorizada. Por ejemplo:

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

Este ejemplo no está aleatorizado, por lo que puedo mostrar que la columna 1 se rellena con 1,2,3,4,5. También tenga en cuenta que el espacio libre no ha recibido ningún tratamiento especial porque el front-end que interpreta esta cadena lo omitirá.

Otro ejemplo sería:

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

En este ejemplo, la salida es por fila en lugar de por columna.

Un tercer ejemplo podría ser:

01020304051617181920313233343546474849506162636465

Esta es la misma salida que el primer ejemplo, excepto en longitud fija.

Phillip Senn
fuente
¿Soy el único que nunca ha oído hablar de Bingo, sino solo de Bullshit Bingo?
Joey
¡Si! ¡Eso es! Mi idea es crear una lista de 75 o más palabras y llenar la tarjeta con SELECT * FROM List ORDER BY NEWID ()
Phillip Senn

Respuestas:

2

PHP, 86

for($o=[];25>$i=count($o);){$n=rand(1,15)+($i-$i%5)*3;$o[$n]=$n;}echo implode(",",$o);
chocochaos
fuente
Bienvenido a PPCG, buena primera respuesta c:
Rod
Gracias, me di cuenta demasiado tarde de que esta pregunta tiene 5 años ... xD No estoy seguro si importa
Chocochaos
joines un alias para ìmplodey puede colocar la asignación en el bucle after. Esto acortará su idea afor($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 caracteres

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

Windows PowerShell, 51 54

Sin embargo, no estoy seguro si entendí tu tarea correctamente.

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

Resultados de muestra:

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
fuente
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);

No estoy seguro de haber entendido correctamente el problema ... ¿Puede proporcionar una explicación más detallada?

Alberto Fernández
fuente
La salida es incorrecta. Siempre necesitas generar los 25 cuadrados :)
chocochaos
1

R, 63 51 50 49 45 bytes

Gracias a Billywob por las sugerencias continuas y por alentar mi racha competitiva.

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
fuente
El enfoque vectorizado que probé es un poco más corto. cat(sapply(list(15,16:30,31:45,46:60,61:75),sample,5))Editar: no importa la impresión, agregada en su catlugar
Billywob
@Billywob ¡Gracias, esa es una gran respuesta! Desde entonces he encontrado uno que es aún más corto. (No vectorizado, desafortunadamente.)
rturnbull
1
Se gira que puede hacer aún mejor: cat(sapply(split(1:75,ceiling(1:75/15)),sample,5)). Funciona dividiendo el vector 1:75en una lista donde cada elemento es un vector de longitud en 15lugar de usar list()para pasar objetos sapply.
Billywob
¡Muy agradable! Tuve su solución publicada por unos segundos, pero luego descubrí cómo superarlo en un solo byte.
rturnbull
Ja! Aun mejor. Pero no creo que necesites la labels = FALSEopción cut. Porque lo único que importa es que se pasan 5factores repetidos a la función de división, independientemente de los nombres.
Billywob
0

Clojure - 52 caracteres

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

Ejemplo de salida (tenga en cuenta que proporciona las filas separadas como sublistas):

((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
fuente
0

Python 2, 84 bytes

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

Si la salida como list if lists está bien, hay una solución de 75 bytes :

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