Nazwij rękę Brag


11

tło

Brag to gra karciana podobna do koncepcji, ale prostsza niż poker. Ręka w chwale składa się z trzech kart i ma następującą wartość od najwyższej do najniższej:

  • Trójka - wszystkie trzy karty mają tę samą rangę. Nazwany „trzema królami” itp.

  • Uruchamianie koloru, czyli proste kolor. Wszystkie trzy karty tego samego koloru i kolejnych stopni. Ręka jest nazywana trzema kartami w kolejności rosnącej, po której następują słowa „na odbiciu”, aby odróżnić od prostego biegu / strita, np. „Ten-jack-queen na odbiciu”. Zauważ, że as jest albo wysoki, albo niski, ale nie oba - „król-as-dwa” nie jest biegiem.

  • Biegnij aka prosto. Jak wyżej, ale bez wymogu dopasowania kolorów. Nazwany po prostu jako np. „Ten-jack-queen”.

  • Kolor - wszystkie trzy karty tego samego koloru, nazwane na cześć najwyższej rangi, np. „Kolor asa”.

  • Para - dwie karty tej samej wartości wraz z jedną trzecią innej wersji wersji. Nazwany jako „para trójek” itp.

  • Każda inna kombinacja, nazwana na cześć najwyższej rangi, np. „Wysoka asa”.

Wyzwanie

Biorąc pod uwagę trzy karty do gry, wypisz nazwę chwalonej przez siebie ręki.

Karty będą wprowadzane albo jako trzy 2-znakowe ciągi, albo połączone jako pojedynczy 6-znakowy ciąg (w zależności od tego, co preferuje twoja implementacja), gdzie pierwszą z każdej pary jest ranga (2 ... 9, T, J, Q, K, A), a drugi oznacza kolor (H, C, D, S).

Obowiązują standardowe zasady gry w golfa - napisz program lub funkcję, która akceptuje te dane wejściowe i wyświetla nazwę rozdania, jak opisano powyżej.

Możesz założyć, że dane wejściowe będą prawidłowe (rangi i kolory w powyższym zakresie, brak powtarzanej karty) i w każdym innym przypadku, ale nie w określonej kolejności.

Dane wyjściowe muszą być pisane wielkimi i małymi literami lub rozsądnie dużymi literami, np. Tytuły lub zdania. Rangi numeryczne należy przeliterować, np. „Dziesiątki”, a nie 10.

Przykładowe wejścia i wyjścia:

2H3C2D => "pair of twos"

TD8C9C => "eight-nine-ten"

4SKS9S => "king flush"

4D4H4S => "three fours"

5H3H2C => "five high"

2D3DAD => "ace-two-three on the bounce"

6D6C6H => "three sixes"

To moja pierwsza próba wyzwania na tej stronie, proszę sugerować ulepszenia, ale bądź łagodny :)



4
Witamy w PPCG! Do tej pory omijałem to wyzwanie, ale wygląda na przyzwoite jak na pierwsze wyzwanie. To powiedziawszy, pisanie dobrych wyzwań jest trudne i na przyszłość polecam najpierw umieszczać pomysły w piaskownicy, w których można uzyskać opinie i poprawić szczegóły specyfikacji, zanim zaryzykuje się przegłosowanie, zamknięcie głosów i odpowiedzi, które mogą zostać unieważnione przez późniejsze zmiany w wyzwanie.
Martin Ender

@MartinEnder dzięki! Z pewnością następnym razem spojrzę na piaskownicę.
IanF1

Czy możemy uzyskać dane wejściowe jako tablice krotek? Czy możemy również skrócić wyjście, takie jak „king flush”, do „fk”?
Matthew Roh,

1
proszę dodać "6D6C6S"jako przypadek testowy, ponieważ sześć to nieparzysta liczba mnoga
nie że Karol

Odpowiedzi:


2

Ruby, 384 , 320

Akceptuje tablicę ciągów dwóch znaków.

Przekłada wartości pip na wartości szesnastkowe i identyfikuje wskazówki na podstawie liczby różnych wartości pip.

->*d{u=d.map{|x|*u=x[1]}==u*3
g=d.map{|x|(x[0].tr'TJQKA','ABCDE').hex}.sort
g=1,2,3if[2,3,14]==g
_,l,h=a=g.map{|x|%w{king queen jack ten nine eight seven six five four three two ace}[-x%13]}
[*g[0]..2+g[0]]==g ?a*?-+(u ?' on the bounce':''):u ?h+' flush':[h+' high','pair of '+l+=l[?x]?'es':?s,'three '+l][-g.uniq.size]}

Adnotacja:

->*d{
    # u is "Is this a flush?"" (see if you have more than one suit)
    u=d.map{|x|u=x[1]}==[u]*3

    # g is the sorted card values in integer (convert to base 16)
    g=d.map{|x|x[0].tr('TJQKA','ABCDE').hex}.sort

    # use Ace == 1 if we have a low straight
    g=[1,2,3]if[2,3,14]==g

    # a is the names of all the cards
    a=g.map{|x|%w{ace two three four five six seven eight nine ten jack queen king ace}[x-1]}

    # l is for "plural" - just choose the middle card because we
    #                     only care about plurals for 2s or 3s
    l=a[1].sub(?x,'xe')+?s

    # if [g[0],g[0]+1,g[0]+2] == g, we have a run
    # possibly "on the bounce"
    ([*g[0]..g[0]+2]==g) ? (a * ?-) + (u ? ' on the bounce' : '') :

    # if we have a flush, we can't have three-of-a-kind, so try that first
    u ? a[2]+' flush' :

    # otherwise, dedupe your hand. if there's: 
    # 3 values, x high; 2 values, pair; 1 value, three
    [a[2]+' high','pair of '+l,'three '+l][-g.uniq.size]
}

3

Python 2 , 788, 715, 559, 556, 554, 546, 568, 522 bajtów

* teraz mija „szóstki” * dzięki Benowi Frankelowi za uratowanie 46 bajtów!


import re
d,m,n=dict(zip('JQKA',range(10,15))),'pair of %ss','%s-%s-%s'
C=lambda s:int(d.get(s[0],s[0]))
z,x,c=sorted(re.findall('..',raw_input()),key=C)
q,w,e=C(z),C(x),C(c)
A=[0,0,'two','three','four','five','six','seven','eight','nine','ten','jack','queen','king','ace']
I,O,U=A[e],A[w],A[q]
a,k='%s high'%I,e-w+q
if k==13:a=n%(I,U,O)
if k==w:a=n%(U,O,I)
if q==w or e==w or e==q:a=m%O
if k==e==w:a='three %ss'%I
if'x'in a:a=a[:-1]+'es'
if z[-1]==x[-1]==c[-1]:
 if'-'in a:a+=' on the bounce'
 else:a='%s flush'%I
print a

Wypróbuj online!

Dzięki za fajne pierwsze wyzwanie!


1
Kilka białych golfowych sugestii: TIO
matematyki

Dzięki! Wiedziałem, że biała przestrzeń dodaje dużo bajtów, ale pomyślałem, że wymaga 4 spacji. Edytowane! @math_junkie
Stephen

@ user7686415 Lub możesz zamiast tego użyć rzeczywistych kart.
mbomb007

1
@NotthatCharles naprawił to!
Stephen

1
@Stephen, jasne. D.get(a, b)oznacza dostęp do wartości w dykcie D pod klawiszem a, z wartością domyślną b, jeśli klucz nie zostanie znaleziony. To jest to samo co pisanie D[a] if a in D else b, co jest takie samo jak pisanie D[a] if a in D.keys() else b.
Ben Frankel,

2

PHP, 413 405 398 409 408 406 398 bajtów

Niestety PHP nie obsługuje odwoływania się do zagnieżdżonych tablic wewnątrz ciągów;
zaoszczędziłoby to kolejne 6 5 bajtów.

for(;$a=$argn[$i++];)$i&1?$v[strpos(_3456789TJQKA,$a)]++:$c[$a]++;$k=array_keys($v);sort($k);$n=[two,three,four,five,six,seven,eight,nine,ten,jack,queen,king,ace];echo($m=max($v))<2?($k[!$d=count($c)]+2-($h=$k[2])?$k[1]>1|$h<12?"$n[$h] ".[flush,high][$d++/2]:"ace-two-three":$n[$k[0]]."-".$n[$k[1]]."-$n[$h]").[" on the bounce"][$d^1]:($m<3?"pair of ":"three ").$n[$v=array_flip($v)[$m]].e[$v^4].s;

Uruchom go echo <hand> | php -nR '<code>lub przetestuj online .

awaria

for(;$a=$argn[$i++];)$i&1?      # loop through input
    $v[strpos(_3456789TJQKA,$a)]++  # count values on even positions [0,2,4]
    :$c[$a]++;                      # count colors on odd positions [1,3,5]
$k=array_keys($v);sort($k);     # $k=ascending values
$n=[two,three,four,five,six,seven,eight,nine,ten,jack,queen,king,ace];
echo($m=max($v))<2              # three different values:
?($k[!$d=count($c)]+2-($h=$k[2])    # test normal straight ($d=color count, $h=high card)
    ?$k[1]>1|$h<12                      # test special straight
        ?"$n[$h] ".[flush,high][$d++/2]     # flush if one color, high card if not
                                            #   ($d++ to avoid " on the bounce")
        :"ace-two-three"                    # special straight
    :$n[$k[0]]."-".$n[$k[1]]."-$n[$h]"  # normal straight
).[" on the bounce"][$d^1]          # if straight: straight flush if one color
:($m<3?"pair of ":"three ")     # pair or triplet
    .$n[$v=array_flip($v)[$m]]      # card name
    .e[$v^4].s                      # plural suffix
;

Wymaga PHP> = 5.6 (dla e[...])


1
to może zawieść „szóstki”
Nie to, że Karol

1
@NotthatCharles: Kosztowało mnie to 11 bajtów ... ale grałem z nimi w golfa. :)
Titus

1

Python 2 - 583 bajtów

Jestem zbyt nowy, aby móc komentować posty, więc po prostu publikuję moją wersję rozwiązania w języku Python.

Naprawiono problem z „es” dla pary i trzech z szóstek. Dzięki nie temu Charlesowi

d={'A':['ace',14],'2':['two',2],'3':['three',3],'4':['four',4],'5':['five',5],'6':['six',6],'7':['seven',7],'8':['eight',8],'9':['nine',9],'T':['ten',10],'J':['jack',11],'Q':['queen',12],'K':['king',13]}
r=input()
j=1
i=lambda x:d[x][j]
v=sorted(r[::2],key=i)
z,y,x=v
s=r[1::2]
e='es'if i(y)==6else's'
j=0
a=i(x)
if z==y or y==x:r="pair of %s"%i(y)+e
if s[0]*3==s:r="%s flush"%a
t="%s-%s"%(i(z),i(y))
j=1
u=" on the bounce"if r[-1]=='h'else ""
if i(z)+i(x)==2*i(y):r=t+"-%s"%a+u
if ''.join(v)=="23A":r="%s-"%a+t+u
if [z]*3==v:r="three %s"%d[z][0]+e
if len(r)==6:r="%s high"%a
print r

Trochę bardziej czytelny z kilkoma komentarzami

# first of all we don't need to keep suits
d={'A':['ace',14],'2':['two',2],'3':['three',3],'4':['four',4],'5':['five',5],'6':['six',6],'7':['seven',7],'8':['eight',8],'9':['nine',9],'T':['ten',10],'J':['jack',11],'Q':['queen',12],'K':['king',13]}
r=input()                           # input placed in r, to safely check r[-1] later in code
j=1                                 # j toggles reading from dictionary: 0-string, 1-value
i=lambda x:d[x][j]                  # lambda used to access dictionary
v=sorted(r[::2],key=i)              # take values from input and sort
z,y,x=v                             # variables to compact code
s=r[1::2]                           # take suits from input
e='es'if i(y)==6else's'             # choose ending 'es' for six and 's' for others (for pair and three)
j=0                                 # toggle reading from dictionary to string
a=i(x)                              # get string of top most value
if z==y or y==x:                    # check only two pairs as values are sorted
    r="pair of %s"%i(y)+e
if s[0]*3==s:                       # compact check if all string characters are equal to detect flush
    r="%s flush"%a
t="%s-%s"%(i(z),i(y))               # part of straight output - first two values
j=1                                 # toggle reading from dictionary to values
u=" on the bounce"\                 # addon to output in case of possible straight flush
if r[-1]=='h'else ""                # detected by checking last character in r
                                    # which would be 'h' if flush was detected
if i(z)+i(x)==2*i(y):               # check straight - three sorted numbers a,b,c would be in line if a+c == 2*b
    r=t+"-%s"%a+u                   
if ''.join(v)=="23A":               # check special case with straight, started from Ace
    r="%s-"%a+t+u  
j=0                                 # toggle reading from dictionary to string
if [z]*3==v:                        # check three equal values (almost the same as flush check)
    r="three %s"%d[z][0]+e
if len(r)==6:                       # if r was never modified, then it's just one high card
    r="%s high"%a
print r                             # output r

Może również zmienić się w ostatnich wierszach j=0; if [z]*3==v:r="three %ss"%i(z)na if [z]*3==v:r="three %ss"%d[z][0]Ale oszczędza tylko 1 bajt
Dead Possum

1
to może zawieść „szóstki”
Nie to, że Karol

1
@NotthatCharles Tak, dziękuję za uwagę. Dodałem poprawkę
Dead Possum
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.