Cabric Number Problem(3)
- 惊奇的短代码(二) qsort Hack(上)
qsortについては、以前kurimuraさんがすばらしいHackを披露してくれた。
まずはそのおさらいから。
ショートコーディングにおいて、qsortを使う場合にはもはや常識となっている書き方。
p(int*a,int*b){return*a-*b;} qsort(v,n,4,p);
これ以上は無理だろうと思われてきたが、id:kurimuraさんがここから1バイト縮める方法を発見したが、コメントに埋もれてしまっているので、ここで改めて解説しておく。
関数pの引数(のアドレス)が、メモリ上に連続して配置されていると仮定すると、第一引数aのアドレス&aの次は&a+1==&bであると考えられる。つまり、関数pはこのように書き換えることが出来る。
p(int*a){return*a-**&b;}
(∵ b==*&b )
↓
p(int*a){return*a-**(&a+1);}
ここで、*(A+1)==A[1]から
p(int*a){return*a-*(&a)[1]);}
と書くことが出来るが、これでは*と&の結合が強くて()を取ることができない。そこで、
p(int*a){return*a-**(1+&a);}
のように順番を入れ替えると
p(int*a){return*a-*1[&a]);}
のように()を省略することが可能になる。これで元の関数pよりも1バイト縮めることができた!
しかしこれで満足する私ではない。さらに数バイト短縮する方法を模索し、ついに画期的な短縮法を発見したのだ。
続く