Hacer trampas óptimas en BINGO

12

Estás harto de que otros jugadores anuncien con presunción "BINGO" y te pasen triunfante para reclamar su premio. Esta vez será diferente. Sobornó a la persona que llamó para que le diera las llamadas BINGO con anticipación, en el orden en que se llamarán. Ahora solo necesita crear un tablero BINGO que gane lo antes posible para esas llamadas, garantizándole una victoria (o un empate poco probable).

Dada una cadena delimitada o una lista de las llamadas en orden, en formato BINGO típico (letras incluidas, por ejemplo, B9o G68, vea las reglas para obtener más información), envíe una matriz o una lista 2D que represente un tablero BINGO óptimo para esas llamadas. Suponga que la entrada siempre será válida.

Reglas de BINGO:

  • Tablero 5x5
  • Un "BINGO" es cuando su tarjeta tiene 5 números seguidos de los números que se han llamado hasta ahora.
  • El cuadrado central es libre (se cuenta automáticamente para un BINGO) y puede representarse mediante espacios en blanco, una lista vacía -1, o 0.
  • Las 5 columnas están representadas por las letras B, I, N, G, O, respectivamente.
  • La primera columna puede contener los números 1-15, la segunda 16-30, ... y la quinta 61-75.
  • Las letras y los números tomados para la entrada pueden delimitarse opcionalmente (por algo que tenga sentido, como un ,o espacio) o tomarse como una tupla de un carácter y un número.
  • La salida requiere solo números en cada lugar de la matriz.
  • Los cuadrados que no contribuirán a su BINGO inicial deben ser válidos, pero no tienen que ser óptimos.
  • Este es el código de golf, el código más corto gana

Ejemplos:

Estoy usando este formato de entrada para los ejemplos, porque es más corto. Consulte la sección anterior para ver los formatos de entrada / salida aceptables.

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]]
mbomb007
fuente
Dices que las letras están incluidas. ¿Qué quieren decir?
Azul
1
@muddyfish Bajo las reglas de BINGO :The 5 columns are represented by the letters B,I,N,G,O, respectively.
JungHwan Min

Respuestas:

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})&

Función sin nombre que toma como argumento una lista de pares ordenados, como {{N,42},{N,34},{O,66},{N,40},...}(tenga en cuenta que el primer elemento en cada par ordenado no es una cadena sino un símbolo desnudo), y devuelve una lista 2D de enteros, donde las sublistas representan columnas (no filas) del tablero de bingo.

Salida para el primer caso de prueba:

{{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}}

En general, cuando ocurre el bingo más temprano posible debido a un número llamado en cada una de las filas B / I / G / O, esos números estarán en la fila central; cada columna contendrá los cuatro números más pequeños posibles (teniendo en cuenta el número ya utilizado). Por ejemplo, si se cambia el primer caso de prueba para que el segundo número llamado sea en B12lugar de B2, entonces la primera columna de la placa de salida será {1,2,12,3,4}.

Salida para el segundo caso de prueba:

{{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}}

En general, cuando ocurre el bingo más temprano posible debido a cinco números llamados en una sola columna (o cuatro llamados en la columna N), las cuatro columnas restantes contienen sus cinco números más pequeños posibles en orden.

Si el segundo caso de prueba cambia de {{N,42},{N,34},{O,66},{N,40},...}a {{O,72},{O,74},{O,66},{N,40},...}(solo cambian las dos primeras entradas), la salida es:

{{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}}

Versión un tanto sin golf:

(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}
])&

La primera línea es principalmente definiciones para acortar el código, aunque gantepone el cuadrado central {N,0}a la entrada para simplificar la búsqueda de bingo. (La nfunción proporciona los cinco números de bingo legales más pequeños en la #columna th, indexados en 1. La ofunción toma una tupla de 5 y mueve el primer elemento para que sea el tercero).

El Whilebucle en las líneas 2-6 encuentra el segmento inicial más pequeño de la entrada que contiene un bingo. (La tercera línea prueba los bingos de una columna en cada columna, mientras que la quinta línea prueba los bingos de una columna).

Para cualquier función F, el operador MapIndexed[F,{B,I,N,G,O}](comenzando en la línea 7) produce la tupla de 5 {F{B,1},F{I,2},F{N,3},F{G,4},F{O,5}}(bueno, técnicamente es {F{B,{1}},...}); Aplicamos una función Fque crea una columna de tablero de bingo a partir de sus dos argumentos. Sin embargo, esa función depende del tipo de bingo encontrado: la línea 8 es verdadera cuando tenemos un bingo de una sola columna, en cuyo caso la función (línea 9) usa los números de entrada relevantes en la columna de bingo y los números predeterminados en el otras columnas En el otro caso, la función (líneas 10-12) usa los números de entrada relevantes en el centro de cada columna y los números predeterminados en otra parte.

Greg Martin
fuente
2
¿Qué, no hay Bingofunción incorporada?
mbomb007
—Espera, Bingo¿no está permitido incorporarlo ? <corre para cambiar la respuesta>
Greg Martin
3

JavaScript (ES6) 372 Bytes

Probablemente todavía se pueda jugar un poco al golf, pero no veo cómo. Las sugerencias son muy 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}
Luke
fuente