Back to list of problems
The Psychic Poker Player
131.c
#include <stdio.h> #include <stdlib.h> #include <string.h> enum { HIGHEST_CARD=0, ONE_PAIR, TWO_PAIRS, THREE_OF_A_KIND, STRAIGHT, FLUSH, FULL_HOUSE, FOUR_OF_A_KIND, STRAIGHT_FLUSH }; const char * hands[] = { "highest-card", "one-pair", "two-pairs", "three-of-a-kind", "straight", "flush", "full-house", "four-of-a-kind", "straight-flush", }; char hand[5][3]; char deck[5][3]; char play[5][3]; int flush(void) { int i; char c = play[0][1]; for (i=1; i<5; i++) { if (c != play[i][1]) { return 0; } } return 1; } int straight(void) { if ( (play[0][0]=='2' && play[1][0]=='3' && play[2][0]=='4' && play[3][0]=='5' && play[4][0]=='A') || (play[0][0]=='2' && play[1][0]=='3' && play[2][0]=='4' && play[3][0]=='5' && play[4][0]=='6') || (play[0][0]=='3' && play[1][0]=='4' && play[2][0]=='5' && play[3][0]=='6' && play[4][0]=='7') || (play[0][0]=='4' && play[1][0]=='5' && play[2][0]=='6' && play[3][0]=='7' && play[4][0]=='8') || (play[0][0]=='5' && play[1][0]=='6' && play[2][0]=='7' && play[3][0]=='8' && play[4][0]=='9') || (play[0][0]=='6' && play[1][0]=='7' && play[2][0]=='8' && play[3][0]=='9' && play[4][0]=='T') || (play[0][0]=='7' && play[1][0]=='8' && play[2][0]=='9' && play[3][0]=='J' && play[4][0]=='T') || (play[0][0]=='8' && play[1][0]=='9' && play[2][0]=='J' && play[3][0]=='Q' && play[4][0]=='T') || (play[0][0]=='9' && play[1][0]=='J' && play[2][0]=='K' && play[3][0]=='Q' && play[4][0]=='T') || (play[0][0]=='A' && play[1][0]=='J' && play[2][0]=='K' && play[3][0]=='Q' && play[4][0]=='T')) { return 1; } return 0; } int kind(int a) { int i,j; for (i=0; i<=5-a; i++) { for (j=1; j<a; j++) { if (play[i][0] != play[i+j][0]) { goto nopes1; } } return 1; nopes1: ; } return 0; } int kkind(int a, int b) { int i,j,k; for (i=0; i<=5-a-b; i++) { for (j=i+a; j<=5-b; j++) { for (k=1; k<a; k++) { if (play[i][0] != play[i+k][0]) { goto nopes2; } } for (k=1; k<b; k++) { if (play[j][0] != play[j+k][0]) { goto nopes2; } } return 1; nopes2: ; } } return 0; } int compar(const void *a, const void *b) { return *(char *)a - *(char *)b; } int calc(void) { qsort(play, 5, sizeof(play) / 5, compar); if (straight() && flush()) { return STRAIGHT_FLUSH; } else if (kind(4)) { return FOUR_OF_A_KIND; } else if (kkind(2,3) || kkind(3,2)) { return FULL_HOUSE; } else if (flush()) { return FLUSH; } else if (straight()) { return STRAIGHT; } else if (kind(3)) { return THREE_OF_A_KIND; } else if (kkind(2,2)) { return TWO_PAIRS; } else if (kind(2)) { return ONE_PAIR; } else { return HIGHEST_CARD; } } int main(void) { int i,j,k; int best; while (1) { if (scanf(" %s %s %s %s %s %s %s %s %s %s", hand[0], hand[1], hand[2], hand[3], hand[4], deck[0], deck[1], deck[2], deck[3], deck[4]) != 10) { return 0; } best = 0; for (i=0; i<32; i++) { k=0; for (j=0; j<5; j++) { if (i & 1<<j) { strcpy(play[j], hand[j]); } else { strcpy(play[j], deck[k++]); } } j = calc(); if (j > best) { best = j; } } printf("Hand:"); for (i=0; i<5; i++) { printf(" %s", hand[i]); } printf(" Deck:"); for (i=0; i<5; i++) { printf(" %s", deck[i]); } printf(" Best hand: %s\n", hands[best]); } }