포커 핸드 이름-7 카드 에디션


11

도전 과제 :

이 질문에 : 포커 손 이름 은 다섯 개 카드 포커 손을 잡고 그것을 확인했다합니다. 이 질문은 두 가지 왜곡으로 비슷합니다.

첫째, 출력은 모두 소문자입니다. 이것은, 더 골프를 허용 당신의 총액에 대해 걱정할 필요가 없습니다로 flushstraight

high card
one pair
two pair
three of a kind
straight
flush
full house
four of a kind
straight flush
royal flush

둘째, Texas Hold'em과 7 카드 스터드의 인기로 코드 골프에서 7 카드 포커 핸드 를 득점 할 수 있어야합니다 . 7 장의 카드 패를 득점 할 때, 당신의 패를 위해 5 장의 최고의 카드를 사용하고 필요없는 2 장을 무시하십시오.

참고:

포커 핸드 목록 : http://en.wikipedia.org/wiki/List_of_poker_hands

입력 (이전 스레드에서 직접 들어 올림)

stdin 또는 commandline 인수 중 7 . 카드는 양식 RS에서 두 글자 문자열 이며, 여기서 R은 순위이고 S는 적합합니다. 계급이 있다 2- 9(숫자 카드), T(열), J(잭), Q(여왕), K(임금), A(에이스). 정장 입니다 S, D, H, C각각 스페이드, 다이아몬드, 마음과 클럽.

카드의 예

5H - five of hearts
TS - ten of spades
AD - ace of diamonds

입력 예 => 원하는 출력

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

두 번째 예에서는 실제로 3 쌍이 있지만 5 장의 카드 만 사용할 수 있습니다 two pair. 다섯 번째 예에는 a three of a kindstraight가능한 것이 있지만 a straight가 더 좋습니다 straight.

채점

이것은 이므로 가장 짧은 코드가 승리합니다!

정오표

  1. 외부 리소스를 사용할 수 없습니다.
  2. 에이스는 스트레이트에서 높고 낮습니다.

좋은; 나는 누군가가 공을 집어 들기를 바랐다. 방금 원래 질문 (의견에 명시되어 있음)의 대문자 사용에 대한 제한이 없으므로 "Straight Flush"를 출력 할 수 있습니다 (대부분 / 모두). IMHO는 대문자로 표시됩니다.
daniero mar

입력 (이전 스레드에서 직접 들어 올림) 5 카드를 말합니다 . 나는 당신이 그것을 7로 바꾸려고했다고 생각합니다.
Level River St

@steveverrill 스택 교환에서 게시물을 직접 편집 할 수 있습니다. 내가 당신을 위해 여기했지만
durron597

외부 자원이 허용됩니까? 당신은 단순히 손에있는 각 카드를 찾고 손의 힘을 얻을 수 있도록 룩업 테이블이 있습니다.
Kendall Frey

에이스가 낮고 직선 일 수 있습니까?
Nick T

답변:


4

루비 353

이것은 원래 질문에 대한 Chron의 답변 을 기반으로합니다 .

명령 행 인수로 입력을받습니다. 기본적으로 우리는 크기 5의 모든 조합을 반복하여 어떤 유형의 손인지 알 수 있습니다. 각 핸드 타입은 숫자로 시작하도록 수정되었습니다. ( "royal flush"-> "0royal 4flush", "high card"-> "9high card"). 이를 통해 반환 된 문자열을 정렬 할 수 있습니다. 정렬 후 첫 번째 문자열이 가장 좋습니다. 따라서 문자열에서 모든 숫자를 제거한 후 인쇄합니다.

o,p=%w(4flush 1straight)
f=/1{5}|1{4}0+1$/
puts $*.combination(5).map{|z|s=[0]*13;Hash[*z.map{|c|s['23456789TJQKA'.index c[0]]+=1;c[1]}.uniq[1]?[f,'5'+p,?4,'2four'+a=' of a kind',/3.*2|2.*3/,'3full house',?3,'6three'+a,/2.*2/,'7two pair',?2,'8one pair',0,'9high card']:[/1{5}$/,'0royal '+o,f,p+' '+o,0,o]].find{|r,y|s.join[r]}[1]}.sort[0].gsub(/\d/,'')

좋은. 끝에있는 gsub는 단지 sub right 일 수 있습니까?
bazzargh

@bazzargh 아니오 모든 숫자를 제거해야합니다. 이 코드는 4flush를 1straight 또는 0royal과 연결하여 "0royal 4 flush"또는 "1straight 4flush"를 얻습니다. sub 만 사용하면 4는 제거되지 않습니다.
FDinoff

에 대한 잘못된 결과를 제공합니다 AS QS JS TS 9S 5H 5D. 캐릭터 비용이 듭니다!

@ WumpusQ.Wumbley 흠 이것은 원래 코드의 버그 인 것 같습니다. 나중에 문제가 무엇인지 알아 내려고 노력할 것입니다.
FDinoff

5

하스켈 618 603 598 525 512 504 480 464

입력 라인으로 사용되는 카드. 나는 이것을 골프로 죽 였지만 동일한 트릭을 사용하여 루비 등으로 쉽게 맞을 것이라고 생각합니다. 모든 순열을 생성하면 직선을 찾고자하는 순방향 정렬과 테스트를 위해 원하는 역방향 정렬을 얻습니다. 종류의.

import Data.List
m=map
z=take 5
q=m(\x->head[n|(f,n)<-zip"A23456789TJQK"[1..],f==x!!0])
l=m length
v=" of a kind"
w="flush"
y="straight"
c f s p r|f&&r="9royal "++w|f&&s='8':y++" "++w|f='5':w|s||r='4':y|True=case p of 4:_->"7four"++v;3:2:_->"6full house";3:_->"3three"++v;2:2:_->"2two pair";2:_->"1one pair";_->"0high card"
d x=c([5]==l(group$m(!!1)x))(q x==z[head(q x)..])(l$group$q x)$q x==1:[10..13]
k h=tail$maximum$m(d.z)$permutations$words h
main=interact k

"Fairin"을 인라인하도록 수정하고 @FDinoff의 항목을 본 후 숫자 접두사를 사용하고 하나 이상의 문자를 면도하는 맵 함수도 구성했습니다.


당신이 당신을 제거하면 자신을 몇 문자 (약 5 생각)를 저장할 수 있습니다. "one pair","two pair"다음보다 짧습니다u=" pair" ... "one"++u,"two++u
FDinoff

네, 코드를 읽은 후에 변경했습니다. 또한 숫자 접두어 기술은 또 다른 5를 저장합니다.
bazzargh

2

C ++, 622 553 자

명확성을 위해 아래에 추가 된 네 개의 불필요한 줄 바꿈.

#include"stdafx.h"
#include"string"
std::string c=" flush",d=" of a kind",e="straight",z[10]={"high card","one pair","two pair","three"+d,e,c,"full house","four"+d,e+c,"royal"+c},
x="CDHSA23456789TJQK";char h[99];int main(){__int64 f,p,t,g,u,v,w,l=1,a=78517370881,b=a+19173960,i,j,q=0;gets_s(h,99);for(i=28;i-->7;){f=p=0;
for(j=7;j--;)if(j!=i%7&j!=(i+i/7)%7){f+=l<<x.find(h[j*3+1])*6;p+=l<<x.find(h[j*3])*3-12;}
v=p&b*2;u=v&v-1;w=p&p/2;g=p*64&p*8&p&p/8&p/64;f&=f*4;t=f&&p==a?9:f&&g?8:p&b*4?7:u&&w?6:f?5:g||p==a?4:w?3:u?2:v?1:0;
q=t>q?t:q;}puts(z[q].c_str());}

골프 버전에서 변경된 사항 :

개정 1 : 모든 숫자 변수를 __int64단일 선언으로 변경했습니다.

개정 1 : 골프 증가 및 for루프 조건

개정 0 : 8 진 상수를 10 진수로 변경했습니다.

개정 0 : if조건부 연산자를 사용하여 할당으로 명령문을 변경했습니다 . 개정 1 :에 대한 단일 표현식으로 다시 재정렬되었습니다 t. v중간 값 중 하나에 새 변수 가 필요했습니다.

개정 0 : 자세한 출력을 삭제했습니다. 전반적으로 가장 좋은 핸드만을 출력합니다.

Rev 0 : 출력 텍스트 압축에 주력 (+ 연산자를 사용하여 문자열을 연결할 수 없기 때문에 C에서는 어려움) 그래서 그냥 3 번 썼습니다. 개정 1 : FDinoff가 제안한 std::string대신에 사용 char[]하여와 연결할 수 있습니다 +.

Ungolfed 버전, 비 공백 비 공백 문자 714 개

7 장의 카드로 만들 수있는 21 개의 핸드를 모두 반복하고 매번 2 장씩 거부합니다. 선택된 5 장의 카드의 수트와 순위는 각 수트 / 랭크에 대해 서로 다른 8 진수로 변수 f와 p로 합산됩니다. 핸드 타입을 결정하기 위해 다양한 비트 연산이 수행되고, 핸드 타입은 t에 저장된다 (21 개의 가능성이 모두 언 골프 버전으로 출력된다). 마지막으로 가장 좋은 핸드가 출력된다.

#include "stdafx.h"
#include "string.h"

char x[] = "CDHSA23456789TJQK", h[99], z[10][99] = 
{ "high card", "one pair", "two pair","three of a kind", "straight","flush","full house","four of a kind","straight","royal" };

int main(void)
{
        int i,j,q=0;                  //i,j:loop counters. q:best possible hand of 7 card   
        scanf_s("%s/n", &h, 99); getchar();
        for (i = 7; i < 28; i++){

          //f,p: count number of cards of each suit (2 octal digits) and rank (1 octal digit.)
          //t: best hand for current 5 cards. g:straight flag. u,w: flags for pairs and 3's.   
          //l: constant 1 (64bit leftshift doesn't work on a literal.) 
          //octal bitmasks: a=ace high straight, b=general purpose

            __int64 f=0,p=0,t=0,g,u,w,l=1,a=01111000000001,b=a+0111111110;

           for (j = 0; j < 7; j++){
               if (j != i %7 & j != (i+i/7) %7){

                   f += l << (strchr(x,h[j*3+1])-x)*6;
                   p += l << (strchr(x,h[j*3])-x-4)*3;

                   printf_s("%c%c ",h[j*3], h[j*3+1]);
               }
           }

           w=p&b*2;                          //if 2nd bit set we have a pair
           if (w) t=1;
           u= w & w-1;                       //if there is only one pair w&w-1 evaluates to 0; +ve for 2 pair.
           if (u) t=2;
           w = p & p/2;                      // if 2nd and 1st bit set we have 3 of kind. 
           if (w) t=3;
           g = p*64 & p*8 & p & p/8 & p/64;  // detects all straights except ace high. pattern for ace high in a.
           if (g||p==a) t=4;
           f&=f*4;                           //for a flush we want 5 cards of the same suit, binary 101
           if (f) t=5;
           if (u&&w) t=6;                    //full house meets conditions of 2 pair and 3 of kind
           if (p & b*4) t=7;                 //four of a kind
           if (f && g) t=8;                  //straight flush
           if (f && p==a) t=9;               //royal flush
           printf_s("%s %s \n",z[t],t>7?z[5]:"");
           q=t>q?t:q;
        }   
        printf_s("%s %s",z[q],q>7?z[5]:"");
        getchar();
}

언 골프 출력

여기에 이미지 설명을 입력하십시오


c ++을 사용한다고 말하면 <string>문자열 연결을 지원하는 +를 사용할 수 있습니다 . 그렇다면 아마도 사용 <iostream>하고 사용할 수 있음을 의미 cout하지만 실제로 문자 수가 적을 지 모르겠습니다.
FDinoff

@ FDinoff 내가 저장할 수있는 것 : " pair flush flush straight of a kind"= 35 자. 당신이 추가하면 #include비용 절감은 추가 고려해야 할 다음, 최소화 ",=+및 상수의 선언을. 또한 내가 ++ C에 새로운 IDE 및 컴파일러 설정에 어려움을 겪고있어 (그것은 나를 사용하는 강제 scanf_s하고 printf_s대신 오래된 "안전하지 않은"버전과 동그라미 라운드 간다 고정에 대한. 도움의) cout내에게있어, 조금 도움이 될 수 있습니다 목록을 작성하지만 아마도 다른 프로그램을위한 것입니다. cout나를 죽이는 것은 using namespace std모든 것을 쓰는 것을 피할 수있는 방법이 있는지 모른다 는 것입니다.
Level River St

C ++를 사용하기 때문에 printf와 scanf가 거의 필요하지 않습니다. 다른 일 (사피어)도 같은 일을했습니다. 당신은 사용할 수 있습니다 std::cout주위에 얻을using namespace std
FDinoff

팁을위한 @FDinoff thx. 내 최신 편집에서 18 바이트의 다른 문자열 처리 : gets_s&를 저장 puts하고 더하기 std::string위해 연결했습니다. 즉 char*출력으로 변환해야합니다 . 내가 게시 한 골프는 단지 string또는 iostream.기괴하게 작동 합니다 . & <<>>와 함께 연산자 를 사용하려면 둘 다 포함해야합니다 . 전반적으로, s 로 선언 하고 별도의 선언을 피할 수는 있지만 두 가지를 모두 사용 하면 5 바이트가 나빠 집니다. 예상대로 도움이되는 내용 (또는 운영자에 대한 설명)을 찾을 수 없습니다.cin/coutstd::string#includehstd::stringcharnamespace std
Level River St

동의 @FDinoff, 나는 일반적으로 사용하지 않을 scanf하고 gets, 프로그램이 매우 안전하지 않은 어쨌든입니다 골프를 제외하고. 대신 대신 -s,99사용할 수 있다면 5 바이트 단축 할 수는 있지만 컴파일러에서 허용하지는 않습니다. 놀랍게도 C / C ++가 일반적으로 안전하지 않다는 것입니다! 몇 주 전에 y에 대해 31보다 큰 오답 을 제공 한다는 사실에 충격을 주었을 것입니다. 그러나 지금은 약간 화가 났습니다 . 오류 메시지없이 배열 첨자가 범위를 벗어나는 것을 보았으므로 익숙해졌습니다. 더 나은 확인을 설정하는 방법이 있습니까? getsgets_s_int64 x=1<<y
Level River St

2

펄 (> = 5.14) 411 403 400 397 400

편집 : 한 번만 호출 된 서브를 인라인하여 8 문자를 저장했습니다.
편집 2 : .""초기 시도에서 남은을 제거했습니다
편집 3 : 원본을 보존하는 임시 변수 대신 $_하나를 사용하여 불필요하게 만듭니다. 순이익은 3 자입니다.
편집 4 : 전체 풀 하우스 (2x 3 종류) 감지 오류 수정 . 비용은 3 자입니다.

승자는 아니지만 직선형 검출기는 흥미로운 개념이라고 생각합니다.

sub
j{join"",sort@_}sub
o{j(map{{A=>10}->{$_},11+index(j(2..9).TJQKA,$_)}$h=~/(.(?=@_))/g)=~/.*(..)(??{j
map$1+$_.'.*',1..4})/?$1:()}$h=$_=<>;if(j(/(\S)\b/g)=~/(.)\1{4}/){$w=$_==19?royal:straight
for
o$f=$1}$_=j(/\b(\S)/g)=~s/(.)\1*/length$&/rge;$k=" of a kind";print$w?"$w flush":/4/?four.$k:/3.*2|[23].*3/?"full house":$f?flush:(o".")?straight:/3/?three.$k:/2.*2/?"two pair":/2/?"one pair":"high card"

확장 버전 :

# We'll be doing a lot of sorting and joining
sub j {
  return join "", sort @_;
}

# r() expects $_ to contain a rank, and converts it to a numeric code. The
# code starts at 10 so the numbers will sort correctly as strings, and a list
# of 2 values is returned because A is both 10 and 23. All other ranks have
# undef as the first value and their proper 11..22 value as the second value.
sub r {
  return ({A=>10}->{$_}, 11+index(j(2..9).TJQKA,$_));
}

# Sequence-detector. Factored into a sub because it's run twice; once over
# the ranks in the flush suit to find a straight flush and once over all the
# ranks to find a straight. On successful match, returns the lowest rank of
# the straight (in the 10..23 representation).
# Required parameter: the suit to search, or "." for all suits.
sub o {
  j(map r,$h=~/(.(?=@_))/g)          # The list of ranks, in increasing order,
                                     # with ace included at both ends...
    =~                               # ...is matched against...
  /.*(..)(??{j map$1+$_.'.*',1..4})/ # ...a pattern requiring 5 consecutive
                                     # numbers.
  ?$1:()
  # A note about this regexp. The string we're matching is a bunch of numbers
  # in the range 10..23 crammed together like "121314151619" so you might
  # worry about a misaligned match starting on the second digit of one of the
  # original numbers. But since that would make every pair of digits in the
  # match end with a 1 or a 2, there's no way 5 of them will be consecutive.
  # There are no false matches.
  # Another note: if we have a royal flush and also have a 9 in the same
  # suit, we need to return the T rank, not the 9, which is why the regexp
  # starts with a .*
}

# Read a line into $_ for immediate matching with /.../ and also save it into
# $h because $_ will be clobbered later and we'll need the original string
# afterwards.
$h = $_ = <>;

if(j(/(\S)\b/g) =~ /(.)\1{4}/) { # flush detector: sorted list of all suits
                                 # contains 5 consecutive identical chars
  # $f=$1 comes first, so $f will be true later if there's a flush.
  # Then o() is called with the flush suit as arg to detect straight flush.
  # If there's no straight flush, o() returns the empty list and for loop
  # runs 0 times, so $w is not set. If there is a straight flush, the return
  # value of o() is compared to 19 to detect royal flush.
  $w = ($_==19 ? "royal" : "straight")
    for o($f=$1);
}

$_ =
  j(/\b(\S)/g)                 # Get the sorted+joined list of ranks...
    =~ s/(.)\1*/length $&/rge; # ... and turn it into a list of sizes of
                               # groups of the same rank. The /r flag
                               # requires perl 5.14 or newer.

print
  $w             ? "$w flush" :
  /4/            ? "four of a kind" :
  /3.*2|[23].*3/ ? "full house" :
  $f             ? "flush" :
  (o".")         ? "straight" :
  /3/            ? "three of a kind" :
  /2.*2/         ? "two pair" :
  /2/            ? "one pair" :
                   "high card"

1

자바 스크립트 600

nodeJS와 함께 사용 : node code.js "7H 3S 7S 7D AC QH 7C"

function a(o){s="";for(k in o)s+=o[k];return s}
b=process.argv[2]
c={S:0,H:0,D:0,C:0}
v={A:0,K:0,Q:0,J:0,T:0,"9":0,"8":0,"7":0,"6":0,"5":0,"4":0,"3":0,"2":0}
d=b.split(" ")
for(i=d.length;i--;){e=d[i];c[e[1]]++;v[e[0]]++}
c=a(c);v=a(v)
f=g=h=j=k=l=m=false
if((st=c.indexOf(5))!=-1)g=!g
if(v.match(/[1-9]{5}/))h=!h
if(st==0)f=!f
if(v.indexOf(4)!=-1)j=!j
if(v.indexOf(3)!=-1)k=!k
if(n=v.match(/2/g))if(n)if(n.length>=2)m=!m;else l=!l
p=" of a kind"
q="Flush"
r="Straight"
console.log(f&&g?"Royal "+q:h&&g?r+" "+q:j?"Four"+p:k&&(l||m)?"Full House":g?q:h?r:k?"Three"+p:m?"Two pairs":l?"Pair":"High card")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.