Оптимальный читерство в BINGO

12

Вы устали от других игроков, которые самодовольно объявляют «БИНГО» и триумфально проходят мимо вас, чтобы получить свой приз. На этот раз все будет иначе. Вы подкупили вызывающего абонента, чтобы он давал вам звонки BINGO заранее, в порядке их вызова. Теперь вам просто нужно создать доску BINGO, которая выиграет как можно раньше для этих коллов, гарантируя вам выигрыш (или маловероятную ничью).

Если задана строка с разделителями или список вызовов по порядку, в типичном формате BINGO (включая буквы, например, B9или G68см. Правила), выведите матрицу или 2D-список, представляющий оптимальную плату BINGO для этих вызовов. Предположим, что ввод всегда будет действительным.

Правила БИНГО:

  • Доска 5х5
  • «БИНГО» - это когда на вашей карте 5 номеров подряд из тех номеров, которые уже были вызваны.
  • Центральный квадрат свободен (автоматически подсчитывается в БИНГО) и может быть представлен пробелом, пустым списком -1или 0.
  • В 5 колонок представлены буквами B, I, N, G, O, соответственно.
  • Первый столбец может содержать цифры 1-15, второй 16-30, ... и пятый 61-75.
  • Буквы и цифры, взятые для ввода, могут при желании быть разделены (чем-то, что имеет смысл, например, ,или пробел) или могут быть приняты как кортеж символа и числа.
  • Вывод требует только числа в каждом месте в матрице.
  • Квадраты, которые не будут способствовать вашему раннему БИНГО, должны быть действительными, но не обязательно должны быть оптимальными.
  • Это код-гольф, выигрывает самый короткий код

Примеры:

Я использую этот формат ввода для примеров, потому что он короче. См. Раздел выше для приемлемых форматов ввода / вывода.

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
источник
Вы говорите, что буквы включены. Что они имеют в виду?
Blue
1
@muddyfish Согласно правилам БИНГО :The 5 columns are represented by the letters B,I,N,G,O, respectively.
JungHwan Мин.

Ответы:

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-кортеж и перемещает первый элемент так, чтобы он стал третьим.)

WhileЦикл в строках 2-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}}(ну, технически это {F{B,{1}},...}); мы применяем функцию, Fкоторая создает столбец доски бинго из двух аргументов. Эта функция, однако, зависит от того, какой тип бинго был найден: строка 8 верна, когда у нас есть бинго из одного столбца, и в этом случае функция (строка 9) использует соответствующие входные номера в столбце бинго и номера по умолчанию в другие столбцы. В другом случае функция (строки 10-12) использует соответствующие входные номера в центре каждого столбца и номера по умолчанию в других местах.

Грег Мартин
источник
2
Что, нет встроенной Bingoфункции?
mbomb007
- ждать, встроенное 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}
Люк
источник