Karel y Atsa vs Warel

Ver en PDF

Enviar solución

Puntos: 20 (parcial)
Límite de tiempo: 8.0s
Límite de memoria: 256M

Autor:
Tipo de problema
Lenguajes permitidos
ReKarel

Problema

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 N entre 0 y 255, 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 N y otra función llamada Atsa que debe regresar N. 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 (1, 1) orientado al norte, en el suelo debe haber un montón de zumbadores igual a N. 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 (1, 1) 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
  • 0 \leq N \leq 255
  • 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

No hay comentarios por el momento.