Consejos sobre la tarea m6_t3

La tarea m6_t3 para ambas modalidades del hackathon es la siguiente:

En esta tarea se nos pide recoger una cantidad de tuercas igual al área del cuadrado cuyo lado nos dice Tor, e implícitamente, salir por la puerta de salida de abajo.

Roby gasta energía cada vez que da un paso, por lo que debemos pensar en ser eficientes.

Si observamos el mapa, Tor solo nos puede decir cuadrados de lado 2, 3, 4 y 5, y sabemos que el área de un cuadrado es lado * lado, y es ese área el número de tuercas que debemos recoger.

Hay varias formas de abordar el problema, una posibilidad es hacer que Roby recoja tuercas fila por fila, intentando realizar el menor numero de pasos hasta conseguir las N tuercas, pero podría no ser la estrategia correcta.

Una forma eficiente es realizar movimientos en espiral, es decir, recoger cuadrados de menor área a mayor área empezando desde la posición de Tor. Para ello debemos usar el concepto de contador para manejar el numero de movimientos que realizamos en cada dirección, por ejemplo:

// Implementación en TS
// Suponiendo que estamos en la posición de Tor
lado = info
right // Recogemos la primera tuerca
cont = 0

repeat lado // Lado es el nº de cuadrados que tenemos que recoger
  repeat cont // Movimiento hacia la derecha
    right
  end
  repeat cont // Movimiento hacia abajo
    down
  end
  repeat cont // Movimiento hacia la izquierda
    left
  end
  repeat cont // Movimiento hacia arriba
   up
  end
  cont = cont + 1 // Avanzamos el contador
end
// Implementación en JS
// Suponiendo que estamos en la posición de Tor
lado = info();
right(); // Recogemos la primera tuerca
cont = 0 // Declaramos una variable contador para los movimientos

for(i = 0; i < lado; i++){ // Lado es el nº de cuadrados que tenemos que recoger
  for(j = 0; j < cont; j++){ // Movimiento hacia la derecha
    right();
  }
  for(j = 0; j < cont; j++){ // Movimiento hacia abajo
    down();
  }
  for(j = 0; j < cont; j++){ // Movimiento hacia la izquierda
    left();
  }
  for(j = 0; j < cont; j++){ // Movimiento hacia arriba
    up();
  }
  cont = cont + 1; // Avanzamos en 1 el contador
}

Con esta implementación, si iteramos los bucles, podemos ver el siguiente comportamiento:

Si Tor nos dice 2, lado = 2, por lo que Roby solo dará 1 paso en cada bucle de movimiento, ya que solo se realizará 1 iteración en el bucle más externo, por lo que
recogerá 4 tuercas, la inicial + 3 del resto de movimientos

Si Tor nos dice 3, lado = 3, por lo que Roby dará 2 pasos en cada dirección, pues
se realizan 2 iteraciones del bucle más externo. En este caso Roby recogerá la tuerca
inicial, + 3 de la primera iteración + 5 de la segunda iteración, recogiendo las 9 tuercas.

Y así sucesivamente, por lo que al terminar, ya solo quedaría que Roby saliese por la puerta de abajo.

Con estos consejos, podéis resolver esta tarea con toda seguridad :wink:.