カメヲラボ

主にプログラミングとお勉強全般について書いてます

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バイト縮めることができた!

しかしこれで満足する私ではない。さらに数バイト短縮する方法を模索し、ついに画期的な短縮法を発見したのだ。

続く