読者です 読者をやめる 読者になる 読者になる

メモ

yukicoderで遊んでいる競プロゆるふわ勢

yukicoder No.227 簡単ポーカー

問題はこちら
No.227 簡単ポーカー - yukicoder

まず各カードが何枚あるか調べ、2枚組み・3枚組みが何組あるか調べる

int main(){
	int i,d=0,t=0,a[14]={};
	for(i=0;i<5;i++){
		scanf("%d",&p);
		a[p]++;
	}
	//カードiがa[i]枚ある
	for(i=1;i<=13;i++){
		if(a[i]==2)d++;
		else if(a[i]==3)t++;
	}
	//ペアがd組、トリプルがt組ある
	if(t==1)puts(d==1?"FULL HOUSE":"THREE CARD");
	else puts(d==2?"TWO PAIR":d==1?"ONE PAIR":"NO HAND");
	return 0;
}

sという配列をとりn枚組みが何組あるかをs[n]に保存することにして

s[6],a[14],i;
main(j){
	for(;~scanf("%d",&i);a[i]++);
	for(;j<14;s[a[j++]]++);
	i=!puts(s[3]?s[2]?"FULL HOUSE":"THREE CARD":s[2]?s[2]-1?"TWO PAIR":"ONE PAIR":"NO HAND");
}

ループ圧縮、sのindexずらし、配列サイズのごまかし、メモリ違反の対処、諸々を詰め込んで

a[30],s[],i;
main(j){
	for(;!~scanf("%d",&i)?++s[a[j]-2],++j<14:++a[i];);
	i=!puts(s[1]?*s?"FULL HOUSE":"THREE CARD":*s?*s-1?"TWO PAIR":"ONE PAIR":"NO HAND");
}

154B

2016/06/09追記
出力部分の場合分けをちょっと考えた

a[30],s[],i;
main(j){
	for(;!~scanf("%d",&i)?++s[a[j]-2],++j<14:++a[i];);
	i=!puts("NO HAND\0*THREE CARD\0ONE PAIR\0FULL HOUSE\0TWO PAIR"+s[1]*9+*s*20);
}

148B
ペアやスリーカード検出がもう少し短くかけないかな……?

2016/12/03追記
sって配列で保存する必要ないじゃん

//やるべきことはこれ
s+=a[j]-2?a[j]-3?0:9:20;
//ぐっと睨むと次のように変形できる
s+=a[j]&2?42-a[j]*11:0;

ということでこう

a[30],s,i;
main(j){
	for(;!~scanf("%d",&i)?s+=a[j]&2?42-a[j]*11:0,++j<14:++a[i];);
	i=!puts("NO HAND\0*THREE CARD\0ONE PAIR\0FULL HOUSE\0TWO PAIR"+s);
}

146B