Pomóż mi oszukiwać w Cheat

13

Cheat to gra karciana, w której próbujesz pozbyć się ręki. Zakręt wygląda mniej więcej tak:

  1. Określ, jaką rangę karty musisz zagrać w tej turze. W większości wariantów jest to o jeden stopień wyższy niż w poprzedniej turze.
  2. Zagraj 1-4 karty, zakryte. Nie muszą one pasować do prawidłowej rangi. Jeśli nie, uważa się to za oszustwo . W tym momencie każdy gracz może cię wyzwać .
    • Jeśli nikt nie rzuca ci wyzwania, gra przechodzi do następnego gracza.
    • Jeśli ktoś rzuca ci wyzwanie, a ty nie zdradzasz, musi wziąć wszystkie zagrane karty.
    • Jeśli ktoś rzuca ci wyzwanie, a ty oszukałeś, musisz wziąć wszystkie zagrane karty.

Strategia składa się głównie z blefowania i liczenia kart. Jestem zła z matematyki, więc zamierzam oszukiwać w Cheat i zabrać ze sobą bota.

Wejście

Dane wejściowe będą w dowolnej kolejności lub formacie:

  1. Ręka gracza. Jeśli wiem, że muszą mieć karty (na przykład widziałem, jak je podnoszą), zostaną one wymienione w kolejności rosnącej. Wszelkie niewiadome zostaną później wymienione jako ?. Na przykład, jeśli mają sześć kart i wiem, że dwie to 1, a jedna to 4, poprawna reprezentacja ręki to 114???. ? będą zawsze wyświetlane po znanych kartach. 141???i 11???4oba są nieprawidłowymi danymi wejściowymi, a Twój kod nie musi ich obsługiwać.
  2. Karty, które zdecydowanie znam, nie są częścią ich ręki (mam je, widziałem, jak ktoś inny je odbiera itp.). Lista będzie w porządku rosnącym. Lista może być pusta.
  3. Karty, które gracz rzekomo grał. Gdyby twierdzili, że zagrali 3 7, możliwy byłby tu wkład 777. Karty zawsze będą miały tę samą rangę.

Liczba zagranych kart będzie zawsze wynosić 1-4, a rangi zawsze będą wynosić 0-9. Ranga nigdy nie pojawi się więcej niż cztery razy w ręce + nie w ręce.

To jest przykładowe prawidłowe wejście:

33577??
01555688
55

To jest przykładowe nieprawidłowe wejście:

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

Wynik

Prawdziwa wartość, jeśli zdecydowanie powinniśmy rzucić wyzwanie. Wartość falsey, jeśli nie chcemy kwestionować.

Zawsze rzucamy wyzwanie, jeśli wiemy, że oszukiwali. Wiemy, że oszukiwali, jeśli grali w karty, których nie mogliby mieć:

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

Drugi raz rzucamy wyzwanie, jeśli zagrają ostatnią kartę. Nawet jeśli gra jest legalna, kończy grę, więc równie dobrze możemy się z nią zmierzyć.

1

1 # They'd win, so challenge anyway

Więcej przypadków testowych

Prawda (powinna rzucić wyzwanie)

11445678?

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

9

Falsey (nie powinien rzucać wyzwania)

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

1111

Punktacja

Najkrótszy kod wygrywa.

Hovercouch
źródło
7
To bzdura * t :)
jacksonecac
Ile osób gra?
jacksonecac
@jacksonecac patrzysz tylko na jedną grę, więc nie musisz się martwić, ilu jest graczy.
Hovercouch
1
To powinno być wyzwanie dla króla wzgórza
Vlo,
2
Czy nie powinieneś być wyzwaniem w drugiej sprawie Falsey?
StephenTG

Odpowiedzi:

1

JavaScript (ES6), 93 bajty

(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

Akceptuje trzy ciągi kart (postaci 0- 9lub ?); wraca 1po wyzwanie, w 0przeciwnym razie. Wyjaśnienie:

(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
źródło
1

C # 6, 134 bajty

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;

(Uwaga: Zgodnie z przykładem OP, ta odpowiedź zwraca wartość false, nawet jeśli przeciwnik ma więcej niż jedną kartę i gra całą swoją ręką. Pod względem strategii powinno to być prawdziwe.)

Wyjaśnienie:

a: Ręka gracza
b: Karty Zdecydowanie wiem ...
c: Karty, które rzekomo zostały zagrane

Nie golfowany:

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 nr
źródło
Nie powinno a.Length==1być a.Length==c.Length. Wydaje się, że sugerujesz coś takiego w swojej notatce, ale nie wiem, do jakiego przykładu OP, o którym mówisz, pozwala na to, że zagrywa się więcej kart, niż liczba kart, które przeciwnik ma na ręce.
Kevin Cruijssen
1

Java 8, 169 135 bajtów

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

Wyjaśnienie:

Wypróbuj tutaj.

(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

UWAGA: (s+0).split("c",-1).length-1podaje liczbę wystąpień znaku cw ciągu znaków s. Tak więc komentarze w powyższym wyjaśnieniu są poprawne, ale kod może wydawać się inny z tego powodu. (a+0).split(x+"|\\?",-1).length-1<CJest golfed się (a+0).split(x+"|\\?",-1).length<=Ci 4-(b+0).split(""+x,-1).length-1<Cjest golfed do 5-(b+0).split(""+x,-1).length<C.

Kevin Cruijssen
źródło