depth
古いソースを見ていたら depth を deapth と綴っていて学力低下だなあと思いました。
前提知識。
qsort はC言語の「ちょっぱやで並び替える関数」。関数っていうのは入力があって出力があるものね。qsort(トランプ一組, 52枚, カードの順番を決める関数) とやると、小さい順に綺麗に並べられたトランプがでてくる。カードの順番を決める関数っていうのは、例えば、大貧民順とかホイスト系の順とか辞書順とか色々あるわけですよ。で、順番を決める関数はカードを二枚とって、先に入ったほうがが大きいか小さいか同じかを、正の数、負の数、0 を出すことでその順に並べようとするの。
なんで qsort っていうと quicksort というアルゴリズムから名前を取っているんだけど、それはISBN:4001152665「山の背くらべ」あたりに譲りますね。これ絵本です。
C言語で qsort 使ってて用意されている cmp とは逆順で並べたい。あるいは、cmp0 が 0 を返したら cmp1 で判定して…、みたいなことがしたい。少しだったらいいけれども、比較関数は10以上ある。
Haskell だったら lambda が簡単に作れるから、はじめのほうは
curry$(0-).uncurry cmp
とか
(\cmp x y ->(0-) (cmp x y))
でいいし、なんか、後のほうは中値演算子 (%%)でも定義してやって
(%%) f g a b = if f a b == 0 then g a b else f a b
とでもすれば、f %% g %% h で順次評価してくれそう。
でまあ、一応 better C としての C++ ではあったので http://www.kmonos.net/alang/boost/classes/lambda.html を使ってもいいのだけれども、 curry化されていないし、http://nicosia.is.s.u-tokyo.ac.jp/pub/essay/hagiya/h/curry なんとなく移植性が損なわれるようで嫌だ、と、ごにょごにょやってたら lex ではないけれども文字列を解釈するものを作ってしまい、なるほど、難問でなくても、
ということが分かった。
それで、ここに晒そうかと思ったが、ライセンスが public license に汚染*1されていることに気がついたので中止。
あ、でもC言語いいよ。このCPUが必死になって作業している様がよく伝わってきて。高速化楽しいし。
う〜む。適当すぎる。
*1:いや、悪い意味はないけど。というかそのために書いたのだけどさ