三角数の約数(3)
30分プログラム、その273。三角数の約数 via Project Euler、その3。
まだ解けない。同じマシンで動かしているのに別のErlangノードと通信できない。他のマシンだと、同じ方法でできるのになぁ。
できるマシンでしばらく動かしてみたけれど、解ける気配がしない。やっぱり、力技じゃあ無理かもしれない。
使い方
1> problem12:start(). ...
ソースコード
-module(problem12). -export([start/0,run/4]). divisor_count(N)-> length(lists:filter(fun(X)-> N rem X =:= 0 end, lists:seq(1,N))). tri(N) -> N*(N+1) div 2. loop(Pid,Target,N,Step)-> receive M when M < N -> Pid ! {self(),M} after 0-> % io:format("I'm check ~p~n",[N]), case divisor_count(tri(N)) >= Target of true -> Pid ! {self(),N}; _ -> loop(Pid,Target,N+Step,Step) end end. run(S,Target,Start,Step) -> spawn(fun()->loop(S,Target,Start,Step) end). wait_for_response([],R)->R; wait_for_response(L,R)-> receive {Pid,N} -> io:format("~p~n",[N]), L2 = lists:delete(Pid,L), lists:foreach(fun (X) -> X ! N end,L2), wait_for_response(L2,[N|R]) end. connect(Host)-> net_adm:ping(Host), {Mod,Bin,Filename} = code:get_object_code(problem12), rpc:call(Host,code,load_binary,[Mod,Filename,Bin]). start()-> connect(alice@localhot), S = self(), Target = 501, P1 = run(S,Target,2,3), P2 = rpc:call(alice@localhot,problem12,run,[S,Target,3,3]), P3 = run(S,Target,4,3), lists:min(wait_for_response([P1,P2,P3],[])).