Trapaça ideal no BINGO


12

Você está cansado de outros jogadores anunciarem presunçosamente "BINGO" e passarem triunfantemente por você para reivindicar o prêmio. Desta vez será diferente. Você subornou o chamador para fazer as chamadas do BINGO com antecedência, na ordem em que serão chamadas. Agora você só precisa criar um quadro BINGO que vencerá o mais cedo possível para essas chamadas, garantindo uma vitória (ou um empate improvável).

Dada uma sequência ou lista delimitada de chamadas em ordem, no formato típico do BINGO (letras incluídas, por exemplo, B9ou G68consulte as regras para obter mais informações), produza uma matriz ou lista 2D representando uma placa BINGO ideal para essas chamadas. Suponha que a entrada sempre será válida.

Regras do BINGO:

  • Placa 5x5
  • Um "BINGO" é quando o seu cartão tem 5 números seguidos dos números que foram chamados até agora.
  • O quadrado central é livre (contado automaticamente para um BINGO) e pode ser representado por espaços em branco, por uma lista vazia -1ou por 0.
  • As colunas 5 são representados pelas letras B, I, N, G, O, respectivamente.
  • A primeira coluna pode conter os números 1 a 15, a segunda 16 a 30, ... e a quinta a 61 a 75.
  • As letras e números utilizados para entrada podem opcionalmente ser delimitados (por algo que faça sentido, como um ,ou espaço) ou tomados como uma tupla de um caractere e um número.
  • A saída requer apenas números em cada local da matriz.
  • Os quadrados que não contribuem para o seu BINGO inicial devem ser válidos, mas não precisam ser ótimos.
  • Este é o código-golfe, o código mais curto vence

Exemplos:

Estou usando esse formato de entrada para os exemplos, porque é mais curto. Veja a seção acima para formatos aceitáveis ​​de entrada / saída.

O61 B2 N36 G47 I16 N35 I21 O64 G48 O73 I30 N33 I17 N43 G46 O72 I19 O71 B14 B7 G50 B1 I22 B8 N40 B13 B6 N37 O70 G55 G58 G52 B3 B4 N34 I28 I29 O65 B11 G51 I23 G56 G59 I27 I25 G54 O66 N45 O67 O75 N42 O62 N31 N38 N41 G57 N39 B9 G60 I20 N32 B15 O63 N44 B10 I26 O68 G53 I18 B12 O69 G49 B5 O74 I24

Possible Output (this has a horizontal BINGO in 3rd row. A diagonal is also possible.): 
[[11,25,42,53,68], 
 [ 6,22,32,57,62],
 [ 2,16, 0,47,61],
 [ 3,17,37,59,75],
 [ 9,19,41,46,70]]

N42 N34 O66 N40 B6 O65 O63 N41 B3 G54 N45 I16 O67 N31 I28 B2 B14 G51 N36 N33 I23 B11 I17 I27 N44 I24 O75 N38 G50 G58 B12 O62 I18 B5 O74 G60 I26 B8 I22 N35 B1 B4 G53 O73 G52 O68 B10 O70 I30 G59 N43 N39 B9 G46 G55 O64 O61 I29 G56 G48 G49 I19 G57 N37 O72 I25 N32 B13 B7 B15 O71 I21 I20 O69 G47

Must be a vertical BINGO in 3rd (N) column (because 4 N's came before one of each B,I,G,O):
[[11,25,42,53,63], 
 [ 2,22,34,57,65],
 [ 6,16, 0,47,66],
 [ 3,17,41,54,75],
 [ 9,19,40,46,70]]

Você diz que as letras estão incluídas. O que eles querem dizer?
Azul

1
@muddyfish Sob as regras do BINGO :The 5 columns are represented by the letters B,I,N,G,O, respectively.
JungHwan Min 28/12

Respostas:


4

Mathematica, 302 bytes

(b=Prepend;i=1;n=15#&@@#-15+Range@5&;g=#~b~{N,0};o={#2,#3,#,##4}&@@#&;While[(l=Length@Union[t=(k=Take)[#&@@@g,i]])<5&&Max[#2&@@@Tally@t]<5,i++];If[l<5,m=#&@@Commonest@t;If[m===#,o[g~k~i/.{m,x_}->x/.{_,_}->Nothing],n@#2]&,o@DeleteDuplicates@b[n@#2,<|#->#2&@@@Reverse@g|>@#]~k~5&]~MapIndexed~{B,I,N,G,O})&

Função sem nome, tendo como argumento uma lista de pares ordenados, como {{N,42},{N,34},{O,66},{N,40},...}(observe que o primeiro elemento em cada par ordenado não é uma sequência, mas um símbolo nu) e retornando uma lista 2D de números inteiros, onde as sublistas representam colunas (não linhas) do tabuleiro de bingo.

Saída para o primeiro caso de teste:

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

Em geral, quando o bingo mais cedo possível ocorre devido a um número chamado em cada uma das linhas de B / I / G / O, esses números estarão na linha central; caso contrário, cada coluna conterá os quatro menores números possíveis (levando em consideração o número já usado). Por exemplo, se o primeiro caso de teste for alterado para que o segundo número chamado seja em B12vez de B2, a primeira coluna da placa de saída será {1,2,12,3,4}.

Saída para o segundo caso de teste:

{{1,2,3,4,5},{16,17,18,19,20},{42,34,0,40,41},{46,47,48,49,50},{61,62,63,64,65}}

Em geral, quando o bingo mais antigo possível ocorre por causa de cinco números chamados em uma única coluna (ou quatro chamados na coluna N), as quatro colunas restantes contêm os cinco menores números possíveis em ordem.

Se o segundo caso de teste for alterado de {{N,42},{N,34},{O,66},{N,40},...}para {{O,72},{O,74},{O,66},{N,40},...}(somente as duas primeiras entradas foram alteradas), a saída será:

{{1,2,3,4,5},{16,17,18,19,20},{31,32,33,34,35},{46,47,48,49,50},{74,66,72,65,63}}

Versão um pouco não destruída:

(b=Prepend;i=1;n=15First[#]-15+Range[5]&;g=b[#,{N,0}];o={#2,#3,#,##4}&@@#&;
While[
    (l=Length[Union[t=(k=Take)[Apply[#&,g,{1}],i]]])<5
  &&
    Max[Apply[#2&,Tally[t],{1}]]<5,
  i++];
MapIndexed[
  If[l<5,
    m=First[Commonest[t]];If[m===#,o[k[g,i]/.{m,x_}->x/.{_,_}->Nothing],n[#2]]&,
    k[
      o[DeleteDuplicates[b[n[#2],Association[Apply[#->#2&,Reverse[g],{1}]][#]]]]
    ,5]&
  ],{B,I,N,G,O}
])&

A primeira linha é composta principalmente por definições para encurtar o código, embora gprefira o quadrado central {N,0}da entrada para simplificar a busca de bingo. (A nfunção fornece os cinco menores números legais de bingo da #coluna th, indexados em 1. A ofunção pega uma tupla de 5 e move o primeiro elemento para que ele seja o terceiro.)

O Whileloop nas linhas 2-6 encontra o menor segmento inicial da entrada que contém um bingo. (A terceira linha testa bingos de uma em cada coluna, enquanto a quinta linha testa bingos de coluna única).

Para qualquer função F, o operador MapIndexed[F,{B,I,N,G,O}](começando na linha 7) produz a 5-tupla {F{B,1},F{I,2},F{N,3},F{G,4},F{O,5}}(bem, tecnicamente é {F{B,{1}},...}); aplicamos uma função Fque cria uma coluna no quadro de bingo a partir de seus dois argumentos. Essa função, no entanto, depende de qual tipo de bingo foi encontrado: a linha 8 é verdadeira quando temos um bingo de coluna única; nesse caso, a função (linha 9) usa os números de entrada relevantes na coluna de bingo e os números padrão no outras colunas. No outro caso, a função (linhas 10-12) usa os números de entrada relevantes no centro de cada coluna e os números padrão em outros lugares.


2
O que, nenhuma Bingofunção embutida?
mbomb007

- espere, o built-in Bingonão é permitido? <corre para alterar a resposta>
Greg Martin

3

JavaScript (ES6) 372 bytes

Provavelmente ainda pode jogar um pouco de golfe, mas não vejo como. As sugestões são muito apreciadas;)

A=a=>[1,2,3,4,5].map(x=>x+15*a),F=a=>{b=[[],[],[i=0],[],[]],a.replace(/[^0-9 ]/g,"").split` `.some(x=>{b[--x/15|(c=0)].push(++x);return b.some((x,i)=>(d=x.length)>4||d==1&i-2&&++c>3)});for(e=[A(0),A(1),A(2),A(3),A(4)];i<5;a=b[i][0],b[i][0]=b[i][2],b[i++][2]=a)for(j=0;j<5&b[i].length<5;j++)b[i][j]<i*15+5?e[i].splice(e[i].indexOf(b[i][j]),1):b[i][j]=e[i].shift();return b}
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.