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
.
