การโกงที่เหมาะสมที่สุดที่ BINGO


12

คุณเบื่อผู้เล่นคนอื่นอย่างประกาศอย่าง "บิงโก" และเดินผ่านคุณอย่างมีชัยไปเพื่อรับรางวัล คราวนี้มันจะแตกต่างกัน คุณติดสินบนผู้โทรเพื่อให้การโทรBINGOล่วงหน้าตามลำดับที่พวกเขาจะถูกเรียก ตอนนี้คุณเพียงแค่ต้องสร้างบอร์ดบิงโกที่จะชนะเร็วที่สุดสำหรับการโทรเหล่านั้นเพื่อรับประกันว่าคุณจะได้รับชัยชนะ

กำหนดสตริงหรือรายการของการโทรตามลำดับในรูปแบบ BINGO ทั่วไป (รวมถึงตัวอักษรเช่นB9หรือG68ดูกฎสำหรับข้อมูลเพิ่มเติม) ส่งออกเมทริกซ์หรือรายการ 2D แสดงถึงบอร์ด BINGO ที่ดีที่สุดสำหรับการโทรเหล่านั้น สมมติว่าอินพุตจะถูกต้องเสมอ

กฎบิงโก:

  • บอร์ด 5x5
  • "บิงโก" คือเมื่อการ์ดของคุณมี 5 หมายเลขในแถวจากหมายเลขที่มีการเรียกจนถึง
  • จัตุรัสใจกลางฟรี (นับโดยอัตโนมัติต่อบิงโก) และอาจจะแทนด้วยช่องว่างรายชื่อที่ว่างเปล่าหรือ-10
  • 5 คอลัมน์จะแทนด้วยตัวอักษรB, I, N, G, Oตามลำดับ
  • คอลัมน์แรกอาจมีตัวเลข 1-15, 16-30, ... และคอลัมน์ที่ห้า 61-75
  • ตัวอักษรและตัวเลขที่ใช้ในการป้อนข้อมูลอาจเป็นตัวเลือกที่คั่นด้วย (โดยสิ่งที่เหมาะสมเช่น,หรือช่องว่าง) หรือนำมาเป็น tuple ของตัวละครและตัวเลข
  • เอาต์พุตต้องการตัวเลขในแต่ละตำแหน่งในเมทริกซ์เท่านั้น
  • สี่เหลี่ยมที่จะไม่นำไปสู่การเล่นชนิดหนึ่งในช่วงต้นของคุณจะต้องถูกต้อง แต่ไม่จำเป็นต้องดีที่สุด
  • นี่คือรหัส - กอล์ฟรหัสที่สั้นที่สุดชนะ

ตัวอย่าง:

ฉันใช้รูปแบบการป้อนข้อมูลนี้สำหรับตัวอย่างเนื่องจากสั้นกว่า ดูหัวข้อด้านบนสำหรับรูปแบบอินพุต / เอาท์พุตที่ยอมรับได้

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

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},...}(โปรดทราบว่าองค์ประกอบแรกในแต่ละคู่ที่สั่งไม่ใช่สตริง แต่เป็นสัญลักษณ์เปลือยเปล่า) และส่งกลับรายการจำนวนเต็ม 2 มิติโดยรายการย่อยแสดงถึงคอลัมน์ (ไม่ใช่ แถว) ของกระดานบิงโก

เอาต์พุตสำหรับกรณีทดสอบครั้งแรก:

{{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}กับอินพุตจะทำให้การค้นหา bingo ง่ายขึ้น ( nฟังก์ชั่นนี้ให้หมายเลขบิงโกที่ถูกกฎหมายห้าตัวที่เล็กที่สุดใน#คอลัมน์ที่ 1 ซึ่งมีการจัดทำดัชนี 1 oฟังก์ชั่นใช้เวลา 5-tuple และย้ายองค์ประกอบแรกเพื่อให้เป็นที่สาม)

Whileห่วงในสาย 2-6 พบว่าส่วนที่มีขนาดเล็กที่สุดเริ่มต้นของการป้อนข้อมูลที่มีบิงโก (การทดสอบบรรทัดที่สามสำหรับการเล่นชนิดหนึ่งหนึ่งในแต่ละคอลัมน์ในขณะที่การทดสอบบรรทัดที่ห้าสำหรับการเล่นชนิดหนึ่งคอลัมน์เดียว)

สำหรับฟังก์ชั่นใด ๆFตัวดำเนินการMapIndexed[F,{B,I,N,G,O}](เริ่มต้นในบรรทัดที่ 7) จะผลิต 5-tuple {F{B,1},F{I,2},F{N,3},F{G,4},F{O,5}}(ก็คือในทางเทคนิค{F{B,{1}},...}) เราใช้ฟังก์ชั่นFที่สร้างคอลัมน์ bingo-board จากสองข้อโต้แย้ง อย่างไรก็ตามฟังก์ชั่นนั้นขึ้นอยู่กับประเภทของการเล่นชนิดหนึ่งพบ: บรรทัด 8 เป็นจริงเมื่อเรามีบิงโกคอลัมน์เดียวซึ่งในกรณีนี้ฟังก์ชั่น (บรรทัด 9) ใช้หมายเลขอินพุตที่เกี่ยวข้องในคอลัมน์บิงโกและหมายเลขเริ่มต้นใน คอลัมน์อื่น ๆ ในอีกกรณีหนึ่งฟังก์ชั่น (บรรทัดที่ 10-12) จะใช้หมายเลขอินพุตที่เกี่ยวข้องในกึ่งกลางของแต่ละคอลัมน์และหมายเลขเริ่มต้นที่อื่น


2
อะไรไม่มีBingoฟังก์ชั่นในตัว?
mbomb007

cmd- รอในตัวBingoไม่ได้ไม่ได้รับอนุญาต? <วิ่งเพื่อเปลี่ยนคำตอบ>
Greg Martin

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.