Gerador de cartões de bingo


10

Um cartão de Bingo tem cinco colunas de cinco quadrados cada, com o quadrado do meio designado como "GRÁTIS". Os números não podem ser duplicados.

As cinco colunas são preenchidas com o seguinte intervalo de números:

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

Com o menor número de caracteres possível, imprima uma sequência que possa ser interpretada como um cartão de bingo aleatório. Por exemplo:

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 exemplo não é randomizado, para que eu possa mostrar que a coluna 1 é preenchida com 1,2,3,4,5. Observe também que o espaço livre não recebeu nenhum tratamento especial porque o front-end que interpreta essa cadeia de caracteres a ignorará.

Outro exemplo seria:

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

Neste exemplo, a saída é por linha em vez de por coluna.

Um terceiro exemplo pode ser:

01020304051617181920313233343546474849506162636465

Esta é a mesma saída que o primeiro exemplo, exceto em comprimento fixo.


Eu sou o único que nunca ouviu falar do Bingo, mas apenas do Bullshit Bingo?
— Joey

Sim! É isso aí! Minha idéia é chegar a uma lista de 75 ou mais palavras e preencher o cartão com SELECT * FROM lista ORDER BY NEWID ()
— Phillip Senn

Respostas:


2

PHP, 86

for($o=[];25>$i=count($o);){$n=rand(1,15)+($i-$i%5)*3;$o[$n]=$n;}echo implode(",",$o);

Bem-vindo ao PPCG, boa primeira resposta c: #:
— Rod

Obrigado, eu só notei um pouco tarde demais que esta questão é de 5 anos ... xD Não tenho certeza se isso importa embora
— chocochaos

joiné um alias para ìmplodee você pode colocar a atribuição no loop after. Isso encurtará a sua ideiafor($o=[];25>$i=count($o);$o[$n]=$n)$n=rand(1,15)+($i-$i%5)*3;echo join(",",$o);
— Jörg Hülsermann 26/10

1

Ruby 1.9, 48 caracteres

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

1

Windows PowerShell, 51 54

Não tenho certeza se entendi sua tarefa corretamente.

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

Saídas de amostra:

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

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

Não sei se entendi corretamente o problema ... Você pode fornecer uma explicação mais detalhada?


A saída está incorreta. Você sempre precisa de saída todas as 25 praças :)
— chocochaos

1

R, 63 51 50 49 45 bytes

Agradeço a Billywob pelas sugestões contínuas e por incentivar minha veia 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


A abordagem vetorizada que tentei é um pouco mais curta. cat(sapply(list(15,16:30,31:45,46:60,61:75),sample,5))Edit: não importa a impressão, adicionado em catvez disso #
— Billywob

@ Billywob Obrigado, é uma ótima resposta! Desde então, encontrei um que é ainda mais curto. (Não vetorizado, infelizmente.)
— rturnbull

11
Acontece que você pode fazer ainda melhor: cat(sapply(split(1:75,ceiling(1:75/15)),sample,5)). Funciona dividindo o vetor 1:75em uma lista onde cada elemento é um vetor de comprimento em 15vez de usar list()para passar objetos sapply.
— 23416 Billywob

Muito agradável! Eu publiquei sua solução por alguns segundos, mas depois descobri como superar você por um único byte.
— rturnbull

Hah! Melhor ainda. Mas acho que você não precisa da labels = FALSEopção cut. Porque tudo o que importa é que há 5fatores repetidos passados ​​para a função de divisão, independentemente dos nomes.
— Billywob

0

Clojure - 52 caracteres

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

Exemplo de saída (observe que ele fornece as linhas separadas como sub-listas):

((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))

0

Python 2, 84 bytes

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

Se a saída como list se list estiver correta, há uma solução de 75 bytes :

from random import*
print[sample(range(1+i*15,16+i*15),5)for i in range(5)]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.