Karel y Atsa vs Warel
Ver en PDFProblema
Warel ha atrapado a Karel y Atsa, ¡oh no!
Karel sabe que Warel es orgulloso en sus acertijos, así que Karel le propusó lo siguiente:
"Danos un acertijo, y si Atsa y yo lo resolvemos, nos dejas libres"
Warel aceptó y les dejó el siguiente acertijo:
A Karel le daré un número secreto entre
y
, Karel deberá dejar en el mundo montones de a lo más 1 zumbador.
Luego Atsa debe ver el mundo y con solo el mundo, determinar el número secreto.
Plantilla
Para este problema deberás implementar dos funciones, una llamada Karel que recibe un parámetro y otra función llamada
Atsa que debe regresar . Además, tu código deberá seguir una de las plantillas especificadas abajo, nota que las plantillas tienen una zona de código que de la cual tu no podrás modificar nada. Además, queda estrictamente prohíbido que tú codigo llame a la función
apagate/turnoff o a las funciones creadas en las plantillas. Puedes encontrar las plantillas al final del problema.
Para usar la plantilla, Karel debe iniciar en orientado al norte, en el suelo debe haber un montón de zumbadores igual a
. La plantilla termina al Norte si tu codigo es correcto, al este si Karel dejo un montón mayor a 1 o al sur si Atsa no regreso el número correcto.
Ejemplo

Consideraciones
- Karel tiene infinitos zumbadores
- Al inicio de cada función, Karel inicia en
orientado al Norte
- No hay zumbadores al inicio
- El mundo es rectangular y no hay paredes internas
- No importa la posición ni orientacion final de cada función
- Obtendrás 0 puntos si al acabar la función Karel, hay montones de zumbadores de tamaño mayor a 1
- Obtendrás 0 puntos si modificas la parte prohíbida del código o usas las funciones del evaluador
- Obtendrás 0 puntos si tu programa usa apagate/turnoff
Subtareas
- [10 puntos] El mundo mide 100 filas por 100 columnas
- [40 puntos] El mundo mide 1 fila por 30 columnas
- [50 puntos] El mundo mide 1 fila por 8 columnas
Anexos
Plantilla Pascal
{ NOTA: Esta prohibido en tu seccion del codigo llamar a apagate, o a la funcion ___read o ___eval}
usa rekarel.globales;
iniciar-programa
{Agrega tus funciones predeterminadas aqui}
define Karel(N) como
inicio
{Escribe tu codigo aquí}
fin;
define-calculo Atsa como
inicio
{Escribe tu codigo aquí}
regresa 5;
fin;
{ ESTA PROHIBIDO MODIFICAR EL CODIGO A PARTIR DE ESTA LINEA Y ABAJO }
{=================================================================================}
define-calculo ___read(n) como
inicio
repetir n veces
coge-zumbador;
regresa n;
fin;
define ___eval(n) como
inicio
Karel(n);
mientras no-orientado-al-oeste hacer
gira-izquierda;
mientras frente-libre hacer
avanza;
gira-izquierda;
mientras frente-libre hacer
avanza;
gira-izquierda;
si 1 < zumbadores-del-piso entonces
regresa;
mientras frente-libre o izquierda-libre hacer
inicio
si frente-libre entonces
avanza
sino
inicio
gira-izquierda;
avanza;
gira-izquierda;
mientras frente-libre hacer
avanza;
gira-izquierda;
gira-izquierda;
fin;
si 1 < zumbadores-del-piso entonces
regresa;
fin;
mientras no-orientado-al-oeste hacer
gira-izquierda;
mientras frente-libre hacer
avanza;
gira-izquierda;
mientras frente-libre hacer
avanza;
gira-izquierda;
gira-izquierda;
si Atsa == n entonces
mientras no-orientado-al-norte hacer
gira-izquierda
sino
mientras no-orientado-al-sur hacer
gira-izquierda;
fin;
inicia-ejecucion
___eval(___read(zumbadores-del-piso));
termina-ejecucion
finalizar-programa
Plantilla Java
// NOTA: Esta prohibido en tu seccion del codigo llamar a turnoff, o a la funcion ___read o ___eval
import rekarel.globals;
class program {
define Karel (n) {
//Escribe tu codigo aqui
}
int Atsa () {
//Escribe tu codigo aqui
return 5;
}
// ESTA PROHIBIDO MODIFICAR EL CODIGO A PARTIR DE ESTA LINEA Y ABAJO
//=================================================================================
int ___read (n) {
iterate (n) {
pickbeeper();
}
return n;
}
define ___eval (n) {
Karel (n);
while (notFacingWest) {
turnleft();
}
while (frontIsClear) {
move();
}
turnleft();
while (frontIsClear) {
move();
}
turnleft();
if (1 < beepersOnFloor) {
return;
}
while (frontIsClear || leftIsClear) {
if (frontIsClear) {
move();
} else {
turnleft();
move();
turnleft();
while (frontIsClear) {
move();
}
turnleft();
turnleft();
}
if (1 < beepersOnFloor) {
return;
}
}
while (notFacingWest) {
turnleft();
}
while (frontIsClear) {
move();
}
turnleft();
while (frontIsClear) {
move();
}
turnleft();
turnleft();
if (Atsa () == n) {
while (notFacingNorth) {
turnleft();
}
} else {
while (notFacingSouth) {
turnleft();
}
}
}
program() {
___eval (___read (beepersOnFloor));
}
}
Comentarios