2007/06/19

Erlang サンタクロース問題

サンタクロース問題
43行ではないけど、Erlang で。
なんだか random が怪しい?
after 0 でトナカイを優先しないといけなかったですね。


-module(santa).
-compile(export_all).

-record(stat, {'こびと'=[], 'トナカイ'=[]}).

start() ->
register('サンタ', spawn_link(?MODULE, 'サンタ', [#stat{}])),
lists:foreach(fun(N) -> spawn_link(?MODULE, 'こびと_init', [N]) end,
lists:seq(1, 10)),
lists:foreach(fun(N) -> spawn_link(?MODULE, 'トナカイ_init', [N]) end,
lists:seq(1, 9)).

'サンタ'(#stat{'トナカイ'=X}=Stat) when length(X) == 9 ->
'サンタ働く'("おもちゃくばり", X),
'サンタ寝てる'(Stat#stat{'トナカイ'=[]});
'サンタ'(#stat{'こびと'=X}=Stat) when length(X) == 3 ->
'サンタ働く'("おもちゃ会議", X),
'サンタ寝てる'(Stat#stat{'こびと'=[]});
'サンタ'(Stat) ->
'サンタ寝てる'(Stat).

'サンタ働く'(What, Who) ->
io:format("~s開始...", [What]),
sleep(10),
io:format("終了。~n"),
lists:foreach(fun(A) -> A ! 'おつかれさま。' end, Who).

'サンタ寝てる'(Stat) ->
receive
{'トナカイ', N, X} ->
io:format("トナカイ~bが来た。~n", [N]),
'サンタ'(Stat#stat{'トナカイ'=[X|Stat#stat.'トナカイ']})
after 0 ->
receive
{'こびと', N, X} ->
io:format("こびと~bが来た。~n", [N]),
'サンタ'(Stat#stat{'こびと'=[X|Stat#stat.'こびと']})
end
end.

'こびと_init'(N) ->
random:seed(N, N*N, N*N*N*N),
'こびと'(N).

'こびと'(N) ->
sleep(30),
'サンタ' ! {'こびと', N, self()},
receive
'おつかれさま。' ->
'こびと'(N)
end.

'トナカイ_init'(N) ->
random:seed(N*N*N, N*N*N, N),
'トナカイ'(N).
'トナカイ'(N) ->
sleep(30),
'サンタ' ! {'トナカイ', N, self()},
receive
'おつかれさま。' ->
'トナカイ'(N)
end.

sleep(N) ->
X = random:uniform(N),
timer:sleep(X*1000).

0 件のコメント: