Optimales Betrügen bei BINGO

12

Sie haben es satt, dass andere Spieler selbstgefällig "BINGO" ankündigen und triumphierend an Ihnen vorbei gehen, um ihren Preis zu gewinnen. Diesmal wird es anders sein. Sie haben den Anrufer bestochen, um Ihnen die BINGO- Anrufe im Voraus in der Reihenfolge zu übermitteln , in der sie angerufen werden. Jetzt müssen Sie nur noch ein BINGO-Board erstellen, das für diese Calls so früh wie möglich gewinnt und Ihnen einen Gewinn (oder ein unwahrscheinliches Unentschieden) garantiert.

Wenn eine durch Trennzeichen getrennte Zeichenfolge oder Liste der Anrufe in der angegebenen Reihenfolge im typischen BINGO-Format (Buchstaben enthalten, z. B. B9oder G68siehe die Regeln für weitere Informationen) angegeben ist, wird eine Matrix oder 2D-Liste ausgegeben, die eine optimale BINGO-Karte für diese Anrufe darstellt. Angenommen, die Eingabe ist immer gültig.

BINGO-Regeln:

  • 5x5 board
  • Ein "Bingo" ist, wenn Ihre Karte 5 Nummern in einer Reihe von den Nummern hat, die bisher angerufen wurden.
  • Das mittlere Quadrat ist frei (wird automatisch zu einem BINGO gezählt) und kann durch Leerzeichen, eine leere Liste -1oder dargestellt werden 0.
  • Die 5 Spalten sind durch die Buchstaben B, I, N, G, O, respectively.
  • Die erste Spalte kann die Nummern 1-15, die zweite 16-30, ... und die fünfte 61-75 enthalten.
  • Die für die Eingabe verwendeten Buchstaben und Zahlen können optional (durch ein sinnvolles ,Zeichen wie a oder ein Leerzeichen) oder als Tupel aus einem Zeichen und einer Zahl abgegrenzt werden .
  • Die Ausgabe erfordert nur Zahlen an jeder Stelle in der Matrix.
  • Quadrate, die nicht zu Ihrem frühen BINGO beitragen, müssen gültig sein, müssen aber nicht optimal sein.
  • Das ist Code-Golf, der kürzeste Code gewinnt

Beispiele:

Ich verwende dieses Eingabeformat für die Beispiele, weil es kürzer ist. Im obigen Abschnitt finden Sie akzeptable Eingabe- / Ausgabeformate.

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
quelle
Sie sagen, dass die Buchstaben enthalten sind. Was meinen sie?
Blue
1
@muddyfish Unter BINGO-Regeln :The 5 columns are represented by the letters B,I,N,G,O, respectively.
JungHwan Min

Antworten:

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

Unbenannte Funktion, die als Argument eine Liste geordneter Paare verwendet, z. B. {{N,42},{N,34},{O,66},{N,40},...}(Beachten Sie, dass das erste Element in jedem geordneten Paar keine Zeichenfolge, sondern ein nacktes Symbol ist) und eine 2D-Liste von Ganzzahlen zurückgibt, wobei die Unterlisten Spalten darstellen (nicht Reihen) des Bingobretts.

Ausgabe für den ersten Testfall:

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

Wenn das frühestmögliche Bingo aufgrund einer in jeder der B / I / G / O-Zeilen angerufenen Nummer auftritt, befinden sich diese Nummern im Allgemeinen in der mittleren Zeile. Ansonsten enthält jede Spalte die vier kleinstmöglichen Nummern (unter Berücksichtigung der bereits verwendeten Nummer). Wenn der erste Testfall verändert wird , so zum Beispiel, dass die zweite Zahl genannt wird , B12statt B2, dann wird die erste Spalte der Ausgabekarte sein wird {1,2,12,3,4}.

Ausgabe für den zweiten Testfall:

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

Wenn das frühestmögliche Bingo aufgrund von fünf in einer einzelnen Spalte aufgerufenen Zahlen (oder vier in der N-Spalte aufgerufenen Zahlen) auftritt, enthalten die verbleibenden vier Spalten in der Reihenfolge ihre fünf kleinstmöglichen Zahlen.

Wenn der zweite Testfall von {{N,42},{N,34},{O,66},{N,40},...}nach geändert wird {{O,72},{O,74},{O,66},{N,40},...}(nur die ersten beiden Einträge wurden geändert), lautet die Ausgabe:

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

Etwas ungolfed version:

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

Die erste Zeile besteht hauptsächlich aus Definitionen, um den Code zu verkürzen, obwohl gdas mittlere Quadrat {N,0}vor der Eingabe steht, um das Bingo-Finden zu vereinfachen. (Die nFunktion gibt die kleinsten fünf zulässigen Bingo-Zahlen in der dritten #Spalte mit einem Index an. Die oFunktion nimmt ein 5-Tupel und verschiebt das erste Element so, dass es das dritte ist.)

Die WhileSchleife in den Zeilen 2-6 findet das kleinste anfängliche Segment der Eingabe, das ein Bingo enthält. (Die dritte Zeile prüft auf Bingos in jeder Spalte, während die fünfte Zeile auf Bingos in einer Spalte prüft.)

Für jede Funktion erzeugt Fder Operator MapIndexed[F,{B,I,N,G,O}](beginnend in Zeile 7) das 5-Tupel {F{B,1},F{I,2},F{N,3},F{G,4},F{O,5}}(technisch gesehen also {F{B,{1}},...}); Wir wenden eine Funktion an F, die aus ihren beiden Argumenten eine Bingo-Board-Spalte erstellt. Diese Funktion hängt jedoch davon ab, welche Art von Bingo gefunden wurde: Zeile 8 ist wahr, wenn es sich um ein einspaltiges Bingo handelt. In diesem Fall verwendet die Funktion (Zeile 9) die entsprechenden Eingabenummern in der Bingo-Spalte und die Standardnummern in der andere Spalten. Im anderen Fall verwendet die Funktion (Zeilen 10-12) die entsprechenden Eingabenummern in der Mitte jeder Spalte und Standardnummern an anderer Stelle.

Greg Martin
quelle
2
Was, keine eingebaute BingoFunktion?
mbomb007
- Warten, eingebaut Bingoist nicht verboten? <rennt, um die Antwort zu ändern>
Greg Martin
3

JavaScript (ES6) 372 Bytes

Kann wohl noch ein bisschen golfen, aber ich verstehe nicht wie. Vorschläge werden sehr geschätzt;)

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
quelle