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

メモ

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

yukicoder No.267 トランプソート

問題はこちら
No.267 トランプソート - yukicoder

カードの種類が高々52なので、ソートするのではなく「どのカードがあるか」を記録して、前から順番に出力すれば良い

int main(){
	int n,i,j,card[99][99]={};
	char p,q,suit[]="DCHS",num[]="A23456789TJQK";
	scanf("%d\n",&n);
	while(n--){
		scanf("%c%c ",&p,&q);
		card[p][q]++;
	}
	for(i=0;i<4;i++)for(j=0;j<13;j++)if(card[suit[i]][num[j]])printf("%c%c ",suit[i],num[j]);
	return 0;
}

とりあえず縮める

char*a="DCHSA23456789TJQK";
b[99][99],i,j;
main(k){
	for(gets(b);~scanf("%c%c ",&k,&j);b[k][j]++);
	//bは添字が小さいあたりは使わないのでgetsしても大丈夫
	for(;j=i<4;i++)for(;++j<17;)b[a[i]][a[j]]&&printf("%c%c ",a[i],a[j]);
}

RE… グローバル変数に0代入してればOKなんじゃなかったっけ…
まあとりあえずダメなら最後にexit(0);をつけることにして、for文圧縮

for(;j=i<4;i++)for(;++j<17;)b[a[i]][a[j]]&&printf("%c%c ",a[i],a[j]);
for(;++j<18?b[a[i]][a[j]]&&printf("%c%c ",a[i],a[j]):(j=++i<5););
//iが1ずれるので、それにともなってaもずらして"*DCHSA23456789TJQK"とする

更に最初の文ともくっつけて

char*a="*DCHSA23456789TJQK";
b[99][99],i,j;
main(k){for(gets(b);~scanf("%c%c ",&k,&j)?++b[k][j]:++j<18?b[a[i]][a[j]]&&printf("%c%c ",a[i],a[j]),1:(j=++i<5););}

こんどはREにならない
157B

16/06/16追記

b[a[i]][a[j]]&&printf("%c%c ",a[i],a[j]),1
!b[a[i]][a[j]]||printf("%c%c ",a[i],a[j])

1つにまとまったので前後を入れ替えるとカッコが減らせて更に2B縮む

char*a="*DCHSA23456789TJQK";
b[99][99],i,j;
main(k){for(gets(b);~scanf("%c%c ",&k,&j)?++b[k][j]:++j>17?j=++i<5:!b[a[i]][a[j]]||printf("%c%c ",a[i],a[j]););}

さらによーく考えると、Nをgetsで読み飛ばす必要はない事がわかる

char*a="*DCHSA23456789TJQK";
b[99][99],i,j;
main(k){for(;~scanf("%c%c ",&k,&j)?++b[k][j]:++j>17?j=++i<5:!b[a[i]][a[j]]||printf("%c%c ",a[i],a[j]););}

147B