291. Ghost leg solver

s;main(){char*p=s,*q=s;for(;*p++||puts(gets(q)?:p,p=s)**q;)*++q-45||(*p^=p[2]^=*p^=p[2]);}


絶対これ以上縮まないというわけではないけど簡単には縮まなさそうなのでこの辺で解説を。
出力に悩まされていたんだけど、inaniwaさんのコードを見てなるほどなーと。
行の間に0x00を入れておくというのは思いつかなかったな。
で、それを踏まえて書き直したら14バイトも縮まった。
ポインタをここまで技巧的に使ったのは初めてかもしれない。
pとqをローカル変数にしているのはsの要素数を省略するため。


あとはさらに縮められそうな点をメモ。
・pの初期化は消したい。途中でp=sがあるんだから無駄になってる。
・**qはなんか縮めれそうな気配があるのだが。
・*q-45も微妙。なにか別の方法があってもおかしくない。
・*p^=p[2]^=*p^=p[2]をカッコでくくっているのも気持ち悪い。*q==45?*p^=p[2]^=*p^=p[2]:…みたいにできないか?