Gray code履歴

どうも、51b です。anarchy golf - Gray codeが回答公開になったので、履歴を公開します。
hinoe さんがトップだったので、main 再帰だろうと推測して main 再帰にしてみた。あと、2 進数を表示するのにループを書くのが面倒だったので、8 進数を使うことにした。 111 byte から始めて 109 byte まで。

m,l;main(n){~scanf("%d",&n)&&printf("Gray code  n=%d",l=n);n--?main(n),m^=1<<3*n,main(n):printf("\n%0*o",l,m);}
m,l,s;main(n){gets(&s)&&printf("Gray code  n=%d",l=n=s%8);n--?main(n),m^=1<<3*n,main(n):printf("\n%0*o",l,m);}
m,l;main(n){l||printf("Gray code  n=%d",l=n=getchar()%8);n--?main(n),m^=1<<3*n,main(n):printf("\n%0*o",l,m);}

n&-n で 1 になっている最下位ビットだけを得る、という技は numof 1 bits in 0 to 255 で使っていたのだけど、Gray code にピッタリ合う事に気づいて使ってみた。num of bits で main 再帰に負けた仇を討ち(?) 105 byte。ちょっといじって 103 byte。

l,m,t;main(n){for(printf("Gray code  n=%d",n=getchar()%8);m++<1<<n;t=m&-m,l^=t*t*t)printf("\n%0*o",n,l);}
m,l,t;main(n){for(printf("Gray code  n=%d",n=getchar()%8);m<1<<n;printf("\n%0*o",n,l^=t*t*t))t=m&-m++;}

105 byte 書いた後でようやく wikipedia に n^n>>1 と書いてあることに気づいた。PostScript と D と Erlang が縮んだものの C は縮まず。
printf を一つにまとめて 99 byte。ちょこちょこいじって 97 byte。

m,l,t;main(n){for(n=getchar()%8;printf(m?"\n%0*o":"Gray code  n=%d",n,l),m<1<<n;l^=t*t*t)t=m&-m++;}
m,l,t;main(n){for(n=getchar()%8;printf(m?"\n%0*o":"Gray code  n=%d",n,l^=t*t*t),m<1<<n;)t=m&-m++;}
m,l,t;main(n){for(n=getchar()%8;t<1<<n;t=m&-m++)printf(m?"\n%0*o":"Gray code  n=%d",n,l^=t*t*t);}

帰り道で「入力を gets に変えたらちょっと縮むな」とか考えていたら、kikx さんが 95 byte 出していた。慌てて追いかけて 96 byte と 95 byte。

m,l,t;main(n){for(gets(&n);t<1<<n%8;t=m&-m++)printf(m?"\n%0*o":"Gray code  n=%d",n%8,l^=t*t*t);}
m,l,t;main(n){for(gets(&n);t<1<<n;t=m&-m++)printf(m?"\n%0*o":"Gray code  n=%d",n%=8,l^=t*t*t);}

ループ 1 回目の t<1<<n は 32 ビット以上左シフトしていて、これは未定義だか不定だかになるのだが、運良く通ってしまった。t>>n<1 なら OK と思ったが、これも未定義らしい。
その後 *yuko* さんが 90 バイト。これは運任せかなと思ったが、運任せな方法でも 92 byte までしか思いつかなかった上に確率が低いので諦めた。

m,l,t;main(x,n){for(n=-n%9;t>>n<1;t=m&-m++)printf(m?"\n%0*o":"Gray code  n=%d",n,l^=t*t*t);}