メモ

yukicoderでゆるふわgolf

yukicoder No.712 赤旗

問題はこちら
No.712 赤旗 - yukicoder

'W'の数を数えるだけ。

s;
main(c){
	scanf("%*d%*d\n");
	while(c=getchar(),~c)if(c=='W')s++;
	printf("%d",s);
}

2行目以降は'\n'(10),'R'(82),'W'(87)のいずれかしかないので&1で識別可能。1行目の読み飛ばしとうまく噛み合わせる

w,s;main(c){for(;read(0,&c,1);w=c<11?:w)s+=c&w;printf("%d",s);}

63B

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