メモ

yukicoderでゆるふわgolf

yukicoder No.661 ハローキティはりんご3個分

問題はこちら
No.661 ハローキティはりんご3個分 - yukicoder

要するにFizzBuzz

main(){
	int n;
	scanf("%d",&n);
	while(n--){
		int t;
		scanf("%d",&t);
		if(t%40==0)puts("ikisugi");
		else if(t%8==0)puts("iki");
		else if(t%10==0)puts("sugi");
		else printf("%d\n",t/3);
	}
}

No.9002 FizzBuzz(テスト用) - yukicoderへの提出をリライトしただけ

x;main(i){for(;~scanf("%d",&x);)--i&&printf(x%8?x%10?"%d":0:"iki",x/3)+puts(x%10?"":"sugi");}

93B

yukicoder No.667 Mice's Luck(ネズミ達の運)

問題はこちら
No.667 Mice's Luck(ネズミ達の運) - yukicoder

本質的には累積和の概念だと思うので★1.5よりは高級だと思うんですがどうなんでしょ

「セーフな箱があといくつ残っているか」を覚えておけば良い

main(){
	char s[1<<17];
	int n,o;
	n=strlen(gets(s));
	for(i=0;i<n;i++)if(s[i]=='o')o++;
	for(i=0;i<n;i++){
		printf("%f\n",o*100.0/(n-i));
		if(s[i]=='o')o--;
	}
}

s[i]%5で、oのとき1,xのとき0になることを使って縮める。
また、ループの終了条件をs[i]にすれば後半のループでnを破壊しても大丈夫
ループをまとめるのはうまくできなかった

n,o,i;
char s[1<<17];
main(){
	for(gets(s);s[n];o+=s[n++]%5);
	for(;s[i];o-=s[i++]%5)printf("%f\n",o*1e2/n--);
}

105B

yukicoder No.676 C0nvertPr0b1em

問題はこちら
No.676 C0nvertPr0b1em - yukicoder

指示通り実装するだけ

char s[1010];
main(){
	scanf("%s",s);
	for(int i=0;s[i];i++){
		if(s[i]=='l'||s[i]=='I')putchar('1');
		else if(s[i]=='o'||s[i]=='O')putchar('0');
		else putchar(s[i]);
	}
}

readとgetcharのどちらを使うか問題だが、今回は~getchar()の方が扱いやすい値になった。
'I'と'l'は73と108なので反転すると-74と-109。c%35+4で判別できる
'o'と'O'は79と111なので反転すると-80と-112。C%16で判別できる

main(c){for(;c=~getchar();)putchar(c%35+4?c%16?~c:48:49);}

58B

yukicoder No.682 Average

問題はこちら
No.682 Average - yukicoder

(A+B+i)/3が整数⇔A+B+iが3の倍数 を使って全探索するだけ

main(){
	int a,b;
	scanf("%d%d",&a,&b);
	int ans=0;
	for(int i=a;i<=b;i++)if((a+b+i)%3==0)ans++;
	printf("%d",ans);
}

「A≦i≦BのうちA+B+iが3の倍数になるようなiの個数」は「A+B+A以上A+B+B以下の3の倍数の個数」なので
(A+B+B)/3-(A+B+A-1)/3により求めることができる。

しかし実はさらに短い計算式が存在する。
答えがA%3,B%3,(B-A)/3のみに依存していることは容易に想像できるので、場合分けをしてみる。n=(B-A)/3とおく

A%3 B%3 答え
0 0 n+1
0 1 n
0 2 n+1
1 0 n+1
1 1 n+1
1 2 n
2 0 n
2 1 n+1
2 2 n+1

表をぐっと睨むと、答えは
(B-A)%3が1のときn、それ以外のときn+1になっていることがわかる
ということで(B-A)/3+((B-A)%3!=1)で計算できる。
この式を睨んで次のように短縮する

main(a,b){
	scanf("%d%d",&a,&b);
	printf("%d",(b-=a)/3+1-b%3%2);
}

61B