/* This has the same effect and internal structure as poker7, but it uses variable array indexing to save a huge amount of code. */ #include char rc[13] = { '2','3','4','5','6','7','8','9','T','J','Q','K','A' }; long long value_hand(char r[5],char s[5]) { long long result; int flush; int have[13]; /* have[i] is the number of cards with rank rc[i] */ char straight; /* the highest rank in a straight; 0 if not straight */ int reps[6]; /* reps[2] is the number of pairs, reps[3] threes, etc. */ int i; int j; flush = (s[0] == s[1] && s[1] == s[2] && s[2] == s[3] && s[3] == s[4]); for (i = 0;i < 13;++i) { have[i] = 0; for (j = 0;j < 5;++j) have[i] += (r[j] == rc[i]); } straight = 0; if (have[12] && have[0] && have[1] && have[2] && have[3]) straight = 5; for (i = 0;i < 9;++i) { for (j = 0;j < 5;++j) if (!have[i + j]) break; if (j == 5) straight = i + 6; } if (straight && flush) return 80000000000LL + straight; if (straight) return 40000000000LL + straight; result = 0; /* we don't need reps[1], but the code is simpler this way */ for (j = 5;j > 0;--j) { reps[j] = 0; for (i = 12;i >= 0;--i) if (have[i] == j) { result = result * 100 + i + 2; ++reps[j]; } } if (reps[5]) return 90000000000LL + result; if (reps[4]) return 70000000000LL + result; if (reps[3] && reps[2]) return 60000000000LL + result; if (flush) return 50000000000LL + result; if (reps[3]) return 30000000000LL + result; if (reps[2] > 1) return 20000000000LL + result; if (reps[2]) return 10000000000LL + result; return result; } void rank_print(int n) { if (n >= 2 && n <= 14) { printf("%c",rc[n - 2]); return; } printf("?"); /* should never happen */ } void value_print(long long v) { if (v == 80000000014LL) { printf("royal flush.\n"); return; } switch (v / 10000000000LL) { case 9: printf("five "); rank_print(v % 100); printf("'s.\n"); return; case 8: printf("straight flush, "); rank_print(v % 100); printf(" high.\n"); return; case 7: printf("four "); rank_print((v / 100) % 100); printf("'s"); break; case 6: printf("three "); rank_print((v / 100) % 100); printf("'s. pair of "); rank_print(v % 100); printf("'s. full house. \n"); return; case 4: printf("straight, "); rank_print(v % 100); printf(" high.\n"); return; case 3: printf("three "); rank_print((v / 10000) % 100); printf("'s. "); rank_print((v / 100) % 100); break; case 2: printf("pair of "); rank_print((v / 10000) % 100); printf("'s. pair of "); rank_print((v / 100) % 100); printf("'s"); break; case 1: printf("pair of "); rank_print((v / 1000000) % 100); printf("'s. "); rank_print((v / 10000) % 100); printf(". "); rank_print((v / 100) % 100); break; case 5: printf("flush. "); /* fall through */ default: rank_print((v / 100000000) % 100); printf(". "); rank_print((v / 1000000) % 100); printf(". "); rank_print((v / 10000) % 100); printf(". "); rank_print((v / 100) % 100); } printf(". "); rank_print(v % 100); printf(". \n"); } int main(void) { char x[5]; char y[5]; int j; for (;;) { for (j = 0;j < 5;++j) if (scanf(" %c%c",&x[j],&y[j]) < 2) return 0; for (j = 0;j < 4;++j) printf("%c%c ",x[j],y[j]); printf("%c%c: ",x[4],y[4]); value_print(value_hand(x,y)); } return 0; }