Wyzwanie:
W tym pytaniu: Wymień rękę pokera, którą musiałeś wziąć z pięciokartowym układem pokera i określ ją. To pytanie jest podobne, z dwoma zwrotami akcji:
Po pierwsze, wynik będzie zapisany małymi literami. Pozwala to na więcej golfa, ponieważ nie musisz się martwić o wielkie litery flush
istraight
high card
one pair
two pair
three of a kind
straight
flush
full house
four of a kind
straight flush
royal flush
Po drugie, mając popularność Texas Hold'em i 7-kartowego studa, my tutaj, w golfie code, powinniśmy być w stanie zdobyć siedmiokartowego pokera, prawda? Przy zdobywaniu siedmiokartowego układu, użyj pięciu najlepszych kart dla swojego układu i zignoruj dwa, których nie potrzebujesz.
Odniesienie:
Lista rąk pokera: http://en.wikipedia.org/wiki/List_of_poker_hands
Wejście (podnoszone bezpośrednio z poprzedniego wątku)
7 kart z argumentów standardowego lub wiersza poleceń. Karta to dwuliterowy ciąg znaków w formularzu RS
, w którym R oznacza rangę, a S jest koloru. W szeregi są 2
- 9
(karty), numer T
(dziesięć), J
(Jack), Q
(Queen), K
(King), A
(ACE). Te stroje są S
, D
, H
, C
dla pik, karo, kier i klubów odpowiednio.
Przykład kart
5H - five of hearts
TS - ten of spades
AD - ace of diamonds
Przykład wejścia => pożądany wynik
3H 5D JS 3C 7C AH QS => one pair
JH 4C 2C 9S 4H JD 2H => two pair
7H 3S 7S 7D AC QH 7C => four of a kind
8C 3H 8S 8H 3S 2C 5D => full house
AS KC KD KH QH TS JC => straight
Zauważ, że w drugim przykładzie są właściwie trzy pary, ale możesz użyć tylko pięciu kart, więc tak jest two pair
. W piątym przykładzie są zarówno a, jak three of a kind
i straight
możliwe, ale a straight
jest lepsze, więc wynik straight
.
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy kod!
Errata
- Nie możesz używać zasobów zewnętrznych.
- As jest zarówno wysoki, jak i niski dla stritów.
Odpowiedzi:
Rubinowy 353
Było to oparte na odpowiedzi Chrona z pierwotnego pytania.
Pobiera to dane wejściowe jako argumenty wiersza poleceń. Zasadniczo po prostu iterujemy wszystkie kombinacje rozmiaru 5, aby dowiedzieć się, jaki to rodzaj ręki. Każdy typ rozdania został zmodyfikowany, więc zaczyna się od liczby. („poker królewski” -> „0royal 4flush”, „high card” -> „9high card”). To pozwala nam sortować zwrócone ciągi. Pierwszy ciąg po sortowaniu jest najlepszą możliwą ręką. Więc drukujemy to po usunięciu wszystkich liczb z ciągu.
źródło
AS QS JS TS 9S 5H 5D
. To będzie kosztować cię postać!Haskell
618 603 598 525 512 504 480464Karty pobierane jako wiersz danych wejściowych. Wydaje mi się, że grałem w golfa na śmierć, ale z łatwością mogę zostać pokonany przez ruby itp. Przy użyciu tej samej sztuczki: jeśli wygenerujesz wszystkie permutacje, otrzymasz typy do przodu, których chcesz szukać prostych, a także odwrotne typy do testowania N z rodzaju.
Edytowany w celu wstawienia „parowania” i używania prefiksów liczb po obejrzeniu wpisu @ FDinoffa, również skomponował funkcje mapy, aby ogolić jeszcze jeden znak.
źródło
"one pair","two pair"
jest wtedy krótszyu=" pair" ... "one"++u,"two++u
C ++,
622553 znakówcztery niepotrzebne nowe linie dodane poniżej dla przejrzystości.
Rzeczy zmieniły się w wersji golfowej:
Rev 1: Zmieniono wszystkie zmienne numeryczne na
__int64
dla pojedynczej deklaracji.Rev 1: Przyrost golfa i stan
for
pętliRev 0: Zmieniono stałe ósemkowe na dziesiętne.
Rev 0: Zmieniono
if
instrukcje na przypisania z operatorem warunkowym. Rev 1: Przeorganizowano dalej w jedno wyrażenie dlat
. Wymagało to nowej zmiennejv
dla jednej z wartości pośrednichRev 0: Usunięto pełne dane wyjściowe. Wysyła tylko najlepszą ogólną rękę.
Rev 0: Zrezygnowałem z kompresji tekstu wyjściowego (trudne w C, ponieważ nie można łączyć łańcuchów za pomocą operatora +). Pisanie „flush” tylko raz zaoszczędziło mi 12 znaków, ale kosztowało mnie 15, co pogorszyło mnie o 3 znaki. Więc napisałem to 3 razy zamiast tego.Rev 1: używanystd::string
zamiastchar[]
sugerowanego przez FDinoffa, umożliwiający konkatenację+
.Wersja bez golfa, 714 niekomentowanych znaków spoza białej przestrzeni.
Pętle przechodzą przez wszystkie 21 możliwych rąk, które można wykonać z 7 kart i za każdym razem odrzucają 2 karty. Kolor i ranga pięciu wybranych kart są sumowane w zmiennych f i p z inną cyfrą ósemkową dla każdego koloru / rangi. Wykonuje się różne operacje bitowe w celu określenia rodzaju ręki, która jest następnie zapisywana w t (wszystkie 21 możliwości są wyprowadzane w wersji bez golfa.) Na koniec wyprowadzana jest najlepsza możliwa ręka.
Wyjście bez golfa
źródło
<string>
który obsługuje + do łączenia łańcuchów. Co oznacza, że prawdopodobnie będziesz mógł użyć<iostream>
i użyć.cout
Jednak nie wiem, czy któryś z nich doprowadziłby do zmniejszenia liczby znaków." pair flush flush straight of a kind"
= 35 znaków. Po dodaniu#include
oszczędności są minimalne, należy wziąć pod uwagę dodatkowe",=+
i deklaracje stałych. Również jestem nowy w C ++ i walczę z ustawieniami IDE i kompilatora (zmusza mnie to do używania,scanf_s
aprintf_s
zamiast starych „niebezpiecznych” wersji i pomocy w naprawianiu się w kółko.)cout
Może trochę pomóc, to zależy ode mnie zrobić listę, ale prawdopodobnie dla innego programu. Rzeczą, któracout
mnie zabija , jestusing namespace std
to, że nie wiem, czy istnieje sposób, aby uniknąć napisania tego wszystkiego.std::cout
aby ominąćusing namespace std
gets_s
iputs
plusstd::string
do konkatenacji, co oznacza, że muszę przekonwertowaćchar*
na wyjście. Golf I pisał prace z tylkostring
lub po prostuiostream.
Bizarrely muszę to zarówno w obsłudze<<>>
podmiotów zcin/cout
&std::string
s. Ogólnie rzecz biorąc, użycie obu#include
s daje 5 bajtów gorszych, mimo że mogę zadeklarowaćh
jako astd::string
i uniknąć osobnejchar
deklaracji. Jak można się spodziewać, nie mogę znaleźć listynamespace std
pomocy (lub wyjaśnienia na temat operatora).scanf
igets
, z wyjątkiem golfa, gdzie programy są dość niebezpieczne. Mógłbym skrócić o 5 bajtów,-s,99
gdybym mógł użyćgets
zamiastgets_s
, ale nie mogę zmusić kompilatora, aby mi pozwolił. Zaskakuje mnie, jak ogólnie niebezpieczne jest C / C ++! Kilka tygodni temu zszokowałoby mnie stwierdzenie, że_int64 x=1<<y
daje to złą odpowiedź na więcej niż 31 lat. Ale teraz jestem lekko zirytowany. Widząc rzeczy, w których indeksy tablic wykraczają poza granice bez komunikatu o błędzie, przywykłem do tego. Czy jest jakiś sposób na lepsze włączenie sprawdzania?perl (> = 5,14),
411403400397400Edycja : wstawił sub, który został wywołany tylko raz, oszczędzając 8 znaków.
Edycja 2 : usunęłam
.""
resztkę z wczesnej próbyEdycja 3 : zamiast zmiennej tymczasowej, która zachowuje oryginał
$_
, użyj jednej, aby uczynić go niepotrzebnym. Zysk netto 3 znaki.Edycja 4 : naprawiono błąd w wykrywaniu przepełnienia full house'a (2x 3 w swoim rodzaju). kosztuje 3 znaki.
Nie całkiem zwycięzca, ale myślę, że prosty detektor jest interesującą koncepcją.
Wersja rozszerzona:
źródło
JavaScript 600
użycie z nodeJS:
node code.js "7H 3S 7S 7D AC QH 7C"
źródło