iniciar-programa

define-nueva-instruccion gira(n) como
inicio
    repetir n veces gira-izquierda;
fin;

define-nueva-instruccion comp como
inicio
    si junto-a-zumbador entonces
    inicio
        coge-zumbador;
    fin
    sino
    inicio
        mientras algun-zumbador-en-la-mochila hacer deja-zumbador;
        avanza;

        apagate;
    fin;
    avanza;
    si junto-a-zumbador entonces
    inicio
        coge-zumbador;
        si no-junto-a-zumbador entonces
        inicio
            gira(2);
        avanza;
        si derecha-libre entonces
        inicio
            gira(3);
            avanza;
            mientras algun-zumbador-en-la-mochila hacer deja-zumbador;
            gira(2);
            avanza;
            gira(3);
        fin
        sino
        inicio
            gira(1);
            avanza;
            mientras algun-zumbador-en-la-mochila hacer deja-zumbador;
            gira(2);
            avanza;
            gira(1);
        fin;
        mientras junto-a-zumbador hacer coge-zumbador;
        gira(1);
        mientras frente-libre hacer avanza;
        gira(3);
        sal-de-instruccion;
        apagate;
        fin;
        gira(2);
        avanza;
        gira(2);
        comp;
    fin
    sino
    inicio
        gira(2);
        avanza;
        si derecha-libre entonces
        inicio
            gira(3);
            avanza;
            mientras algun-zumbador-en-la-mochila hacer deja-zumbador;
            gira(2);
            avanza;
            gira(3);
        fin
        sino
        inicio
            gira(1);
            avanza;
            mientras algun-zumbador-en-la-mochila hacer deja-zumbador;
            gira(2);
            avanza;
            gira(1);
        fin;
        mientras junto-a-zumbador hacer coge-zumbador;
        mientras frente-libre hacer avanza;
        gira(1);
        mientras frente-libre hacer avanza;
        mientras algun-zumbador-en-la-mochila hacer deja-zumbador;
        apagate;
    fin;
    sal-de-instruccion;
fin;

define-nueva-instruccion arregla como
inicio
   gira(1);
   mientras derecha-bloqueada hacer avanza;
   mientras algun-zumbador-en-la-mochila hacer deja-zumbador;
   gira(3);
   comp;
   sal-de-instruccion;
   apagate;
fin;

define-nueva-instruccion shake(x) como
inicio
    si orientado-al-norte entonces
    inicio
        mientras junto-a-zumbador y frente-libre hacer avanza;

            gira(2);
            avanza;
            gira(2);

        mientras junto-a-zumbador hacer coge-zumbador;
        mientras no-orientado-al-este hacer gira(1);
        si frente-libre entonces
        inicio
            shake(x);
        fin
        sino
        inicio
            arregla;
            sal-de-instruccion;
        fin;
    fin
    sino
    inicio
        avanza;
        si no-junto-a-zumbador entonces arregla;
        gira(1);
        mientras junto-a-zumbador y frente-libre hacer avanza;
        si junto-a-zumbador entonces
        inicio
            shake(x);
        fin
        sino
        inicio
            gira(2);
            avanza;
            gira(2);

            shake(x);
        fin;
    fin;
fin;

define-nueva-instruccion jeff(k) como
inicio
    mientras no-orientado-al-este hacer gira(1);
    mientras frente-libre hacer avanza;
    gira(1);
    mientras derecha-bloqueada hacer avanza;
    gira(3);
    avanza;
    mientras algun-zumbador-en-la-mochila hacer deja-zumbador;
    gira(2);
    mientras frente-libre hacer avanza;
    gira(1);
    mientras frente-libre hacer avanza;
    gira(1);
    mientras no-junto-a-zumbador y frente-libre hacer avanza;
    si no-junto-a-zumbador entonces arregla;
    gira(1);
    shake(0);
    sal-de-instruccion;

fin;
define-nueva-instruccion peko(v) como
inicio
    si frente-libre entonces
    inicio
        avanza;
        peko(sucede(v));
    fin
    sino
    inicio
        gira(2);
        mientras junto-a-zumbador y frente-libre hacer avanza;
        gira(2);
        jeff(0);
        repetir v veces avanza;
        mientras algun-zumbador-en-la-mochila hacer deja-zumbador;
        apagate;
    fin;
fin;

    inicia-ejecucion
    peko(0);

        apagate;
    termina-ejecucion
finalizar-programa
