Skip to content

Instantly share code, notes, and snippets.

@splitline
Created November 22, 2016 12:02
Show Gist options
  • Save splitline/688399c47d5da18fd33600153eabb447 to your computer and use it in GitHub Desktop.
Save splitline/688399c47d5da18fd33600153eabb447 to your computer and use it in GitHub Desktop.
poker.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int getRank(int n,char *rank,char card[][3]);
int getSuit(int n,char *suit,char card[][3]);
int isAKind(int n,char *rank,char card[][3],int *checked);
int isFull(char *rank,char card[][3],int *checked);
int isFlush(char *suit,char card[][3]);
int isStraight(char *rank,char card[][3]);
int isFlush(char *suit,char card[][3]);
int isPair(char *rank,char card[][3],int *checked);
int main(){
char rank[]={"23456789tjqka"},suit[]={"cdhs"},card[5][3]={0};
int checked[5]={0};
while(~scanf("%s%s%s%s%s",card[0],card[1],card[2],card[3],card[4])){
int ic=0,dc=0;
for(int i=0;i<5;i++)
for(int j=0;j<2;j++)
card[i][j]=tolower(card[i][j]);
for(int i=0;i<5;i++){
char *f1=strchr(rank,card[i][0]),*f2=strchr(suit,card[i][1]);
if(!f1||!f2)ic=1;
for(int j=i+1;j<5;j++)
if(!strcmp(card[i],card[j]))dc=1;
}
if(ic && !dc) {printf("Illegal card\n");continue;}
if(!ic && dc) {printf("Duplicate card\n");continue;}
if(ic && dc) {printf("Illegal and Duplicate cards\n");continue;}
for(int i=0;i<5;i++){
for(int j=1;j<5-i;j++){
int tmp1=getRank(j,rank,card)*10+getSuit(j,suit,card);
int tmp2=getRank(j-1,rank,card)*10+getSuit(j-1,suit,card);
if(tmp1 < tmp2){
char t[3];
strcpy(t,card[j]);
strcpy(card[j],card[j-1]);
strcpy(card[j-1],t);
}
}
}
memset(checked,0,sizeof(checked));
if(isStraight(rank,card)&&isFlush(suit,card))printf("Straight Flush");
else if(memset(checked,0,sizeof(checked))&&isAKind(4,rank,card,checked))printf("Four-Of-A-Kind");
else if(isAKind(3,rank,card,checked)&&isPair(rank,card,checked)) printf("Full House");
else if(isFlush(suit,card))printf("Flush");
else if(isStraight(rank,card))printf("Straight");
else if(memset(checked,0,sizeof(checked))&&isAKind(3,rank,card,checked))printf("Three-Of-A-Kind");
else if(memset(checked,0,sizeof(checked))&&isPair(rank,card,checked)==2)printf("Two Pairs");
else if(memset(checked,0,sizeof(checked))&&isPair(rank,card,checked)==1)printf("Pair");
else printf("High Card");
for(int i=0;i<5;i++)printf(" %s",card[i]);
printf("\n");
}
return 0;
}
int getRank(int n,char *rank,char card[][3]){
return strchr(rank,card[n][0])-rank+1;
}
int getSuit(int n,char *suit,char card[][3]){
return strchr(suit,card[n][1])-suit+1;
}
int isStraight(char *rank,char card[][3]){
int lastRank;
lastRank=getRank(0,rank,card);
for(int i=1;i<5;i++){
if(getRank(i,rank,card)-lastRank==1){
if(i==4)return 1;
lastRank=getRank(i,rank,card);
}
else return 0;
}
}
int isAKind(int n,char *rank,char card[][3],int *checked){
int lastRank;
for(int i=0;i<=5-n;i++){
lastRank=getRank(i,rank,card);
for(int j=i+1;j<i+n;j++){
if(getRank(j,rank,card)==lastRank){
checked[j]=checked[j-1]=1;
lastRank=getRank(j,rank,card);
if(j==i+n-1)return 1;
}
else if(i==5-n&&j==i+n-1)return 0;
}
for(int i=0;i<5;i++)checked[i]=0;
}
return 0;
}
int isFlush(char *suit,char card[][3]){
int lastSuit;
lastSuit=getSuit(0,suit,card);
for(int i=1;i<5;i++){
if(getSuit(i,suit,card)==lastSuit){
if(i==4)return 1;
lastSuit=getSuit(i,suit,card);
}
else return 0;
}
return 0;
}
int isPair(char *rank,char card[][3],int *checked){
int lastRank,n=0;
for(int i=0;i<5;i++){
if(checked[i]==0){
lastRank=getRank(i,rank,card);
n=i;
break;
}
}
for(int i=n+1;i<5;i++){
if(checked[i]==0){
if(getRank(i,rank,card)==lastRank){
checked[i]=checked[i-1]=1;
return 1+isPair(rank,card,checked);
}
lastRank=getRank(i,rank,card);
}
else if(i==4)return 0;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment