naiの日記

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

379. Borderizing Texts

終了しました。
Cは最終的に155Bになりましたが、161Bのコードは以下のようなものでした。

i;char*p;main(k,s){for(p=s;printf(gets(s)?" ":!*p?p=s,"__\n| \0 |\n| \0 |\n|_\0_|"+i++*6:*p++<33?k="___\0 | \0_|_\0 "-~i/2*4:i-2?"|\0"+~i*(i?i/2+k++&1:4):"%c",*p)-2;);}

このコードで、

"|\0"+~i*(i?i/2+k++&1:4)

の部分は、直前の文字列リテラルも利用して、iとkの値によって"|"," ","_"のどれかを出力しています。


~i*(i?i/2+k++&1:4)は常に0以下なので"|\0"の\0は必要ないように思えます。
ですが、これを消してしまうと何故か後の"%c"が"|"より前に来てしまい、前の文字列にアクセスできなくなってしまいうまくいきませんでした。


文字列リテラルの配置については、ソースコードに書いてある順番にならないことも多く以前から疑問に思っていましたが、ヌル文字を挿入することで順番がまったく変わってしまうというのは驚きでした。
内部でどのような処理が行われているのか気になります。
#できるだけ4バイトずつ配置する、とか?