メモ

yukicoderでゆるふわgolf

yukicoder No.476 正しくない平均

問題はこちら
No.476 正しくない平均 - yukicoder

やるだけ
入力が全て整数なので、平均×個数=合計 となっているかどうかで調べると、小数を使わずに済む
10^9*10=10^10>2^32なので32bitでは足りない事に注意(撃墜ケースも用意されている)

int main(){
	int a,n,s,i,x;
	scanf("%d%d",&n,&a);
	s=0;
	for(i=0;i<n;i++){
		scanf("%d",&x);
		s+=x;
	}
	puts((long)n*a==s?"YES":"NO");
	return 0;
}

さて、できるだけ変数を減らすことを考えると、n,aを特別扱いせずにまとめてしまいたい。
やるべきことは n*a-(残りの和) が0かどうかを判断することなので
1回目   s=x
2回目   s*=x
3回目以降 s-=x
とすればよさそう

long s,x;
main(i){
	for(;~scanf("%d",&x);--i?~i?s-=x:(s*=x):(s=x));
	x=!puts(s?"NO":"YES");
}

最初の代入をちょっと工夫するとすこし縮む

long s,x;
main(i){
	for(;~scanf("%d",--i?&x:&s);~i?s-=x:(s*=x));
	x=!puts(s?"NO":"YES");
}

やはり3分岐が長く見える
そこでこれをどうにかまとめる方法がないか考えると
最初    s=1
1,2回目  s*=x
3回目以降 s-=x
とすれば良いことに気付く

long s=1,i;
main(x){
	for(;~scanf("%d",&x);++i<3?s*=x:(s-=x));
	i=!puts(s?"NO":"YES");
}

82B
ちなみにカッコを外してみても同じ長さになる

++i<3?s*=x:(s-=x)
s+=++i<3?~-x*s:-x

sがintでよければ、mainの第1引数にすることで初期化が省略できるので更に縮むのだけど。

ゴルフに際しては、過去にどこかでにたような問題を見たことがあったので、わりと簡単に縮めることができた


2017/07/29追記
>ちなみにカッコを外してみても同じ長さになる
いいえ
コンパイラのバージョンアップによる3Bと合わせて5B短縮

long s=1,i;
main(x){
	for(;~scanf("%d",&x);s=++i<3?s*x:s-x);
	puts(s?"NO":"YES");
}

77B