자랑 손 이름


11

배경

브래그 (Brag)는 개념은 포커와 비슷하지만 포커보다 단순합니다. 브래그 인 핸드는 3 장의 카드로 구성되며 최고에서 최저로 다음과 같이 순위가 결정됩니다.

  • 세 종류-세 카드 모두 같은 순위입니다. "세 왕"등으로 명명

  • 플러시 (일명 플러시)를 실행합니다. 같은 수트와 연속 순위의 세 카드 모두. 손은 3 장의 카드에 의해 오름차순으로 표시되고 그 뒤에 "바운스에"라는 단어가 붙어서 간단한 런 / 스트레이트와 구별됩니다 (예 : "바운스에 10 잭 퀸"). 에이스는 높거나 낮지 만 둘다는 아닙니다. "king-ace-two"는 달리기가 아닙니다.

  • 일명 일직선으로 달리십시오. 위와 같지만 정장과 일치하지 않아도됩니다. 예를 들어 "ten-jack-queen"과 같이 간단히 명명됩니다.

  • 플러시 (Flush)-세 카드 모두 같은 수트이며 "Ace flush"와 같이 가장 높은 순위를 딴 것입니다.

  • 페어-다른 버전 순위의 1/3과 동일한 순위의 두 카드. "세 쌍"등으로 명명

  • "ace high"와 같이 가장 높은 순위를 딴 다른 조합.

도전

3 장의 플레잉 카드가 주어지면, 그들이 자랑하는 손의 이름을 출력하십시오.

카드는 3 개의 2 문자열로 입력되거나 단일 6 문자열 (구현이 선호하는 것)로 연결되며 각 쌍의 첫 번째는 순위 (2 ... 9, T, J, Q, K, A) 및 두 번째는 슈트 (H, C, D, S)를 나타냅니다.

표준 골프 규칙 적용-이 입력을 받아들이고 위에서 설명한대로 손의 이름을 출력하는 프로그램 또는 기능을 작성하십시오.

입력이 유효하고 (위의 범위에서 순위 및 수, 반복되는 카드는 없음) 원하는 경우에 상관없이 특정 순서가 아닌 것으로 가정 할 수 있습니다.

출력은 모든 대문자, 모두 소문자 또는 대문자 또는 예를 들어 대문자로 표시되어야합니다. 숫자 순위는 10이 아닌 "tens"와 같이 철자가되어야합니다.

샘플 입력 및 출력 :

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"

이것은이 사이트의 도전에 대한 첫 번째 시도입니다. 개선을 제안하지만 부드럽게하십시오 :)



4
PPCG에 오신 것을 환영합니다! 나는 지금까지 도전을 감추지 못했지만 첫 번째 도전에는 괜찮은 것처럼 보입니다. 즉, 좋은 과제를 작성하는 것은 어렵고 앞으로 샌드 박스에 아이디어 게시하여 나중에 피드백을 받고 사양에 대한 세부 정보를 개선 할 수있는 다운 보트, 마감 투표 및 답변을 위험에 빠뜨리기 전에 먼저 아이디어 게시하는 것이 좋습니다 . 도전.
Martin Ender

@MartinEnder 감사합니다! 나는 다음에 샌드 박스를 확실히 보았을 것이다.
IanF1

튜플 배열로 입력을받을 수 있습니까? 또한 'king flush'와 같은 출력을 'fk'로 줄일 수 있습니까?
Matthew Roh

1
"6D6C6S"6은 복수형이기 때문에 테스트 케이스로 추가하십시오
Charles

답변:


2

루비, 384 , 320

두 문자 문자열의 배열을 허용합니다.

핍 값을 16 진수 값으로 변환하고 몇 개의 고유 한 핍 값이 있는지에 따라 손을 식별합니다.

->*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]}

주석 달기 :

->*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

파이썬 2 , 788, 715, 559, 556, 554, 546, 568, 522 바이트

* 46 바이트를 절약 해 준 Ben Frankel에게 감사합니다.


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

온라인으로 사용해보십시오!

멋진 첫 도전에 감사드립니다!


1
일부 공백 골프 제안 : TIO
math junkie

감사! 공백이 많은 바이트를 추가한다는 것을 알고 있었지만 4 공백이 필요하다고 생각했습니다. 편집했습니다! @math_junkie
Stephen

@ user7686415 또는 실제 탭을 대신 사용할 수 있습니다.
mbomb007

1
@NotthatCharles가 고쳤습니다!
Stephen

1
@ 스테판. D.get(a, b)키가 없으면 기본 값 b를 사용하여 키 a에서 dict D의 값에 액세스하는 것을 의미합니다. 글쓰기 D[a] if a in D else b와 같으며 글쓰기와 같습니다 D[a] if a in D.keys() else b.
벤 프랭클

2

PHP, 413 405 398 409 408 406 398 바이트

불행히도 PHP는 문자열 내에서 중첩 배열 참조를 지원하지 않습니다.
다른 6 5 바이트를 절약했을 것 입니다.

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;

온라인으로 실행 echo <hand> | php -nR '<code>하거나 테스트하십시오 .

고장

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
;

PHP> = 5.6 필요 (for e[...])


1
이것은 "6"에 실패 할 수 있습니다
Charles

1
@NotthatCharles : 그 비용은 11 바이트였습니다 ...하지만 나는 다시 골프를 쳤습니다. :)
Titus

1

파이썬 2-583 바이트

게시물에 댓글을 달기에는 너무 새롭기 때문에 내 버전의 python solusion을 게시합니다.

페어와 6 개 중 3 개에 대해 'es'문제가 해결되었습니다. 그 찰스 감사 하지

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

약간의 주석으로 조금 더 읽기

# 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

또한 마지막 행에서 변경 될 수 있습니다 j=0; if [z]*3==v:r="three %ss"%i(z)if [z]*3==v:r="three %ss"%d[z][0]그러나 그것은 단지 1 바이트 저장
죽은 포섬

1
이것은 "육각"에 실패 할 수 있습니다
Charles

1
@NotthatCharles 그래, 알아 주셔서 감사합니다. 수정 사항을 추가했습니다
Dead Possum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.