ช่วยฉันโกงที่โกง


13

Cheat เป็นเกมไพ่ที่คุณพยายามกำจัดมือของคุณ เทิร์นดูเหมือนอะไรประมาณนี้:

  1. พิจารณาว่าอันดับการ์ดใดที่คุณต้องเล่นในเทิร์นนั้น ในสายพันธุ์ส่วนใหญ่นี่คืออันดับหนึ่งสูงกว่าเทิร์นก่อนหน้า
  2. เล่น 1-4 ใบคว่ำหน้า สิ่งเหล่านี้ไม่จำเป็นต้องตรงกับอันดับที่ถูกต้อง ถ้าพวกเขาทำไม่ได้ก็ถือว่าโกง ณ จุดนี้ผู้เล่นคนใดอาจท้าทายคุณ
    • หากไม่มีใครท้าทายคุณเล่นต่อไปยังผู้เล่นคนต่อไป
    • หากใครบางคนท้าทายคุณและคุณไม่ได้โกงพวกเขาจะต้องเอาไพ่ที่เล่นทั้งหมดมา
    • หากใครบางคนท้าทายคุณและคุณโกงคุณต้องเอาไพ่ที่เล่นทั้งหมดมา

กลยุทธ์ส่วนใหญ่เป็นการผสมผสานระหว่างบลัฟฟ์และการนับไพ่ แต่ฉันไม่เก่งเรื่องคณิตศาสตร์ดังนั้นฉันจะโกง Cheat และนำบอทมาด้วย

อินพุต

อินพุตจะอยู่ในลำดับหรือรูปแบบที่คุณต้องการ:

  1. มือของผู้เล่น ถ้าฉันรู้ว่าพวกเขาจะต้องมีการ์ด (ตัวอย่างเช่นฉันเห็นพวกเขามารับพวกเขา) พวกนั้นจะถูกระบุไว้ในลำดับจากน้อยไปมาก ราชวงศ์ใด ๆ ?ที่จะได้รับการจดทะเบียนหลังจากนั้นเป็น ตัวอย่างเช่นถ้าพวกเขามีหกใบและฉันรู้ว่าสองคนคือ 1 และเป็นหนึ่ง 4 114???เป็นตัวแทนที่ถูกต้องของมือเป็น จะถูกระบุไว้หลังจากการ์ดที่รู้จักเสมอ 141???และ11???4เป็นทั้งอินพุตที่ไม่ถูกต้องและรหัสของคุณไม่จำเป็นต้องจัดการ
  2. การ์ดที่ฉันรู้ว่าไม่ใช่ส่วนหนึ่งของมือของพวกเขา (ฉันมีพวกเขาฉันเห็นคนอื่นมารับพวกเขา ฯลฯ ) รายการจะเรียงตามลำดับจากน้อยไปมาก รายการอาจว่างเปล่า
  3. ไพ่ที่ผู้เล่นอ้างว่าเล่น หากพวกเขาอ้างว่าการเล่น 3 7 777ของการป้อนข้อมูลที่เป็นไปได้ที่นี่จะเป็น ไพ่จะอยู่ในอันดับเดียวกันเสมอ

จำนวนไพ่ที่เล่นจะเป็น 1-4 และอันดับจะเป็น 0-9 เสมอ อันดับจะไม่ปรากฏในมือมากกว่าสี่ครั้ง + ไม่ใช่ในมือ

นี่เป็นตัวอย่างอินพุตที่ถูกต้อง:

33577??
01555688
55

นี่เป็นตัวอย่างอินพุตที่ไม่ถูกต้อง:

35377?? # Out of order
7779    # Five 7's in total
23      # Two separate ranks played

เอาท์พุต

คุณค่าที่แท้จริงถ้าเราควรท้าทายอย่างแน่นอน ค่าที่ไม่ถูกต้องหากเราไม่ต้องการท้าทาย

เราท้าทายเสมอถ้าเรารู้ว่าพวกเขาโกง เรารู้ว่าพวกเขาถูกโกงหากพวกเขาเล่นไพ่พวกเขาอาจไม่มี:

12

3  # They don't have any 3's or ?'s    
-------------
12?

33 # Fewer ?'s than played cards
-------------
123?
333
33 # Since we have three 3's they can't have two

อีกครั้งที่เราท้าทายคือถ้าพวกเขาเล่นไพ่ใบสุดท้าย แม้ว่าการเล่นจะถูกต้อง แต่มันก็จบเกมดังนั้นเราอาจจะท้าทายมันเช่นกัน

1

1 # They'd win, so challenge anyway

กรณีทดสอบเพิ่มเติม

ความจริง (ควรท้าทาย)

11445678?

22
-------------
????????
4
4444
-------------
12345678

9

Falsey (ไม่ควรท้าทาย)

1?
222
2
-------------
12?
22
22
-------------
?????

1111

เกณฑ์การให้คะแนน

รหัสที่สั้นที่สุดชนะ


7
นี่คือ bullsh * t :)
jacksonecac

มีผู้เล่นกี่คน
jacksonecac

@jacksonecac คุณดูเพียงหนึ่งการเล่นดังนั้นคุณไม่ต้องกังวลว่าจะมีผู้เล่นกี่คน
Hovercouch


2
คุณไม่ควรที่จะท้าทายในกรณีที่ผิดพลาดครั้งที่สอง?
StephenTG

คำตอบ:



1

JavaScript (ES6), 93 ไบต์

(h,s,c,g=(a,z=c[0])=>a.split(z).length-1)=>h.length==g(c)|g(h,'?')+g(h)<g(c)|g(h)+g(s)+g(c)>4

ยอมรับไพ่สามสาย (ตัวอักษร0- 9หรือ?); ผลตอบแทน1สำหรับความท้าทายเป็น0อย่างอื่น คำอธิบาย:

(h,s,c,                 Input parameters
 g=(a,z=c[0])=>         Helper function defaults to claimed card
  a.split(z).length-1   Count cards matching (g(c) == c.length)
)=>h.length==g(c)       Does hand length equal claim length
  |g(h,'?')+g(h)<g(c)   Could hand not contain claimed cards
  |g(h)+g(s)+g(c)>4     Are there too many claimed cards

1

C # 6, 134 ไบต์

using System.Linq;
bool f(string a,string b,string c)=>a.Length==1|a.Count(x=>x==c[0]|x=='?')<c.Length|b.Count(x=>x==c[0])+c.Length>4;

(หมายเหตุ: ตามตัวอย่างของ OP คำตอบนี้กลับเท็จแม้ว่าฝ่ายตรงข้ามมีไพ่มากกว่าหนึ่งใบและเล่นมือทั้งหมดของเขาในแง่ของกลยุทธ์นี้ควรกลับคืนจริง)

คำอธิบาย:

a: มือของผู้เล่น
b: ไพ่ที่ฉันรู้แน่นอน ...
c: ไพ่ที่อ้างว่าเล่น

Ungolfed:

bool f(string a, string b, string c) => 
    a.Length == 1                               // Last card played
    | a.Count(x => x == c[0] | x == '?' )       // Count no. of cards that surely/may match claimed cards
                                                // Assuming all claimed cards are the same, just compare with c[0]
        < c.Length                              // I'm sure you don't have that many cards...
    | b.Count(x => x == c[0]) + c.Length > 4;   // ... Or that there can't be that many cards in play

ไม่ควรจะเป็นa.Length==1 a.Length==c.Lengthคุณดูเหมือนจะบอกอะไรทำนองนั้นในบันทึกย่อของคุณ แต่ฉันไม่รู้ว่าตัวอย่างของ OP ที่คุณอ้างถึงนั้นเป็นไปได้หรือไม่ว่ามีการเล่นไพ่เพิ่มขึ้นจากนั้นจำนวนการ์ดที่ฝ่ายตรงข้ามมีอยู่ในมือ
Kevin Cruijssen

1

Java 8, 169 135 ไบต์

(a,b,c)->{int C=c.length();char x=c.charAt(0);return a.length()==C|(a+0).split(x+"|\\?",-1).length<=C|5-(b+0).split(""+x,-1).length<C;}

คำอธิบาย:

ลองที่นี่

(a,b,c)->{            // Method with three String parameters and boolean return-type
  int C=c.length();   //  The amount of cards played by your opponent this turn
  char x=c.charAt(0); //  The card played by your opponent this turn
  return a.length()==C//  Return true if your opponent played his entire hand (final round)
    |(a+0).split(x+"|\\?",-1).length
                      //   Or the amount of the played card and '?' in your opponent's hand
      <=C             //   is smaller than the amount of cards played
    |5-(b+0).split(""+x,-1).length
                      //   Or if 4 minus the amount of the played card are part of the
                      //   cards you definitely know, 
     <C;              //   is smaller than the amount of cards played
}                     // End of method

หมายเหตุ: (s+0).split("c",-1).length-1ให้จำนวนครั้งที่ตัวอักษรที่เกิดขึ้นในสตริงc sดังนั้นความคิดเห็นในคำอธิบายข้างต้นจึงถูกต้อง แต่รหัสอาจดูแตกต่างออกไป (a+0).split(x+"|\\?",-1).length-1<Cจะแข็งแรงเล่นกอล์ฟไป(a+0).split(x+"|\\?",-1).length<=Cและจะแข็งแรงเล่นกอล์ฟไป4-(b+0).split(""+x,-1).length-1<C5-(b+0).split(""+x,-1).length<C

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.