Cheat'te aldatmama yardım et


13

Cheat, elinden kurtulmaya çalıştığın bir kart oyunudur. Bir dönüş kabaca şöyle görünür:

  1. Bu turda hangi kart sırasını oynamanız gerektiğini belirleyin. Çoğu varyantta bu, önceki dönüşten bir derece daha yüksektir.
  2. 1-4 kart, kapalı olarak oynayın. Bunların geçerli sıralamayla eşleşmesi gerekmez. Eğer yapmazlarsa, bir hile olarak kabul edilir . Bu noktada herhangi bir oyuncu size meydan okuyabilir .
    • Kimse size meydan okumazsa, oyun bir sonraki oyuncuya devam eder.
    • Birisi size meydan okursa ve hile yapmazsanız, oynanan tüm kartları almaları gerekir.
    • Birisi size meydan okursa ve hile yaptıysanız, oynanan tüm kartları almanız gerekir.

Strateji çoğunlukla blöf ve kart sayımının bir karışımıdır. Yine de matematikte kötüyüm, bu yüzden Cheat'ta hile yapacağım ve yanımda bir bot getireceğim.

Giriş

Giriş istediğiniz sırayla veya biçimde olacaktır:

  1. Oyuncunun eli. Kartlarının olması gerektiğini biliyorsam (örneğin, onları aldıklarını gördüm), bunlar artan sırada listelenir. Bilinmeyenler daha sonra olarak listelenecektir ?. Örneğin, altı kartları varsa ve ikisinin 1 ve birinin 4 olduğunu biliyorum, elin geçerli bir temsilidir 114???. ? 'ler her zaman bilinen kartlardan sonra listelenir. 141???ve 11???4her ikisi de geçersiz girişlerdir ve kodunuzun bunları işlemesi gerekmez.
  2. Kesinlikle bildiğim kartlar ellerinin bir parçası değil (Onları aldım, başkasının onları aldığını gördüm, vb.). Liste artan sırada olacak. Liste boş olabilir.
  3. Oyuncunun oynadığı iddia edilen kartlar. 3 7'leri oynadıklarını iddia etselerdi, burada olası bir girdi olurdu 777. Kartlar her zaman aynı sıralamada olacaktır.

Oynanan kartların sayısı her zaman 1-4 ve dereceleri her zaman 0-9 olacaktır. Bir rütbe asla ellerinde dört kezden fazla görünmez + ellerinde görünmez.

Bu, geçerli bir giriş örneğidir:

33577??
01555688
55

Bu, geçersiz bir örnek girişidir:

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

Çıktı

Kesinlikle meydan okumalıysak gerçek bir değer . Eğer meydan okumak istemezsek bir falsey değeri.

Aldattığını bildiğimizde her zaman meydan okuyoruz. Muhtemelen sahip olamayacakları kartları oynadıkları takdirde hile yaptıklarını biliyoruz:

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

Karşılaştığımız diğer zaman ise son kartlarını oynaması. Oyunun yasal olmasına rağmen oyunu bitirir, böylece meydan okuyabiliriz.

1

1 # They'd win, so challenge anyway

Diğer Test Durumları

Gerçek (meydan okumalı )

11445678?

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

9

Falsey (meydan okumamalı )

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

1111

puanlama

En kısa kod kazanır.


7
Bu saçmalık * t :)
jacksonecac

Kaç kişi oynuyor?
jacksonecac

@jacksonecac sadece bir oyuna bakıyorsunuz, bu yüzden kaç oyuncu olduğu konusunda endişelenmenize gerek yok.
Hovercouch

1
Bu tepenin kralı bir
meydan okuma olmalı

2
İkinci falsey davasında zorlu olmamalı mıydın?
StephenTG

Yanıtlar:



1

JavaScript (ES6), 93 bayt

(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

Üç kart dizisini kabul eder (karakterler 0- 9veya ?); aksi takdirde 1meydan okumaya geri döner 0. Açıklama:

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

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;

(Not: OP'nin örneğine uygun olarak, rakibin birden fazla kartı olsa ve tüm elini oynuyor olsa bile bu cevap yanlış döndürür. Strateji açısından bunun doğru olması gerekir.)

Açıklama:

a: Oyuncu eli
b: Kesinlikle bildiğim
ckartlar ... : Oynadığı iddia edilen kartlar

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

Olmamalı a.Length==1olmak a.Length==c.Length. Notunuzda buna benzer bir şey ima ediyorsunuz, ancak hangi OP'nin örneğine atıfta bulunduğunuzu bilmiyorum, bu da rakibin elinde bulunan kart miktarından daha fazla kart oynanmasını mümkün kılıyor.
Kevin Cruijssen

1

Java 8, 169135 bayt

(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çıklama:

Burada deneyin.

(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

NOT: Dize'de (s+0).split("c",-1).length-1karakterin ckaç kez gerçekleştiğini verir s. Bu yüzden yukarıdaki açıklamadaki yorumlar doğrudur, ancak kod nedeniyle farklı görünebilir. (a+0).split(x+"|\\?",-1).length-1<Cİçin golfed edilir (a+0).split(x+"|\\?",-1).length<=Cve 4-(b+0).split(""+x,-1).length-1<Chiç golfed edilir 5-(b+0).split(""+x,-1).length<C.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.