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());}
สิ่งที่เปลี่ยนไปในเวอร์ชัน golfed:
Rev 1: เปลี่ยนตัวแปรตัวเลขทั้งหมด__int64
สำหรับการประกาศเดียว
Rev 1: การเพิ่มขึ้น Golfed และเงื่อนไขของfor
ลูป
Rev 0: เปลี่ยนค่าคงที่ฐานแปดเป็นทศนิยม
Rev 0: เปลี่ยนif
คำแถลงเป็นการมอบหมายด้วยโอเปอเรเตอร์ที่มีเงื่อนไข Rev 1: จัดเรียงใหม่ในนิพจน์เดียวให้t
มากขึ้น ต้องการตัวแปรใหม่v
สำหรับหนึ่งในค่ากลาง
Rev 0: ลบผลลัพธ์ verbose ที่ถูกลบ แสดงเฉพาะมือโดยรวมที่ดีที่สุดเท่านั้น
Rev 0: รวบรวมการบีบอัดข้อความเอาท์พุท (ยากใน C เพราะคุณไม่สามารถต่อสายอักขระโดยใช้ตัวดำเนินการ +) เขียน "flush" เพียงครั้งเดียวช่วยให้ฉันประหยัด 12 อักขระ แต่ค่าใช้จ่ายฉัน 15 ทำให้แย่ลงโดยรวม 3 ตัว ดังนั้นฉันจึงเขียนมัน 3 ครั้งแทน Rev 1: ใช้std::string
แทนการchar[]
แนะนำโดย FDinoff ทำให้สามารถเชื่อมต่อ+
ได้
รุ่นที่ไม่ได้บรรจุ 714 ตัวอักษรที่ไม่ใช่ข้อคิดเห็นช่องว่าง
วนมือ 21 ที่เป็นไปได้ทั้งหมดที่สามารถทำจาก 7 ใบและปฏิเสธไพ่ 2 ใบในแต่ละครั้ง ชุดไพ่และอันดับของไพ่ห้าใบที่เลือกจะถูกรวมในตัวแปร 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();
}
เอาท์พุท Ungolfed
