Hilf mir beim Betrügen

13

Cheat ist ein Kartenspiel, bei dem Sie versuchen, Ihre Hand loszuwerden. Eine Kurve sieht ungefähr so ​​aus:

  1. Bestimmen Sie, welchen Kartenrang Sie in diesem Zug spielen müssen. In den meisten Varianten ist dies ein Rang höher als in der vorherigen Runde.
  2. Spiele 1-4 verdeckte Karten. Diese müssen nicht mit dem gültigen Rang übereinstimmen. Wenn sie es nicht tun, wird es als Betrug betrachtet . Zu diesem Zeitpunkt kann jeder Spieler Sie herausfordern .
    • Wenn Sie niemand herausfordert, wird das Spiel mit dem nächsten Spieler fortgesetzt.
    • Wenn dich jemand herausfordert und du nicht betrogen hast, musst du alle gespielten Karten nehmen.
    • Wenn dich jemand herausfordert und du betrogen hast, musst du alle gespielten Karten nehmen.

Die Strategie ist meistens eine Mischung aus Bluffen und Kartenzählen. Ich bin schlecht in Mathe, also werde ich bei Cheat schummeln und einen Bot mitbringen.

Eingang

Die Eingabe erfolgt in einer beliebigen Reihenfolge oder in einem beliebigen Format:

  1. Die Hand des Spielers. Wenn ich weiß, dass sie Karten haben müssen (ich habe zum Beispiel gesehen, dass sie sie aufgehoben haben), werden diese in aufsteigender Reihenfolge aufgelistet. Unbekannte werden anschließend als aufgelistet ?. Wenn sie zum Beispiel sechs Karten haben und ich weiß, dass zwei 1 und eine 4 sind, ist eine gültige Darstellung der Hand 114???. werden immer nach bekannten Karten aufgelistet. 141???und 11???4sind beide ungültige Eingaben und Ihr Code muss diese nicht verarbeiten.
  2. Die Karten, die ich definitiv kenne, sind nicht Teil ihrer Hand (ich habe sie, ich habe jemanden gesehen, der sie aufhebt usw.). Die Liste wird in aufsteigender Reihenfolge des Ranges angezeigt. Die Liste ist möglicherweise leer.
  3. Die Karten, die der Spieler ausgespielt hat. Wenn sie behaupteten, 3 7's zu spielen, wäre ein möglicher Input hier 777. Die Karten haben immer den gleichen Rang.

Die Anzahl der gespielten Karten ist immer 1-4 und die Ränge sind immer 0-9. Ein Rang wird niemals mehr als vier Mal in ihrer Hand + nicht in ihrer Hand erscheinen.

Dies ist ein Beispiel für eine gültige Eingabe:

33577??
01555688
55

Dies ist ein Beispiel für eine ungültige Eingabe:

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

Ausgabe

Ein wahrer Wert, wenn wir definitiv herausfordern sollten. Ein falscher Wert, wenn wir nicht herausfordern wollen.

Wir fordern immer heraus, wenn wir wissen, dass sie betrogen haben. Wir wissen, dass sie betrogen haben, wenn sie Karten gespielt haben, die sie unmöglich haben könnten:

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

Das andere Mal stellen wir uns der Frage, ob sie ihre letzten Karten spielen. Selbst wenn das Spiel echt wäre, würde es das Spiel beenden, also könnten wir es genauso gut herausfordern.

1

1 # They'd win, so challenge anyway

Weitere Testfälle

Wahrheit (sollte herausfordern)

11445678?

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

9

Falsey (sollte nicht herausfordern)

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

1111

Wertung

Kürzester Code gewinnt.

Hovercouch
quelle
7
Dies ist Bullsh * t :)
Jacksonecac
Wie viele Leute spielen?
Jacksonecac
@jacksonecac du siehst dir nur ein Spiel an, also musst du dir keine Sorgen machen, wie viele Spieler es gibt.
Hovercouch
1
Dies sollte eine
echte Herausforderung sein
2
Sollten Sie im zweiten Fall nicht eine Herausforderung sein?
StephenTG

Antworten:

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

Akzeptiert drei Kartenreihen (Zeichen 0- 9oder ?); kehrt sonst 1zur Herausforderung zurück 0. Erläuterung:

(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
quelle
1

C # 6, 134 Bytes

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;

(Hinweis: In Übereinstimmung mit dem Beispiel von OP gibt diese Antwort falsch zurück, auch wenn der Gegner mehr als eine Karte hat und seine gesamte Hand spielt. In Bezug auf die Strategie sollte dies wahr sein.)

Erläuterung:

a: Hand des Spielers
b: Karten, die ich definitiv kenne ...
c: Karten, die angeblich gespielt werden

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
Link Ng
quelle
Sollte nicht a.Length==1sein a.Length==c.Length. Sie scheinen so etwas in Ihrem Zettel zu implizieren, aber ich weiß nicht, auf welches OP-Beispiel Sie sich beziehen, dass möglicherweise mehr Karten gespielt werden, als der Gegner auf der Hand hat.
Kevin Cruijssen
1

Java 8, 169 135 Bytes

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

Erläuterung:

Probieren Sie es hier aus.

(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

HINWEIS: (s+0).split("c",-1).length-1Gibt an, wie oft das Zeichen cin String vorkommt s. Die Kommentare in der obigen Erklärung sind also korrekt, aber der Code scheint deshalb möglicherweise anders zu sein. Das (a+0).split(x+"|\\?",-1).length-1<Cist zu golfen (a+0).split(x+"|\\?",-1).length<=Cund das 4-(b+0).split(""+x,-1).length-1<Cist zu golfen 5-(b+0).split(""+x,-1).length<C.

Kevin Cruijssen
quelle