Code:
/* straight.c */
#define MAXN 14 /* 13 cards plus an extra space for ace high */
#define CARDSINHAND 7
#define IN_A_ROW 5
int is_straight( int* cards, int ncards ) {
int seen[ MAXN ];
int in_a_row;
int i;
for (i = 0; i < MAXN; i++) seen[ i ] = 0;
for (i = 0; i < ncards; i++) {
seen[ cards[ i ] - 1 ]++;
if (cards[ i ] == 1) seen[ MAXN - 1 ]++; /* Set ace as high also */
}
in_a_row = IN_A_ROW;
for (i = MAXN - 1; i + 1 >= in_a_row; i--) {
if (seen[ i ]) {
if (--in_a_row == 0)
return 1;
}
else
in_a_row = IN_A_ROW;
}
return 0;
}
int main() {
int c[] = { 1, 3, 2, 9, 5, 4, 11 }; /* 1, 2, 3, 4, 5, 9, 11 */
int d[] = { 11, 1, 3, 13, 7, 9, 5 }; /* 1, 3, 5, 7, 9, 11, 13 */
int e[] = { 5, 12, 10, 7, 1, 11, 13 }; /* 1, 5, 7, 10, 11, 12, 13 */
int f[] = { 12, 5, 11, 6, 10, 8, 7 }; /* 5, 6, 7, 8, 10, 11, 12 */
printf( "c: " ); printf( is_straight( c, CARDSINHAND ) ? "yes" : "no" );
printf( "\nd: " ); printf( is_straight( d, CARDSINHAND ) ? "yes" : "no" );
printf( "\ne: " ); printf( is_straight( e, CARDSINHAND ) ? "yes" : "no" );
printf( "\nf: " ); printf( is_straight( f, CARDSINHAND ) ? "yes" : "no" );
printf( "\n" );
}