naiの日記

ソフトウェアエンジニアから放射線科診断医にジョブチェンジしました。趣味のことを書きます。

307. Wrap Words FIXED

終了しました。

94Bの解。

char*p;main(n,s){for(n=atoi(gets(s));gets(p=s);puts())for(;p<index(s,0);)p+=*p<33?*p=10,n:-1;}
  • forの中でgetsを毎回読み込んでいるのに、nを求めるためだけに最初にgetsを読んでいるのはもったいない。できれば共通化したい。
  • for2つを1つにまとめたい。

ということで、試行錯誤を重ねてできたのが90Bの解です。本質的な差異はindexの第二引数のみ。


indexは第一引数に指定した文字列から第二引数の文字を検索し、見つからなければNULLを返します。
最初はn==0なので、!0、すなわち1を検索します。文字コード1の文字というのはどこにもないのでindexはNULL(==0)を返し、pと比較すれば不等式は必ず不成立。
つまり、nが初期化されるまでの処理を飛ばすことができるというわけ。
nが初期化されると、上記の不等式はpと文字列sの終端との比較となるので、そのまま終了判定に使えます。


ehangcでも使いましたが、indexと否定の!演算子との相性はいいですね。
文字列の終端かNULLが返ってくるのは便利です。