Giúp tôi gian lận tại Cheat


13

Cheat là một trò chơi bài trong đó bạn đang cố gắng thoát khỏi tay bạn. Một ngã rẽ trông giống như thế này:

  1. Xác định thứ hạng thẻ bạn phải chơi trong lượt đó. Trong hầu hết các biến thể, đây là một cấp bậc cao hơn lượt trước.
  2. Chơi 1-4 thẻ, úp mặt. Chúng không phải phù hợp với thứ hạng hợp lệ. Nếu họ không, nó được coi là một mánh gian lận . Tại thời điểm này, bất kỳ người chơi có thể thách thức bạn.
    • Nếu không có ai thách thức bạn, hãy tiếp tục chơi cho người chơi tiếp theo.
    • Nếu ai đó thách thức bạn và bạn không gian lận, họ phải lấy tất cả các thẻ đã chơi.
    • Nếu ai đó thách thức bạn và bạn đã gian lận, bạn phải lấy tất cả các thẻ đã chơi.

Chiến lược chủ yếu là sự pha trộn giữa vô tội vạ và đếm thẻ. Mặc dù tôi rất kém môn toán, vì vậy tôi sẽ gian lận tại Cheat và mang theo một con bot.

Đầu vào

Đầu vào sẽ, theo bất kỳ thứ tự hoặc định dạng nào bạn muốn:

  1. Tay của người chơi. Nếu tôi biết rằng họ phải có thẻ (ví dụ: tôi đã thấy họ nhặt chúng), những thẻ đó sẽ được liệt kê theo thứ tự tăng dần. Bất kỳ ẩn số sẽ được liệt kê sau đó như ?. Ví dụ: nếu họ có sáu thẻ và tôi biết rằng hai là 1 và một là 4, thì đại diện hợp lệ của tay là 114???. ? 'sẽ luôn được liệt kê sau khi thẻ đã biết. 141???11???4là cả hai đầu vào không hợp lệ và mã của bạn không cần phải xử lý chúng.
  2. Những lá bài tôi chắc chắn biết không phải là một phần của bàn tay họ (tôi có chúng, tôi đã thấy người khác nhặt chúng, v.v.). Danh sách này sẽ được xếp theo thứ tự tăng dần. Danh sách có thể trống.
  3. Các thẻ người chơi yêu cầu chơi. Nếu họ tuyên bố chơi 3 7 giây, một đầu vào có thể có ở đây sẽ là 777. Các thẻ sẽ luôn được xếp hạng giống nhau.

Số lượng thẻ đã chơi sẽ luôn là 1-4 và thứ hạng sẽ luôn là 0-9. Một thứ hạng sẽ không bao giờ xuất hiện quá bốn lần trong tay + không phải tay của họ.

Đây là một ví dụ đầu vào hợp lệ:

33577??
01555688
55

Đây là một ví dụ đầu vào không hợp lệ:

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

Đầu ra

Một giá trị trung thực nếu chúng ta chắc chắn nên thách thức. Một giá trị falsey nếu chúng ta có thể không muốn thách thức.

Chúng tôi luôn thách thức nếu chúng tôi biết họ lừa dối. Chúng tôi biết họ đã gian lận nếu họ chơi bài mà họ không thể có:

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

Lần khác chúng tôi thách thức là nếu họ chơi những lá bài cuối cùng của họ. Ngay cả khi trò chơi hợp pháp, nó sẽ kết thúc trò chơi, vì vậy chúng tôi cũng có thể thách thức nó.

1

1 # They'd win, so challenge anyway

Thêm trường hợp kiểm tra

Chân lý (nên thách thức)

11445678?

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

9

Falsey (không nên thách thức)

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

1111

Chấm điểm

Mã ngắn nhất sẽ thắng.


7
Đây là
nhảm nhí

Có bao nhiêu người đang chơi?
jacksonecac

@jacksonecac bạn chỉ nhìn vào một lần chơi, vì vậy bạn không phải lo lắng về việc có bao nhiêu người chơi.
Hovercouch

1
Đây phải là một cuộc chinh phạt của vua trên đồi
Vlo

2
Bạn có nên thử thách trong trường hợp falsey thứ hai không?
StephenTG

Câu trả lời:



1

JavaScript (ES6), 93 byte

(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

Chấp nhận ba chuỗi thẻ (ký tự 0- 9hoặc ?); trở lại 1cho thách thức, 0nếu không. Giải trình:

(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 byte

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;

(Lưu ý: Theo ví dụ của OP, câu trả lời này trả về sai ngay cả khi đối thủ có nhiều hơn một thẻ và đang chơi tất cả các tay của anh ta. Về mặt chiến lược, điều này sẽ trả về đúng.)

Giải trình:

a: Hand hand
b: Thẻ tôi chắc chắn biết ...
c: Thẻ được yêu cầu chơi

Ung dung:

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

Không nên a.Length==1a.Length==c.Length. Bạn dường như ám chỉ điều gì đó giống như trong ghi chú của bạn, nhưng tôi không biết ví dụ nào về OP mà bạn đang đề cập đến có thể có nhiều thẻ được chơi hơn số lượng thẻ mà đối thủ có trong tay.
Kevin Cruijssen

1

Java 8, 169 135 byte

(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;}

Giải trình:

Hãy thử nó ở đây.

(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

LƯU Ý: (s+0).split("c",-1).length-1đưa ra số lần ký tự cxuất hiện trong Chuỗi s. Vì vậy, các ý kiến ​​trong giải thích ở trên là chính xác, nhưng mã có thể khác nhau vì nó. Các (a+0).split(x+"|\\?",-1).length-1<Cđược golfed đến (a+0).split(x+"|\\?",-1).length<=C4-(b+0).split(""+x,-1).length-1<Cđược golfed tới 5-(b+0).split(""+x,-1).length<C.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.