El núcleo de NEXUS
Ver en PDFEl núcleo de NEXUS

Finalmente, Karel y el equipo de NEXUS han dado con la ubicación de Glitch: la entidad se esconde en el núcleo del juego, detrás de un laberinto de seguridad. Si logran llegar hasta ella, podrán desconectarla y restaurar todos los mundos del juego antes de su lanzamiento.
Por cuestiones de seguridad, el mapa del laberinto se mantuvo secreto y nadie lo conoce. Para neutralizar a Glitch se requiere un equipo de contención, pero el servidor está a punto de colapsar y no soportará que el equipo completo esté buscando por todo el laberinto. Por ello, se decidió seguir esta estrategia:
- Karel entrará solo al laberinto y deberá buscar un camino óptimo hacia el núcleo de NEXUS. Al salir, deberá dejar pistas para que el equipo de contención pueda seguir dicho camino.
- Luego, el equipo de contención completo debe entrar al laberinto y seguir las pistas que dejó Karel para llegar directamente al núcleo y neutralizar a Glitch.
Por la naturaleza de NEXUS, cada gira-izquierda/turnleft() consume recursos. Karel debe encontrar una ruta que minimice el número de veces que el equipo de contención ejecuta esta instrucción para llegar al núcleo.
Problema
Tu solución debe implementar dos funciones independientes que se ejecutan consecutivamente sobre el mismo caso: la función reconocimiento/recognition() y la función incursión/incursion().
El mundo contiene un laberinto formado por paredes internas. Karel inicia en la posición viendo hacia el Norte. En alguna posición alcanzable del laberinto hay exactamente 1 zumbador que representa el núcleo de NEXUS, donde se encuentra Glitch.
Primera ejecución: reconocimiento/recognition()
Durante el reconocimiento, Karel puede recorrer libremente el laberinto para encontrar el núcleo. Además, lleva infinitos zumbadores en la mochila y puede dejar cualquier cantidad de montones en el mundo para comunicar instrucciones para la fase de incursión.
Al terminar la ejecución de esta función, Karel debe regresar a su posición y orientación original.


En el ejemplo, el programa de reconocimiento exploró el laberinto y dejó zumbadores de modo que quedó un montón en cada posición del camino. A partir de la posición , un montón de
zumbadores indica que hay que avanzar hacia el norte; uno de
, hacia el oeste; uno de
, hacia el sur; y uno de
, hacia el este. El montón de
zumbador representa el núcleo, donde Karel debe detenerse. Esta codificación es solo un ejemplo; puedes diseñar cualquier sistema de instrucciones.
Toma en cuenta que la posición es únicamente un ejemplo. Karel puede empezar en cualquier posición y cualquier orientación.
Segunda ejecución: incursión/incursion()
Karel inicia donde terminó luego de la ejecución de reconocimiento/recognition(). Todos los zumbadores que dejó en el laberinto se mantienen sin cambios.
El programa de incursión no conserva información interna de la ejecución anterior. La única comunicación permitida entre ambos programas es la distribución de zumbadores que quedó en el laberinto.
Durante esta ejecución, Karel no debe dejar ni recoger zumbadores y debe apagarse en la posición que contiene el zumbador original del núcleo.

Cuando Karel alcanza el núcleo, el equipo de contención desconecta el proceso malicioso. Los mapas, los rankings y el sistema de emparejamiento vuelven a funcionar.
SERVIDOR RESTAURADO — NOS VEMOS EN LA PRÓXIMA TEMPORADA.
Consideraciones
- Se garantiza que existe al menos una ruta entre la posición de inicio y el núcleo.
- El laberinto y la posición del núcleo son iguales en ambas ejecuciones.
- Karel lleva INFINITOS zumbadores en la mochila.
- La función de
incursión/incursion()tiene prohibido ejecutardeja-zumbador/putbeeper()ycoge-zumbador/pickbeeper(). - Los montones dejados en el mundo son la única forma de comunicación entre ambos programas.
Código base
Para este problema debes descargar el archivo de plantilla para el lenguaje de Karel que uses y utilizarlo como base. Debes implementar las funciones reconocimiento/recognition() e incursión/incursion() de acuerdo con lo especificado en el problema. Puedes crear nuevas funciones si las requieres, pero NO modifiques el código debajo de la línea que dice No modificar debajo de esta línea. En caso de que lo hagas, tu solución recibirá 0 puntos.
Evaluación
Este problema tiene evaluación progresiva y no contiene subtareas.
Para obtener puntos en este problema, tu solución deberá:
- Dejar a Karel en la posición y orientación de inicio al finalizar la ejecución de la función
reconocimiento/recognition(). - Dejar a Karel en la posición del núcleo al finalizar la ejecución de la función
incursión/incursion(). - No recoger ni dejar zumbadores durante la ejecución de la función
incursión/incursion(). - No modificar el código de la plantilla debajo del comentario que dice No modificar debajo de esta línea.
Si alguna de las condiciones anteriores no se cumple, tu solución obtendrá 0 puntos en ese caso.
Para cada solución exitosa se consideran las siguientes cantidades:
: número de veces que la función
incursión/incursion()ejecutagira-izquierda/turnleft();: número total de zumbadores que el programa de reconocimiento deja como instrucciones, sin contar el zumbador original del núcleo.
El puntaje aumenta cuanto menores sean y
. Las instrucciones ejecutadas y los movimientos realizados durante el reconocimiento no afectan el puntaje.
Comentarios
¿Hay plantilla de código?