R13B来てないか確認ついでに古いportをアップデート。
そのコンパイル待ちの暇つぶしにbogosort書いてみた。
-module(bogosort). -export([acc/1]). acc(L) -> bogo(L). %% %% internal functions %% acc_([])-> []; acc_([H|T]) -> acc_(T,H). acc_([],_)-> true; acc_([H|T],P) when H>=P -> acc_(T,H); acc_(_,_) -> false. r([],R) -> R; r(L,SoFar) -> N=random:uniform(length(L))-1, {Rest,[H|T]}=lists:split(N,L), r(Rest++T,[H|SoFar]). bogo(L) -> L_=r(L,[]), case acc_(L_) of true -> L_; false -> bogo(L) end.
まぁ、頭が悪いのはいつもの事。
ついでだから、並列化。
-export([acc_s/1, acc_s/2]). acc_s(L) -> acc_s(L,20). acc_s(L,N) when is_list(L), is_integer(N)-> acc_s(L,N,[]). acc_s(_,0,Cs) -> receive {_P,finish,Res} -> lists:map(fun(C)-> exit(C,normal), receive {C,finish,_} -> ok after 0 -> ok end end, Cs), Res end; acc_s(L,N,Cs) -> S=self(), C=spawn(fun()->S!{self(),finish,acc(L)}end), acc_s(L,N-1,[C|Cs]).
supervisor使うと大仰な気がするので適当にプロセスを生成。
どこかで見つかったら、作ったプロセスを全て殺し、それらからのメッセージを破棄して終了。
…bogosortじゃなくてbozosortにして、入れ替え一回ごとに子プロセス作っていった方が面白かったかな?