Tradimenti ottimali su BINGO


12

Sei stufo di altri giocatori che annunciano compiaciuto "BINGO" e ti passano davanti trionfalmente per ottenere il loro premio. Questa volta sarà diverso. Hai corrotto il chiamante per darti in anticipo le chiamate BINGO , nell'ordine in cui verranno chiamate. Ora devi solo creare una tavola BINGO che vincerà il prima possibile per quelle chiamate, garantendoti una vittoria (o un pareggio improbabile).

Data una stringa o un elenco delimitato di chiamate in ordine, nel tipico formato BINGO (lettere incluse, ad esempio B9o G68, vedere le regole per ulteriori informazioni), genera una matrice o un elenco 2D che rappresenta una scheda BINGO ottimale per tali chiamate. Supponiamo che l'input sia sempre valido.

Regole BINGO:

  • Scheda 5x5
  • Un "BINGO" è quando la tua carta ha 5 numeri di fila dai numeri che sono stati chiamati finora.
  • Il quadrato centrale è libero (conteggiato automaticamente verso un BINGO) e può essere rappresentato da spazi bianchi, un elenco vuoto -1o 0.
  • 5 colonne sono rappresentate dalle lettere B, I, N, G, O, rispettivamente.
  • La prima colonna può contenere i numeri 1-15, la seconda 16-30, ... e la quinta 61-75.
  • Le lettere e i numeri presi per l'input possono facoltativamente essere delimitati (da qualcosa che ha un senso, come uno ,o uno spazio) o presi come una tupla di un personaggio e un numero.
  • L'output richiede solo numeri in ogni posizione della matrice.
  • I quadrati che non contribuiranno al tuo BINGO iniziale devono essere validi, ma non devono essere ottimali.
  • Questo è code-golf, vince il codice più corto

Esempi:

Sto usando questo formato di input per gli esempi, perché è più breve. Vedere la sezione sopra per formati di input / output accettabili.

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]]

Dici che le lettere sono incluse. Cosa vogliono dire?
Blu,

1
@muddyfish Secondo le regole BINGO :The 5 columns are represented by the letters B,I,N,G,O, respectively.
JungHwan Min

Risposte:


4

Mathematica, 302 byte

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

Funzione senza nome che prende come argomento un elenco di coppie ordinate, come {{N,42},{N,34},{O,66},{N,40},...}(si noti che il primo elemento in ciascuna coppia ordinata non è una stringa ma piuttosto un simbolo nudo) e che restituisce un elenco 2D di numeri interi, in cui le liste secondarie rappresentano colonne (non righe) del tabellone del bingo.

Uscita per il primo caso di test:

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

In generale, quando si verifica il primo bingo possibile a causa di un numero chiamato in ciascuna delle righe B / I / G / O, quei numeri saranno nella riga centrale; ogni colonna conterrà altrimenti i quattro numeri più piccoli possibili (tenendo conto del numero già utilizzato). Ad esempio, se il primo caso di test viene modificato in modo che il secondo numero chiamato sia B12invece di B2, allora sarà la prima colonna della scheda di output {1,2,12,3,4}.

Uscita per il secondo caso di test:

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

In generale, quando si verifica il primo bingo possibile a causa di cinque numeri chiamati in una singola colonna (o quattro chiamati nella colonna N), le restanti quattro colonne contengono i loro cinque numeri più piccoli possibili in ordine.

Se il secondo caso di test viene modificato da {{N,42},{N,34},{O,66},{N,40},...}a{{O,72},{O,74},{O,66},{N,40},...} (solo le prime due voci sono state modificate), l'output è:

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

Versione un po 'non golfata:

(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 prima riga è principalmente definizioni per abbreviare il codice, sebbene gprepari il quadrato centrale {N,0}all'input per semplificare la ricerca del bingo. (La nfunzione fornisce i cinque numeri legali di bingo più piccoli nel# colonna Th, indicizzati 1. La ofunzione prende una 5 tupla e sposta il primo elemento in modo che sia terzo.)

Il While loop nelle righe 2-6 trova il segmento iniziale più piccolo dell'input che contiene un bingo. (La terza riga esegue il test per i bingo a colonna singola, mentre la quinta riga esegue il test per i bingo a colonna singola).

Per qualsiasi funzione F, l'operatore MapIndexed[F,{B,I,N,G,O}](a partire dalla riga 7) produce la 5 tupla {F{B,1},F{I,2},F{N,3},F{G,4},F{O,5}}(beh, tecnicamente è {F{B,{1}},...}); applichiamo una funzione Fche crea una colonna di bingo dai suoi due argomenti. Tale funzione, tuttavia, dipende dal tipo di bingo trovato: la riga 8 è vera quando abbiamo un bingo a colonna singola, nel qual caso la funzione (riga 9) utilizza i numeri di input pertinenti nella colonna del bingo e i numeri predefiniti nella altre colonne. Nell'altro caso, la funzione (righe 10-12) utilizza i numeri di input rilevanti al centro di ogni colonna e numeri predefiniti altrove.


2
Cosa, nessuna Bingofunzione integrata?
mbomb007,

—Si aspetta, il built-in Bingonon è vietato? <corre per cambiare risposta>
Greg Martin il

3

JavaScript (ES6) 372 byte

Probabilmente può ancora essere giocato un po 'a golf, ma non vedo come. I suggerimenti sono molto apprezzati;)

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}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.