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.

Phillip Senn
fonte
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);
chocochaos
fonte
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}*?,
Ventero
fonte
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
Joey
fonte
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?

Alberto Fernández
fonte
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

rturnbull
fonte
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))
Mikera
fonte
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)]
Karl Napf
fonte