Cheat to gra karciana, w której próbujesz pozbyć się ręki. Zakręt wygląda mniej więcej tak:
- 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.
- 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:
- 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 to114???
. ? będą zawsze wyświetlane po znanych kartach.141???
i11???4
oba są nieprawidłowymi danymi wejściowymi, a Twój kod nie musi ich obsługiwać. - 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.
- 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.
źródło
Odpowiedzi:
Pyth, 22 bajty
Wypróbuj online.
źródło
JavaScript (ES6), 93 bajty
Akceptuje trzy ciągi kart (postaci
0
-9
lub?
); wraca1
po wyzwanie, w0
przeciwnym razie. Wyjaśnienie:źródło
C # 6, 134 bajty
(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 graczab
: Karty Zdecydowanie wiem ...c
: Karty, które rzekomo zostały zagraneNie golfowany:
źródło
a.Length==1
być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.Java 8,
169135 bajtówWyjaśnienie:
Wypróbuj tutaj.
UWAGA:
(s+0).split("c",-1).length-1
podaje liczbę wystąpień znakuc
w ciągu znakóws
. 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<C
Jest golfed się(a+0).split(x+"|\\?",-1).length<=C
i4-(b+0).split(""+x,-1).length-1<C
jest golfed do5-(b+0).split(""+x,-1).length<C
.źródło