Sha256: fa2c0240bc59d012549313afab5096b6bb010db386169ef8bee3f4241c960642

Contents?: true

Size: 1.81 KB

Versions: 84

Compression:

Stored size: 1.81 KB

Contents

-module( robot_simulator ).

-export( [advance/1, control/2, create/0, direction/1, left/1, place/3, position/1, right/1] ).

advance( Robot ) -> Robot ! advance.

control( Robot, String ) ->
  Funs = lists:flatten( [control_function(X) || X <- String] ),
  [X(Robot) || X <- Funs].

create() -> erlang:spawn( fun() -> loop( undefined, {undefined, undefined} ) end ).

left( Robot ) -> Robot ! {turn, left}.

direction( Robot ) -> request( Robot, direction ).

place( Robot, Direction, Position ) -> Robot ! {place, Direction, Position}.

position( Robot ) -> request( Robot, position ).

right( Robot ) -> Robot ! {turn, right}.



control_function( $A ) -> fun advance/1;
control_function( $L ) -> fun left/1;
control_function( $R ) -> fun right/1;
control_function( _C ) -> [].

loop( Direction, Position ) ->
  receive
    advance ->
      loop( Direction, new_position(Direction, Position) );
    {direction, Pid} ->
      Pid ! {direction, Direction},
      loop( Direction, Position );
    {turn, Turn} ->
      loop( new_direction(Direction, Turn), Position );
    {place, New_direction, New_position} ->
      loop( New_direction, New_position );
    {position, Pid} ->
      Pid ! {position, Position},
      loop( Direction, Position )
  end.

new_direction( north, right ) -> east;
new_direction( south, right ) -> west;
new_direction( east, right ) -> south;
new_direction( west, right ) -> north;
new_direction( north, left ) -> west;
new_direction( south, left ) -> east;
new_direction( east, left ) -> north;
new_direction( west, left ) -> south.

new_position( north, {X, Y} ) -> {X, Y + 1};
new_position( south, {X, Y} ) -> {X, Y - 1};
new_position( east, {X, Y} ) -> {X + 1, Y};
new_position( west, {X, Y} ) -> {X - 1, Y}.

request( Robot, Request ) ->
  Robot ! {Request, erlang:self()},
  receive
    {Request, Answer} -> Answer
  end.

Version data entries

84 entries across 84 versions & 1 rubygems

Version Path
trackler-2.0.6.28 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.27 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.26 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.25 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.24 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.23 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.22 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.21 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.20 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.19 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.18 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.17 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.16 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.15 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.14 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.13 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.12 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.11 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.10 tracks/erlang/exercises/robot-simulator/example.erl
trackler-2.0.6.9 tracks/erlang/exercises/robot-simulator/example.erl