UTF-9への道のりと教訓

anarchy golfでやっているショートコーディングのお題のUTF-9でようやくC言語でトップが取れたのでその道のりを公開。
かなり69バイトをさまよっていますwww

ポイント

変数iで連結したビット数をカウント
0の場合は次の1バイトを連結しても出力はできないので、
出力条件は"!i"のみで行える。

成果物(68バイト)

結局三項演算子の順序の問題でした。

c,i;main(x){for(;~scanf("%x",&x);!i--?i=8:putchar(c>>=9))c|=x<<i+9;}

教訓

三項演算子で代入文を使いたい場合は、条件を否定してでも2項目で代入すべし!

要するに

a?b:(c=1);

をやりたくば、条件を否定して

!a?c=1:b;

とするだけで、1バイト削れる!

迷い道(全て69バイト・・・)

c,i;main(x){
	for(;~scanf("%x",&x);i--?putchar(c),c>>=9:(i=8))c|=x<<i;
}
c,i;main(x){
	for(;~scanf("%x",&x);i--?putchar(c>>=9):(i=8))c|=x<<i+9;
}
c,i;main(x){
	for(;~scanf("%x",&x);i+=i?putchar(c),c>>=9,-1:8)c|=x<<i;
}
c,i;main(x){
	for(;~scanf("%x",&x);i+=i?putchar(c>>=9),-1:8)c|=x<<i+9;
}
c,i;main(x){
	for(;~scanf("%x",&x);i-=i?putchar(c>>=9),1:-8)c|=x<<i+9;
}
c,i;main(x){
	for(;~scanf("%x",&x);i=i?putchar(c),c>>=9,i-1:8)c|=x<<i;
}
c,i;main(x){
	for(;~scanf("%x",&x);i=i?putchar(c>>=9),i-1:8)c|=x<<i+9;
}
c,i;main(x){
	for(;~scanf("%x",&x);i--?putchar(c>>=9):(i=8))c|=x<<i+9;
}

最大の迷い道(main再帰www)

main再帰というのは普通にプログラム組んでいる人にとってはパラレルワールド位別世界で考えられないことだろう。。。

c,i;main(x){
	~scanf("%x",&x)?c|=x<<i+9,i=i?putchar(c>>=9),i-1:8,main(x):0;
}
c,i;main(x){
	~scanf("%x",&x)?c|=x<<i+9,!i--?i=8:putchar(c>>=9),main(x):0;
}