# data[].attributes.body
Existen 2 robots limpiadores, 2 robots decoradores y un robot juez.
Cada robot limpiador tiene 10 esquinas donde juntar todas las flores (obtenidas con coordenadas al azar), dentro de un área delimitada. Luego de procesar todas las esquinas, cada limpiador debe depositar todo lo recolectado en la esquina (1,50) y comunicar al juez cuántas flores recolectó.

Cuando el robot juez recibe las cantidades de los limpiadores, informa el total de flores y avisa a los robots decoradores, que pueden comenzar a decorar la avenida 100. Para hacerlo, cada robot decorador tomará una flor de la esquina (1,50) y la llevará a una esquina al azar de la avenida mencionada, y dejará a lo sumo un papel en dicha esquina. Los robots decoradores finalizan cuando no existen más flores disponibles en la esquina (1,50).

Notas:
El robot juez inicia en la esquina (1,1)
El robot limpiador 1 inicia en la esquina (6,4)
El robot limpiador 2 inicia en la esquina (8,4)
El robot decorador 3 inicia en la esquina (10,4)
El robot decorador 4 inicia en la esquina (12,4)
El área delimitada va desde la esquina (5,5) hasta (50,30)

# data[].attributes.body
En un principio analizamos las áreas para cada tipo de robot. Además de las áreas privadas donde a cada uno le corresponde iniciar, declaramos un área compartida desde (5,5) hasta (50, 30) ya que para maximizar la concurrencia debemos permitir a los robot limpiadores entrar en conjunto, por eso descartamos el área parcialmente compartida.
Luego, para la esquina en donde van a depositar las flores, declaramos un área parcialmente compartida ya que para depositar tanto como para recogerlas, irán de a uno bloqueando y liberando la esquina.
Finalmente, para el área donde los robot decoradores deben depositar las flores, sí declaramos un área parcialmente compartida ya que como van de a uno a recoger las flores depositadas por los limpiadores, también irán a decorar de a uno.

Para la ejecución implementamos que cada robot limpiador le de un valor random a la esquina donde irá a recolectar, ya que así lo interpretamos del enunciado. Antes de salir a recolectar, se guardará el numero de la avenida y de la calle en donde se encuentran actualmente para, al finalizar la recolección, retornar a su lugar de inicio.
Previo al moverse de ubicación, se bloquea la esquina donde cada robot va a ir, luego de posicionarse recolectan todas las flores que se encuentran allí y finalmente vuelven a su posición, para luego liberar la esquina ya que puede estar solicitada por el otro robot limpiador.
Para dichas acciones implementamos un ''repetir 10'' ya que cada robot debe limpiar 10 esquinas. Luego de esto, se ingresa al proceso ''depositar'' en donde se depositan todas las flores recolectadas (únicamente éstas por la precondición que establecimos).  Finalmente se manda al jefe la cantidad que cada uno recolectó.
El jefe espera a recibir estas cantidades para luego totalizarlas e informarlas. Se inicia la variable ''hay'' en verdadero y luego envía al robot decorador ''r3'' la orden para empezar a decorar. La posibilidad de que la cantidad recolectada sea de 0, o que simplemente en un momento no queden más por recolectar, nos lleva a escribir un código en el que se envían y reciben mensajes entre el jefe, r3 y r4, para que una vez que esto pase, al robot que le toque ir a recolectar una flor para luego decorar, no se encuentre nuevamente con la esquina vacía. Por comunicación sincrónica, estos no arrancarán a decorar hasta que el jefe les envíe la orden, así como el jefe no les enviará la orden hasta informar la cantidad recolectada por los limpiadores.
Al recibir en una variable boolean la orden, los decoradores comenzarán a ir de a uno hacia la esquina (1, 50) para recoger la flor (con los bloqueos y liberaciones de esquina correspondientes). Si hay flor, se carga en la variable ca2 un valor random del 1 al 100,  para posicionarse siempre en la avenida 100 pero en calles aleatorias. Mientras tanto le envía un mensaje al jefe del estado de la esquina. Esto evita que el siguiente robot tenga que ir de no haber más flores en la esquina, ya que en el código principal del decorador se espera ese mensaje para continuar o no.
Luego de notificar el estado de la esquina, se posiciona en la calle que le tocó y deposita solo una flor, como pide el enunciado. Finalmente vuelven a su posición y seguirán repitiendo el procedimiento hasta que la esquina quede vacía.
Por lo tanto, podemos decir que desarrollamos una solución acorde al enunciado, maximizando la concurrencia y evitando colisiones lo mejor posible.

# data[].attributes.body
Bortolin Gómez, Ettore José
Vilchez, María de los Milagros

# data[].attributes.body
No apareció en la grabación video anterior, pero sí en su ejecución

# data[].attributes.body
programa TP_promocion
procesos
  proceso recolectar
  comenzar
    mientras HayFlorEnLaEsquina
      tomarFlor
  fin
  proceso depositar(E av: numero; E ca: numero)
  variables
    cant: numero
  comenzar
    cant := 0
    BloquearEsquina(1,50)
    Pos(1,50)
    mientras HayFlorEnLaBolsa
      depositarFlor
      cant := cant + 1
    EnviarMensaje(cant,j)
    Pos(av,ca)
    LiberarEsquina(1,50)
  fin
  proceso decorar(E av: numero; E ca: numero; ES hay: boolean)
  variables
    ca2: numero
  comenzar
    BloquearEsquina(1,50)
    Pos(1,50)
    si HayFlorEnLaEsquina
      tomarFlor
      si HayFlorEnLaEsquina
        EnviarMensaje(hay,j)
      sino
        hay := F
        EnviarMensaje(hay,j)
      Random(ca2,1,100)
      Pos(100,ca2)
      LiberarEsquina(1,50)
      depositarFlor
      Pos(av,ca)
  fin  

areas
  areaJ: AreaP(1,1,1,1)
  areaR: AreaPC(5,5,50,30)
  areaD: AreaPC(100,1,100,100)
  area1: AreaP(6,4,6,4)
  area2: AreaP(8,4,8,4)
  area3: AreaP(10,4,10,4)
  area4: AreaP(12,4,12,4)
  depo: AreaPC(1,50,1,50)

robots
  robot juez
  variables
    cant1: numero
    cant2: numero
    hay: boolean
  comenzar
    RecibirMensaje(cant1,*)
    RecibirMensaje(cant2,*)
    Informar(cant1 + cant2)
    hay := V
    mientras (hay)
      EnviarMensaje(hay,r3)
      RecibirMensaje(hay,r3)
      si (hay)
        EnviarMensaje(hay,r4)
        RecibirMensaje(hay,r4)
        si ~(hay)
          EnviarMensaje(hay,r3)
          EnviarMensaje(hay,r4)
      sino
        EnviarMensaje(hay,r4)
        EnviarMensaje(hay,r3)
  fin
  robot limpiador
  variables
    av2: numero
    ca2: numero
    av1: numero
    ca1: numero
  comenzar
    av2 := PosAv
    ca2 := PosCa
    repetir 10
      Random(av1,5,50)
      Random(ca1,5,30)
      Pos(av1,ca1)
      recolectar
      Pos(av2,ca2)
    depositar(av2,ca2)
  fin
  robot decorador
  variables
    av: numero
    ca: numero
    hay: boolean
  comenzar
    av := PosAv
    ca := PosCa
    RecibirMensaje(hay,j)
    mientras(hay) 
      decorar(av,ca,hay)
      RecibirMensaje(hay,j)
  fin  
  
variables
  j:juez
  r1:limpiador
  r2:limpiador
  r3:decorador
  r4:decorador
comenzar
  AsignarArea(j,areaJ)
  AsignarArea(r1,area1)
  AsignarArea(r1,areaR)
  AsignarArea(r1,depo)
  AsignarArea(r2,area2)
  AsignarArea(r2,areaR)
  AsignarArea(r2,depo)
  AsignarArea(r3,area3)
  AsignarArea(r3,areaD)
  AsignarArea(r3,depo)
  AsignarArea(r4,area4)
  AsignarArea(r4,areaD)
  AsignarArea(r4,depo)
  Iniciar(j,1,1)
  Iniciar(r1,6,4)
  Iniciar(r2,8,4)
  Iniciar(r3,10,4)
  Iniciar(r4,12,4)
fin

# data[].attributes.body
Asumimos que:
1) los robots limpiadores recogerán al menos una flor.

2) la esquina donde los robots limpiadores depositan las flores recogidas estará vacía.

3) la bolsa de cada robot se encuentra inicialmente vacía.

# data[].attributes.body
1. Las esquinas aleatorias que son limpiadas por los robots limpiadores, podrían haber sido proporcionadas por el juez.

2. Los robots decoradores podrían haber continuado su tarea con una estructura de control de repetición (repetir). Asumiendo que solo se decorará con las flores recolectadas por los limpiadores, podría haberse almacenado en una nueva variable la cantidad de flores totales recogidas (informada por el juez), entre 2, para así obtener el número de veces que cada robot tendría que ir al "depósito" para buscar una flor. En caso de que dicho valor fuera impar, se tendría que hacer un viaje extra, dicha instrucción tendría que estar implementada en el código.

3. Nuevamente, para los robots decoradores, en vez de chequear cada vez si hay una flor en la esquina o no con un booleano, podría tomarse el valor total de flores recolectadas por los limpiadores e irlo decrementando con cada vez que un robot decorador busque una flor en el depósito. Terminando el proceso cuando dicho valor llegue a 0. Esto igualmente asumiendo que solo se desea decorar con las flores recolectadas, exceptuando las que ya pudieran encontrarse, antes de la ejecución, en la esquina que funciona como depósito.