BINGO的最佳作弊


12

您已经厌倦了其他玩家自鸣得意地宣布“ BINGO”并胜利地走过您领取他们的奖金。这次将有所不同。您贿赂了呼叫者,让他们按呼叫顺序提前给您BINGO呼叫。现在,您只需要创建一个BINGO板,就能尽快赢得这些电话,从而确保您获胜(或平局)。

给定定界的呼叫字符串或呼叫列表,以典型的BINGO格式(包含的字母,例如B9G68,请参阅规则以了解更多信息),输出代表这些呼叫的最佳BINGO板的矩阵或2D列表。假设输入将始终有效。

宾果规则:

  • 5x5板
  • “宾果”是指您的卡上到目前为止有5个连续的数字。
  • 中心正方形是免费的(自动计入BINGO),并且可以由空格,空白列表-1或表示0
  • 5列由字母表示BINGO,分别。
  • 第一列可以包含数字1-15,第二列16-30,...和第五列61-75。
  • 输入的字母和数字可以有选择地定界(通过有意义的东西,例如a ,或空格)定界,或作为字符和数字的元组。
  • 输出仅需要矩阵中每个位置的数字。
  • 不会对您的早期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在BINGO规则下The 5 columns are represented by the letters B,I,N,G,O, respectively.
JungHwan Min

Answers:


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},...}(请注意,每个有序对中的第一个元素不是字符串,而是一个裸符号),并返回一个二维整数列表,其中子列表表示列(不行)。

第一个测试用例的输出:

{{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行中调用一个数字而导致最早的宾果游戏发生时,这些数字将位于中间行;否则,每列将包含四个可能的最小数字(考虑已使用的数字)。例如,如果更改了第一个测试用例,以便调用的第二个数字是B12而不是B2,那么输出板的第一列将是{1,2,12,3,4}

第二个测试用例的输出:

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

通常,当由于在单个列中调用了五个数字(或在N列中调用了四个数字)而导致最早的宾果游戏发生时,则其余四列将依次包含五个可能的最小数字。

如果将第二个测试用例从更改{{N,42},{N,34},{O,66},{N,40},...}{{O,72},{O,74},{O,66},{N,40},...}(仅更改了前两个条目),那么输出为:

{{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列中给出最小的五个合法宾果编号,以1为索引。该o函数采用5元组,并移动第一个元素,使其成为第三个元素。)

While2-6行中的循环查找包含宾果的输入的最小初始段。(第三行测试每个列的宾果,而第五行测试单个列的宾果)。

对于任何函数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}}(从技术上讲,是5元组{F{B,{1}},...});我们应用了一个函数F,该函数根据其两个参数创建一个宾果板列。但是,该功能取决于找到的宾果类型:当我们有单列宾果游戏时,第8行为true,在这种情况下,该功能(第9行)使用宾果列中的相关输入数字以及其他列。在另一种情况下,函数(第10-12行)在每列的中心使用相关的输入数字,并在其他位置使用默认数字。


2
什么,没有内置Bingo功能?
mbomb007'2013/

—等等,内置的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}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.