メモ

yukicoderでゆるふわgolf

yukicoder No.256 桁の数字を入れ替え (2)

問題はこちら
No.256 桁の数字を入れ替え (2) - yukicoder

任意に並び替えられるので元の並びは関係ない
なので各数字がいくつ登場するかを記録して、大きい数から上位に配置していけば良い

int main(){
	int a[10],i;
	char s[100010];
	gets(s);
	for(i=0;s[i];i++)a[s[i]-'0']++;
	for(i=9;i>=0;i--)while(a[i]){putchar('0'+i);a[i]--;}
	return 0;
}

ささっと書き換えて

a[11];
main(t){
	for(;t=getchar()-10;a[t-37]++);
	//indexを1つずらして'0'の個数をa[1]に、…'9'の個数をa[10]に保存
	for(t=11;--t;)for(;a[t]--;)putchar(47+t);
}

まず後半部分は

for(t=10;a[t+47]--?putchar(47+t):--t;);

と圧縮できる。
前半はgetcharでなくreadで読み込みをすることにする
このとき、読み込み終了時にtが10となっていることを利用して後半の初期化がサボれる

a[60];main(t){for(;read(0,&t,1);a[t]++);for(;a[t+47]--?putchar(47+t):--t;);}

for文圧縮+配列サイズのごまかし

a[];main(t){for(;read(0,&t,1)?++a[t]:a[t+47]--?putchar(47+t):--t;);}

68B