2014年8月22日金曜日

クイックソートを書く

Haskellのクイックソートが5行で書ける問題、結局あのコードってIn Placeで無かったり、Pivotingをしてなかったりするわけで、その部分が他の言語と比べて効率悪いとか言われたりするわけだけども、中には「Haskellでメモリとか効率気にしなくてもいいやろ」っていう人も居るわけで。
そんなんだったらD言語でもクイックソート短く書けるわっ。と思ったので、

import std.stdio, std.algorithm, std.array;
void main()
{
[23, 1, 64, 131, 76, 5].qsort.writeln;
}
int[] qsort(int[] arr) {
return arr.length ? arr[1 .. $].filter!(x => x < arr[0]).array.qsort ~ arr[0] ~ arr[1 .. $].filter!(x => x >= arr[0]).array.qsort : [];
}
view raw quicksort.d hosted with ❤ by GitHub


実装はこんな感じで、Haskellで5行で書いたクイックソートと同じやり方で書いた。
Dは一行にいくつも文を書ける言語なので、どんな長いコードでも1行と主張することはできるけど、このコードは1文だし明らかに3行で書けてる。
まぁHaskellはこういうリスト周りの表現とか言語に揃ってるので、簡潔さで言えば負けてる部分はあるけども。

2014年8月13日水曜日

グラフ関係のコードいくつか

ようやく大学が夏季休業に入ったので、学校で使った離散数学の本読んでグラフ理論とオートマトンの勉強をしている。
グラフ理論の部分で出てきたアルゴリズムとかでコード書いたのでいくつか。