メモ

yukicoderでゆるふわgolf

yukicoder No.656 ゴルフ

問題はこちら
No.656 ゴルフ - yukicoder

やるだけ

int main(){
	int s=0;
	for(int i=0;i<9;i++){
		int c=getchar()-48;
		if(c==0)s+=10;
		else s+=c;
	}
	printf("%d",s);
}

1文字ずつ見るタイプの問題は、getcharとreadどちらを使うか、最後の改行をどうするか、といったことを考える必要がある。
とりあえずgetchar()-48?:10 という方法をすぐ思いつくが、実はもっと短い方法がある。
'0'が'9'より大きくなって欲しいので、49で剰余をとればよい。このとき'1'~'9'は0~8になるので、'0'は9になってほしい。なのでさらに39で剰余をとる。
これらを合計すると答えより9小さい値が出てくるが、'\n'の10が足されるので答えより1大きくなる。よって正負を反転させてbit反転すればよい。

s;main(i){for(;i=getchar()-10;)s+=i-38?:10;printf("%d",s);}
s;main(i){for(;i=~getchar();)s-=i%50%40;printf("%d",s-2);}
s;main(i){for(;read(0,&i,1);)s-=i%49%39;printf("%d",~s);}

57B