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.