メモ

yukicoderでゆるふわgolf

yukicoder No.706 多眼生物の調査

問題はこちら
No.706 多眼生物の調査 - yukicoder

strlen(s)-2の最頻値を見るだけ

int a[1010];
int main(){
	int n;
	scanf("%d\n",&n);
	for(int i=0;i<n;i++){
		char s[1010];
		gets(s);
		a[strlen(s)-2]++;
	}
	
	int ans=2;
	for(int i=2;i<=1000;i++)if(a[i]>=a[ans])ans=i;
	printf("%d",ans);
}

ぐっと睨んでループをまとめる。文字列を読み込む変数をごまかしたり、端の処理をごまかしても通る

k,a[999],i;
main(m){
	for(;gets(&k)?++a[strlen(&k)]:i++<998?m=a[i]<a[m]?m:i:0;);
	printf("%d",m-2);
}

95B
これは996までしかチェックしていないので997や998が答えになるときWAになる

yukicoder No.701 ひとりしりとり

問題はこちら
No.701 ひとりしりとり - yukicoder

まずn個の相異なる文字列を生成しよう。これは前にやった。
yukicoder No.327 アルファベット列 - メモ
こうしてできた文字列の前後に'a'を付け、最後の単語にはさらに'n'をつければよい

//No327の使い回し
void f(int n){
	~n?f(n/26-1),putchar(97+n%26):0;
}
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		printf("a");
		f(i);
		printf("a%c",i==n-1?'n':' ');
	}
}

ループを逆にまわして変数を省略、関数化せずにループする、2回あるprintfをまとめる

x;
main(n){
	for(scanf("%d",&n);x=--n;)for(printf("a a");putchar(x%9+97),x/=9;);
	puts("n");
}

88B

yukicoder No.693 square1001 and Permutation 2

問題はこちら
No.693 square1001 and Permutation 2 - yukicoder

数列の順序は関係ないのでソートしてから考えて良い。
1から順に作ることを考えると、小さい方から順に使うのが最適であることがわかるので、Σ|a[i]-i|が解

#define swap(p,q)(p^=q^=p^=q)
int a[99];
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d",a+i);
	for(int i=0;i<n;i++)for(int j=1;j<n;j++)if(a[j-1]>a[j])swap(a[j-1],a[j]);
	int s=0;
	for(int i=0;i<n;i++)s+=abs(a[i]-(i+1));
	printf("%d",s);
}

バケツソートを使うかバブルソートを使うかは悩みどころだが、バケツソートの方が短くなりそうな気がしたのでそれで実装
バブルソートの方は試してない

これを

a[99];
n,t,s,i,k;
int main(){
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&t);
		a[t]++;
	}
	for(int i=0;i<n;i++){
		while(a[k]==0)k++;
		s+=abs(k-(i+1));
		--a[k];
	}
	printf("%d",s);
}

こうじゃ

a[99],i,s;
main(k){
	for(;~scanf("%d",a)?++a[*a]:a[k]--?s+=abs(k-++i),1:++k<60;);
	printf("%d",s-1);
}

nもまとめて読み込んで、ループをn回ではなく十分大きな定数回実行している。このため答えが1ずれるので引いている。
入力の読み込みにa[0]を使うことで一時変数を削減している。(+1B-2Bで1B削減)
96B

yukicoder No.692 square1001 and Permutation 1

問題はこちら
No.692 square1001 and Permutation 1 - yukicoder

n=1かどうか判定するだけ

値を1つ見ればよいのでgets+atoiやるだけ

a;main(){puts(atoi(gets(&a)-1)?"Petr":"square1001");}

……と思ったら、scanfを使う方が短くなるらしい。
未定義動作だから何が起きてもいいとはいえ、値の評価順序はいったいどうなってるんだ……

main(n){puts(n-scanf("%d",&n)?"Petr":"square1001");}

52B