Оптимальний обман у BINGO


12

Вам нудно, що інші гравці самовільно оголошують "BINGO" і переможно проходять повз вас, щоб претендувати на свій приз. Цього разу буде інакше. Ви підкупили абонента, щоб достроково вам дзвонити BINGO у порядку, коли вони будуть дзвонити. Тепер вам просто потрібно створити дошку BINGO, яка виграє якомога раніше за ці дзвінки, гарантуючи вам виграш (або малоймовірний рахунок).

Враховуючи розділений рядок або список викликів в порядку, у типовому форматі BINGO (включені букви, наприклад, B9або G68, див. Правила для отримання додаткової інформації), виведіть матричний або двовимірний список, який представляє оптимальну плату BINGO для цих дзвінків. Припустимо, що введення завжди буде дійсним.

Правила BINGO:

  • Дошка 5х5
  • "BINGO" - це коли ваша картка має 5 номерів підряд від номерів, які раніше називались.
  • Центральна площа вільна (автоматично зараховується до BINGO) і може бути представлена ​​пробілом, порожнім списком -1або 0.
  • У 5 колонок представлені буквами B, I, N, G, O, відповідно.
  • Перший стовпець може містити числа 1-15, другий 16-30, ..., а п'ятий 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 За правилами BINGO :The 5 columns are represented by the letters B,I,N,G,O, respectively.
JungHwan Min

Відповіді:


4

Математика, 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, то ці числа будуть знаходитися в центральному ряді; кожен стовпець буде містити чотири найменші можливі числа (враховуючи вже використане число). Наприклад, якщо перший тестовий випадок змінено так, щоб другий номер, який викликається, був 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Функція дає найменші п’ять законних чисел бінго в #стовпці, 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}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.