Bantu saya curang di Cheat

13

Cheat adalah permainan kartu di mana Anda mencoba menyingkirkan tangan Anda. Giliran terlihat kira-kira seperti ini:

  1. Tentukan peringkat kartu apa yang harus Anda mainkan pada giliran itu. Dalam sebagian besar varian ini adalah satu peringkat lebih tinggi dari giliran sebelumnya.
  2. Mainkan 1-4 kartu, menghadap ke bawah. Ini tidak harus cocok dengan peringkat yang valid. Jika tidak, itu dianggap cheat . Pada titik ini setiap pemain dapat menantang Anda.
    • Jika tidak ada yang menantang Anda, mainkan terus ke pemain berikutnya.
    • Jika seseorang menantang Anda dan Anda tidak curang, mereka harus mengambil semua kartu yang dimainkan.
    • Jika seseorang menantang Anda dan Anda curang, Anda harus mengambil semua kartu yang dimainkan.

Strategi ini sebagian besar merupakan campuran dari bluffing dan penghitungan kartu. Aku buruk dalam matematika, jadi aku akan menipu Cheat dan membawa bot.

Memasukkan

Masukan akan berupa, dalam urutan atau format apa pun yang Anda inginkan:

  1. Tangan pemain. Jika saya tahu mereka harus memiliki kartu (misalnya, saya pernah melihat mereka mengambilnya), mereka akan terdaftar dalam urutan menaik. Setiap yang tidak diketahui akan terdaftar setelahnya sebagai ?. Sebagai contoh, jika mereka memiliki enam kartu dan saya tahu bahwa dua kartu adalah 1 dan satu adalah kartu 4, representasi tangan yang benar adalah 114???. akan selalu terdaftar setelah kartu dikenal. 141???dan 11???4keduanya input yang tidak valid dan kode Anda tidak perlu menanganinya.
  2. Kartu yang saya tahu pasti bukan bagian dari tangan mereka (saya memilikinya, saya melihat orang lain mengambilnya, dll). Daftar akan berada dalam urutan pangkat naik. Daftarnya mungkin kosong.
  3. Kartu yang diklaim pemain untuk dimainkan. Jika mereka mengaku bermain 3 7's, input yang mungkin di sini adalah 777. Kartu akan selalu memiliki peringkat yang sama.

Jumlah kartu yang dimainkan akan selalu 1-4 dan peringkat akan selalu 0-9. Sebuah peringkat tidak akan pernah muncul lebih dari empat kali di tangan mereka + bukan di tangan mereka.

Ini adalah contoh input yang valid:

33577??
01555688
55

Ini adalah contoh input yang tidak valid:

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

Keluaran

Nilai truthy jika kita harus pasti menantang. Nilai falsey jika kita mungkin tidak ingin menantang.

Kami selalu menantang jika kami tahu mereka curang. Kami tahu mereka curang jika bermain kartu yang tidak mungkin mereka miliki:

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

Kali lain yang kami tantang adalah jika mereka memainkan kartu terakhir mereka. Bahkan jika permainan itu sah itu akan mengakhiri permainan jadi kami mungkin juga menantangnya.

1

1 # They'd win, so challenge anyway

Lebih Banyak Kasus Uji

Truthy (harus menantang)

11445678?

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

9

Falsey (seharusnya tidak menantang)

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

1111

Mencetak gol

Kode terpendek menang.

Hovercouch
sumber
7
Ini omong kosong * t :)
jacksonecac
Berapa banyak orang yang bermain?
jacksonecac
@ jacksonecac Anda hanya melihat satu permainan, jadi Anda tidak perlu khawatir tentang berapa banyak pemain yang ada.
Hovercouch
1
Ini harus menjadi tantangan raja-of-the-hill
Vlo
2
Tidakkah Anda harus menantang dalam kasus falsey kedua?
StephenTG

Jawaban:

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

Menerima tiga string kartu (karakter 0- 9atau ?); kembali 1untuk tantangan, 0jika tidak. Penjelasan:

(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
Neil
sumber
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;

(Catatan: Sejalan dengan contoh OP, jawaban ini kembali salah bahkan jika lawan memiliki lebih dari satu kartu dan memainkan semua tangannya. Dalam hal strategi, ini harus kembali benar.)

Penjelasan:

a: Tangan pemain
b: Kartu yang pasti saya tahu ...
c: Kartu diklaim dapat dimainkan

Tidak Disatukan:

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
Tautan Ng
sumber
Seharusnya tidak a.Length==1menjadi a.Length==c.Length. Anda tampaknya menyiratkan sesuatu seperti itu di catatan Anda, tetapi saya tidak tahu contoh OP yang Anda maksud yang memungkinkan lebih banyak kartu dimainkan daripada jumlah kartu yang dimiliki lawan.
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;}

Penjelasan:

Coba di sini.

(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

CATATAN: (s+0).split("c",-1).length-1memberikan jumlah kali karakter cmuncul dalam String s. Jadi komentar dalam penjelasan di atas benar, tetapi kodenya mungkin tampak berbeda karenanya. Ini (a+0).split(x+"|\\?",-1).length-1<Cgolf ke (a+0).split(x+"|\\?",-1).length<=Cdan 4-(b+0).split(""+x,-1).length-1<Cgolf ke 5-(b+0).split(""+x,-1).length<C.

Kevin Cruijssen
sumber