Uwaga: ModTen to fikcyjna gra karciana, która została stworzona wyłącznie w celu wykonania tego wyzwania.
Zasady ModTen
ModTen jest odtwarzany standardową talią 52 kart. Ponieważ pełne reguły nie zostały jeszcze wynalezione, skupimy się wyłącznie na rankingu rozdań.
Zwycięska ręka w ModTen. Grafika z Wikipedii .
Wartości kart
Karty mają następujące wartości:
- 2 do 9 : warte swojej wartości nominalnej
- Dziesięć : 0 punktów
- Jack : 3 punkty
- Królowa lub król : 8 punktów
- As : 9 punktów
Wartości ręczne
ModTen ręcznie wykonany jest z dwóch kart . Podstawową wartość ręki uzyskuje się poprzez pomnożenie wartości obu kart razem i zachowanie tylko ostatniej cyfry (tj. Zastosowanie modulo 10).
Na przykład wartość 7 ♥ - Q ♣ wynosi „ ”, ponieważ .
Jedyną inną zasadą w ModTen jest to, że karty w kolorze są warte więcej niż karty nieodpowiednie. Zgodnie z konwencją dodamy „s” do wartości, jeśli obie karty są tego samego koloru.
Na przykład wartość 9 ♠ - 5 ♠ będzie oznaczona jako „ ”, ponieważ i karty są w kolorze.
Ranking rozdań i zwycięzca
Powyższe zasady dają 18 odrębnych rang, które zestawiono w poniższej tabeli, od najsilniejszych do najniższych (lub od najrzadszych do najczęstszych). Prawdopodobieństwa podano jedynie w celach informacyjnych.
Biorąc pod uwagę dwie ręce, wygrywa ręka o najniższej pozycji. Jeśli obie ręce mają tę samą rangę, to jest remis (nie ma rozstrzygającego remisu).
hand rank | hand value(s) | deal probability
-----------+---------------+------------------
1 | 9s | 0.30%
2 | 3s | 0.60%
3 | 1s | 0.90%
4 | 7s | 1.21%
5 | 5s | 1.51%
6 | 3 | 1.81%
7 | 9 | 2.26%
8 | 8s | 2.71%
9 | 6s | 3.02%
10 | 1 or 7 | 3.62% each
11 | 2s or 4s | 3.92% each
12 | 5 | 4.98%
13 | 0s | 5.43%
14 | 8 | 8.14%
15 | 6 | 9.95%
16 | 2 | 11.76%
17 | 4 | 13.57%
18 | 0 | 16.74%
Wyzwanie
Biorąc pod uwagę dwie ręce ModTen , wypisz jedną z trzech spójnych wybranych wartości, aby stwierdzić, czy:
- pierwszy gracz wygrywa
- drugi gracz wygrywa
- jest remis
Obowiązują następujące zasady:
- Karta musi być opisany przez jego rangi w górnej części obudowy (
2
,3
, ...,9
,T
,J
,Q
,K
lubA
), a następnie przez jego garnitur w dolnej obudowy (c
,d
,h
lubs
, dla klubów, diamenty, serca i pik). - Możesz użyć
"10"
zamiast,"T"
ale jakakolwiek inna zamiana jest zabroniona. Dopóki powyższe zasady są przestrzegane, możesz wziąć ręce w dowolny rozsądny i jednoznaczny format. Możesz przyjąć rangę i kolor jako dwa odrębne znaki zamiast jednego ciągu.
Niektóre prawidłowe formaty wejściowe to:
"7c Qh 8s Ks"
[["7c","Qh"], ["8s","Ks"]]
[[['7','c'], ['Q','h']], [['8','s'], ['K','s']]]
- itp.
Zamiast używać 3 spójnych odrębnych wartości, wynik może być również ujemny , dodatni lub zerowy . Podaj format wyjściowy użyty w odpowiedzi.
- To jest golf golfowy .
Przypadki testowe
Gracz 1 wygrywa
["Js","3s"], ["Ks","Kh"]
["7h","9h"], ["9s","7c"]
["Ah","5s"], ["Ts","8s"]
["Ts","8s"], ["Jh","2s"]
["4h","8s"], ["Qh","Ks"]
Gracz 2 wygrywa
["Th","8d"], ["6s","Kd"]
["Jc","5c"], ["3s","9s"]
["Jc","Jd"], ["9h","Ah"]
["2d","4d"], ["3h","3s"]
["5c","4c"], ["3c","2c"]
rysować
["Js","3s"], ["3d","Jd"]
["Ah","Ac"], ["3d","9s"]
["Qc","Kc"], ["6d","4d"]
["2d","3d"], ["3s","2s"]
["Ts","9c"], ["4h","5d"]
źródło
{{J, s}, {3, s}}
wszystko w porządku?Odpowiedzi:
Python 3 ,
114110 bajtówWypróbuj online!
@Arnauld zaproponował pomysł połączenia wartości karty i ciągów tabeli rang. Po kilku próbach udało mi się stworzyć scalony ciąg
R="T 2J45UNK9RL<3SLM;QAK:O>=/678"
, który ma taką samą długość jak oryginalny ciąg wartości karty. PodciągR[6:25]="UNK9RL<3SLM;QAK:O>=/"
służy jako tabeli rang, jak również tabeli odnośników do wartości karty3
,9
,A
,K
, iQ
. Dekodowanie wartości ASCII nowej tabeli rang ma taki sam efekt rankingowy jak poprzednia tabela rang.Użycie ciągów bajtów jako danych wejściowych pozwala zaoszczędzić 4 bajty.
Używanie
cmp
w Pythonie 2 może zredukować rozwiązanie do 102 bajtów, jak pokazuje rozwiązanie @ xnor .Python 3 ,
165142130129 bajtówWypróbuj online!
-23 bajty dzięki @Jonathan Allan
-2 bajty dzięki @ovs
-1 bajt dzięki @mypetlion
Nie golfowany:
Funkcja
f
przyjmuje dwa argumenty reprezentujące rękę gracza 1 i gracza 2. Zwraca wartość dodatnią, ujemną lub zerową w przypadku odpowiednio wygranej gracza 1, wygranej gracza 2 lub remisu. Każda ręka jest kodowana jako pojedynczy ciąg, np. „7cQh”.źródło
"HC92FA51GAB4E893D760"[s==t::2]
cmp
nie jest dostępny w Pythonie 3)str.find
zamiaststr.index
zapisać jeden bajt. Jedyna różnica w zachowaniu między tymi dwiema metodami polega na tym, żeindex
zgłasza błąd, gdy element nie zostanie znaleziony, podczas gdyfind
zwraca-1
. Więc to nie będzie problem dla twojego kodu.Montaż x86-16,
8783 bajtyDwójkowy:
Niezmontowane:
Dane wejściowe są takie jak ciąg znaków, np.
Js3sKsKh
Przy wskaźniku wSI
. Wyjście toZF = 0 and SF = OF
(test zJG
), jeśli gracz 1 wygra,SF ≠ OF
(test zJL
), jeśli gracz 2 wygra lubZF
(test zJE
), jeśli remis.Dane wyjściowe za pomocą programu testowego DOS:
Pobierz i przetestuj MODTEN.COM dla DOS.
źródło
05AB1E ,
4137 bajtów-4 bajty dzięki @Grimy .
Wprowadź jako listę listy znaków, podobnie jak trzeci przykładowy format wejściowy w opisie wyzwania. Tj. P1
7c Qh
i P28s Ks
będą wprowadzane jako[[["7","c"],["Q","h"]],[["8","s"],["K","s"]]]
. (I używa"10"
dla10
.)Zwraca ujemną liczbę całkowitą, jeśli gracz 1 wygra; dodatnia liczba całkowita, jeśli gracz 2 wygra; lub 0, jeśli jest to remis.
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Zobacz moją wskazówkę 05AB1E (sekcje Jak korzystać ze słownika? Jak kompresować duże liczby całkowite? I Jak kompresować listy liczb całkowitych? ), Aby zrozumieć, dlaczego
•V›{₆Ÿ&∊WÍj¸•
jest36742512464916394906012008
,•V›{₆Ÿ&∊WÍj¸•19в
jest[18,10,16,6,17,12,15,10,14,7,13,3,11,2,11,5,9,4,8,1]
,‘ߌQ‘
jest"JAKEQ"
iŽćS
jest39808
.źródło
T
jako10
, więc możesz po prostu usunąć wartośćT
zJTQKA
(i użyć skompresowanej liczby całkowitej 3889 zamiast 30889). RównieżT* ... +
może być... «
.10
T
T*...+
...«
PHP ,
212185178149 bajtówWypróbuj online!
Dane wejściowe są przez wiersz poleceń. Wynik
STDOUT
jest ujemny, jeśli gracz 1 wygra, dodatni, jeśli gracz 2 wygra,0
jeśli remis. Przykład:źródło
-1
,1
albo0
.Galaretka , 46 bajtów
Wypróbuj online!
Pełny program bierze na przykład swój argument
["7h","Ks"],["4s","Ts"]
i wypisuje zero, jeśli obaj gracze losują, dodatni, jeśli gracz 1 wygrywa, a ujemny, jeśli gracz 2 wygrywa.źródło
C (gcc) ,
172167165164 bajtówWypróbuj online!
Ogolono 2 bajty dzięki @ceilingcat!
Zasadniczo port rozwiązania Python3 @ Joela, ale bez kodowania base18. Oczekuje, że dane wejściowe są jednym ciągiem ze spacją oddzielającą ręce dwóch graczy i generują liczbę całkowitą, która jest dodatnia, ujemna lub zero, co oznacza, że gracz 1 wygrywa, gracz 2 wygrywa lub jeśli jest to remis.
źródło
Perl 6 ,
1011009488 bajtów-1 bajt dzięki Jo King
Wypróbuj online!
Staje się jako dane wejściowe
f(((<J ♠>, <3 ♠>), (<10 ♠>, <K ♥>)))
z wykorzystaniem10
przez dziesięć. Zwraca wartość <0, jeśli gracz 1 wygra,> 0, jeśli gracz 2 wygra, 0, jeśli to remis.Wyjaśnienie
źródło
Węgiel drzewny , 97 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe jako dwa ciągi 4 znaków, np.
QcKc
6d4d
I wypisuje liczbę całkowitą ze znakiem. Wyjaśnienie:Skompresowany ciąg
2345678903889
reprezentuje wartości kart.Pętlę nad każdą możliwą parą wartości.
Pętla nad każdym możliwym drugim kolorem karty. Bez utraty ogólności możemy założyć, że pierwsza karta ma kolor 3, więc drugi kolor karty może wynosić od 0 do 3, chyba że wartości są takie same, w takim przypadku może ona wynosić tylko od 0 do 2.
Oblicz zmodyfikowany wynik rozdania, który jest wartością podwojonej ręki, plus 1, jeśli kolory są takie same (tj. Druga karta ma kolor 3).
Skompresowany ciąg
23456789TJQKA
reprezentuje znaki karty. Karty wejściowe są wyszukiwane w tym ciągu, a następnie pozycja służy do indeksowania do pierwszego ciągu w celu uzyskania wartości karty.Zainicjuj wynik na 0.
Zapętlić obie ręce.
Oblicz zmodyfikowany wynik rozdania, a tym samym jego częstotliwość, i odejmij od tego wynik.
Wyjmij różnicę częstotliwości.
źródło
C # (interaktywny kompilator Visual C #) , 139 bajtów
Wypróbuj online!
źródło
Perl 5
-p
, 107 bajtówWypróbuj online!
Wkład:
(W rzeczywistości przecinek może być dowolnym znakiem).
Wydajność:
źródło