てきとう

てきとう

bogosort

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にして、入れ替え一回ごとに子プロセス作っていった方が面白かったかな?