[erlang-questions] code sample request

黃耀賢 (Yau-Hsien Huang) <>
Mon Jan 18 19:00:22 CET 2010


And my solution:

*** The Code

-export([round_nodes/3]).

round_nodes(M, N, Msg) ->
    Pids = get_nodes(M, [N, Msg]),
    [P|Ps] = Pids,
    Pids1 = lists:append(Ps, [P]),
    Pids2 = lists:zip(Pids, Pids1),
    [ S ! T || {S, T} <- Pids2 ].

get_nodes(0, _Args) ->
    [];
get_nodes(N, [Times, Msg]) ->
    P = spawn(test, node, [Times, Msg]),
    Ps = get_nodes(N-1, [Times, Msg]),
    [P|Ps].

node(N, Msg) ->
    Pid = target_node(),
    traffic(N, self(), Pid, Msg).

target_node() ->
    receive
    Pid -> Pid
    end.

traffic(0, _Pid1, _Pid2, _Msg) ->
    true;
traffic(N, Pid1, Pid2, Msg) ->
    Pid2 ! {Pid1, Msg},
    receive
        {Pid, Msg1} when Pid /= Pid2 ->
            Pid ! {Pid1, {Msg1, ok}}
    end,
    receive
        {Pid2, Response} ->
            error_logger:info_msg("~w reveived \"~w\" from ~w.~n",
                                  [self(), Response, Pid2])
    end,
    traffic(N-1, Pid1, Pid2, Msg).

*** Execution

> test:round_nodes(3, 2, "HELLO").

=INFO REPORT==== 19-Jan-2010::01:58:54 ===
<0.35.0> reveived "{[72,69,76,76,79],ok}" from <0.36.0>.

=INFO REPORT==== 19-Jan-2010::01:58:54 ===
<0.36.0> reveived "{[72,69,76,76,79],ok}" from <0.37.0>.
[<0.36.0>,<0.37.0>,<0.35.0>]

=INFO REPORT==== 19-Jan-2010::01:58:54 ===
<0.37.0> reveived "{[72,69,76,76,79],ok}" from <0.35.0>.

=INFO REPORT==== 19-Jan-2010::01:58:54 ===
<0.35.0> reveived "{[72,69,76,76,79],ok}" from <0.36.0>.
3>
=INFO REPORT==== 19-Jan-2010::01:58:54 ===
<0.36.0> reveived "{[72,69,76,76,79],ok}" from <0.37.0>.

=INFO REPORT==== 19-Jan-2010::01:58:54 ===
<0.37.0> reveived "{[72,69,76,76,79],ok}" from <0.35.0>.


On Tue, Jan 19, 2010 at 12:45 AM, Wallentin Dahlberg <
> wrote:

> Another one,
>
> -module(ring).
> -export([run/2, run/3]).
>
> run(N, M) -> run(N, M, msg).
> run(N, M, Msg) -> run(N - 1, M, Msg, self()).
>
> run(0, 0, _, _) -> ok;
> run(0, M, Msg, Pid) ->
>    Pid ! {self(), Msg},
>    receive {_From, Msg} -> run(0, M - 1, Msg, Pid) end;
> run(N, M, Msg, Pid) -> run(N - 1, M, Msg, spawn_link(fun() -> loop(Pid)
> end)).
>
> loop(To) ->
>    receive
>        {From, Msg} ->
>            io:format("~p -> (Me:~p) -> ~p~n", [From, self(), To]),
>            To ! {self(), Msg},
>            loop(To)
>    end.
>
>
> Beware of typos and other confusing errors. =)
>
> // egil
>
> 2010/1/18 Fred Hebert <>
>
> > On Mon, Jan 18, 2010 at 10:26 AM, Ish Rattan <
> > >wrote:
> >
> > >
> > > I am trying to write the code for
> > > "Create N processes in a ring. Send a message
> > > around the ring M times so that a total of N*M
> > > messages get sent." problem from Armstrong's book.
> > >
> > > A solution code wiil be appreciated.
> > >
> > > -ishwar
> > >
> > >
> > > ________________________________________________________________
> > > erlang-questions mailing list. See http://www.erlang.org/faq.html
> > > erlang-questions (at) erlang.org
> > >
> > > See
> >
> >
> http://shootout.alioth.debian.org/u64/benchmark.php?test=threadring&lang=hipe&id=1for
> > a common efficient implementation.
> >
>


More information about the erlang-questions mailing list