BINGOでの最適な不正行為


12

あなたは、他のプレイヤーが "BINGO"を無言で発表し、勝ち誇ってあなたのそばを通り過ぎて彼らの賞品を獲得することにうんざりしています。今回は異なります。呼び出し元に賄briを贈り、BINGOの呼び出しを事前に呼び出します。今、あなたはそれらのコールのためにできるだけ早く勝つBINGOボードを作成する必要があります。

区切られた文字列または呼び出しのリストを、通常のBINGO形式(たとえば、B9またはなどの文字が含まれるG68詳細)で、それらの呼び出しに最適なBINGOボードを表すマトリックスまたは2Dリストを出力します。入力は常に有効であると想定します。

ビンゴのルール:

  • 5x5ボード
  • 「ビンゴ」とは、あなたのカードにこれまでに呼ばれた数字から連続して5つの数字があるときです。
  • 中央の広場は無料で(自動的にBINGOにカウントされます)、空白、空のリスト-1、またはで表されます0。
  • 5列は文字で表されB、I、N、G、O、それぞれ。
  • 最初の列には1〜15、2番目の16〜30、...、および5番目の61〜75が含まれます。
  • 入力に使用される文字と数字は、オプションで区切られ,たり(スペースなどの意味のあるもので)、文字と数字のタプルとして使用されます。
  • 出力には、マトリックスの各場所に数字のみが必要です。
  • 初期のBINGOに寄与しない正方形は有効でなければなりませんが、最適である必要はありません。
  • これはコードゴルフです。最短のコードが勝ちます

例:

短いので、この入力形式を例に使用しています。許容される入出力形式については、上記のセクションを参照してください。

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

あなたは手紙が含まれていると言います。彼らはどういう意味ですか?
— ブルー

1
@muddyfish ビンゴ規則の下で:The 5 columns are represented by the letters B,I,N,G,O, respectively.
— ジョンファンミン

回答:


4

Mathematica、302バイト

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

次のような順序付きペアのリストを引数としてとる名前のない関数 {{N,42},{N,34},{O,66},{N,40},...}(各順序ペアの最初の要素は文字列ではなく、裸のシンボルであることに注意してください受け取り、サブリストが列を表す2D整数リストを返します(行)ビンゴボードの。

最初のテストケースの出力:

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

一般に、各B / I / G / O行で呼び出された番号が原因で可能な限り早いビンゴが発生すると、それらの番号は中央の行になります。それ以外の場合、各列には4つの可能な最小数が含まれます(既に使用されている数を考慮に入れます)。たとえば、最初のテストケースが変更され、2番目の番号がB12でなく2番目に呼び出される場合B2、出力ボードの最初の列は次のようになります。{1,2,12,3,4}。

2番目のテストケースの出力:

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

一般に、単一の列で呼び出された5つの数字(またはN列で呼び出された4つの数字)によって可能な限り早いビンゴが発生した場合、残りの4つの列には5つの最小の数字が順番に含まれます。

第二のテストケースをから変更された場合{{N,42},{N,34},{O,66},{N,40},...}に{{O,72},{O,74},{O,66},{N,40},...}(最初の2つのエントリが変更され)、その後、出力は次のようになります。

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

やや未使用版:

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

最初の行は主にコードを短縮するための定義ですが、ビンゴ検索を簡素化するために入力のg中央に正方形{N,0}を追加します。(このn関数は、#thカラムに最小の5つの有効なビンゴ番号を1インデックスで与えます。o関数は5タプルを取り、3番目になるように最初の要素を移動します。)

While2〜6行目のループは、ビンゴを含む入力の最小の初期セグメントを見つけます。(3行目は各列に1つのビンゴをテストし、5行目は単一列のビンゴをテストします)。

どの関数についてもF、演算子MapIndexed[F,{B,I,N,G,O}](7行目から開始)は5タプル{F{B,1},F{I,2},F{N,3},F{G,4},F{O,5}}(まあ、技術的には{F{B,{1}},...})を生成します。F2つの引数からビンゴボード列を作成する関数を適用します。ただし、その関数は、検出されたビンゴのタイプによって異なります。単一列のビンゴがある場合、8行目は真です。その場合、関数(9行目)はビンゴ列の関連する入力番号と、他の列。それ以外の場合、関数(行10〜12)は、各列の中央に関連する入力番号を使用し、他の場所ではデフォルトの番号を使用します。


2
何、組み込みBingo関数はありませんか?
— mbomb007 16

—待って、組み込みBingoは許可されていませんか?<回答を変更するために実行>
— グレッグマーティン

3

JavaScript(ES6)372バイト

まだ少しゴルフはできるかもしれませんが、どのように見えるかわかりません。提案は大歓迎です;)

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}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.