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

define-nueva-instruccion cuad como
inicio
    repetir 4 veces
    inicio
        si frente-libre entonces
        inicio
            avanza;
            si junto-a-zumbador entonces
            inicio
                repetir 2 veces coge-zumbador;
                si no-junto-a-zumbador entonces
                inicio
                    repetir 2 veces deja-zumbador;
                    gira(2);
                    avanza;
                    gira(3);
                fin
                sino
                inicio
                    repetir 2 veces deja-zumbador;
                    gira(2);
                    avanza;
                    gira(3);
                    repetir 2 veces deja-zumbador;
                fin;
            fin
            sino
            inicio
                gira(2);
                avanza;
                gira(3);
            fin;
        fin
        sino
        inicio
            gira(1);
        fin;
    fin;
fin;

define-nueva-instruccion peck(z) como
inicio
    si junto-a-zumbador entonces
    inicio
        si no-orientado-al-norte entonces
        inicio
            repetir 2 veces coge-zumbador;
            si junto-a-zumbador entonces
            inicio
                coge-zumbador;
                si junto-a-zumbador entonces
                inicio
                    mientras junto-a-zumbador hacer coge-zumbador;
                    mientras no-orientado-al-norte hacer gira(1);
                    cuad;
                fin
                sino
                inicio
                    repetir 3 veces deja-zumbador;
                    mientras no-orientado-al-este hacer gira(1);
                fin;
            fin
            sino
            inicio
                mientras junto-a-zumbador hacer coge-zumbador;
                mientras no-orientado-al-norte hacer gira(1);
                cuad;
            fin;
        fin;
        si junto-a-zumbador entonces repetir 2 veces coge-zumbador;
        si junto-a-zumbador entonces
        inicio
           coge-zumbador;
           si no-junto-a-zumbador entonces
           inicio
               repetir 3 veces deja-zumbador;
               mientras no-orientado-al-este hacer gira(1);
               si frente-libre entonces
               inicio
                   avanza;
               fin
               sino
               inicio
                   si derecha-bloqueada entonces
                   inicio
                       gira(2);
                       mientras frente-libre hacer avanza;
                       mientras junto-a-zumbador hacer coge-zumbador;
                       repetir z veces deja-zumbador;
                       apagate;
                   fin
                   sino
                   inicio
                       gira(2);
                       mientras frente-libre hacer avanza;
                       gira(1);
                       avanza;
                       gira(1);
                   fin;
               fin;
               peck(z);
           fin
           sino
           inicio
               deja-zumbador;
               peck(sucede(z));
           fin;
        fin
        sino
        inicio
        si no-junto-a-zumbador entonces
        inicio
            peck(sucede(z));
        fin
        sino
        inicio
            mientras junto-a-zumbador hacer coge-zumbador;
            peck(z);
        fin;
        fin;
        mientras no-orientado-al-este hacer gira(1);
    fin
    sino
    inicio
        mientras no-orientado-al-este hacer gira(1);
        si frente-bloqueado y derecha-bloqueada entonces
        inicio
            gira(2);
            mientras frente-libre hacer avanza;
            mientras junto-a-zumbador hacer coge-zumbador;
            repetir z veces deja-zumbador;
            apagate;
        fin;
    fin;
    si frente-libre entonces
    inicio
        avanza;
        peck(z);
    fin
    sino
    inicio
        si no-junto-a-zumbador entonces
        inicio
            gira(2);
            mientras frente-libre hacer avanza;
            gira(1);
            avanza;
            gira(1);
            peck(z);
        fin;
    fin;
fin;

define-nueva-instruccion dop como
inicio
    repetir 4 veces
    inicio
        si frente-libre entonces
        inicio
            avanza;
             si junto-a-zumbador entonces
             inicio
                 coge-zumbador;
             si junto-a-zumbador entonces
            inicio
                 deja-zumbador;
                 gira(2);
                 avanza;
                 gira(3);
            fin
            sino
            inicio
                repetir 3 veces deja-zumbador;
                dop;
                gira(2);
                avanza;
                gira(3);
            fin;
        fin
        sino
        inicio

            repetir 2 veces deja-zumbador;
            gira(2);
            avanza;
            gira(3);
        fin;
    fin
    sino
    inicio
        gira(1);
    fin;
    fin;
fin;

    inicia-ejecucion
    mientras no-orientado-al-oeste hacer gira(1);
    mientras frente-libre hacer avanza;
    gira(1);
    mientras frente-libre hacer avanza;
    gira(1);
    mientras no-junto-a-zumbador hacer
    inicio
        si frente-libre entonces
        inicio
            avanza;
        fin
        sino
        inicio
            si izquierda-bloqueada entonces apagate;
            gira(2);
            mientras frente-libre hacer avanza;
            gira(3);
            avanza;
            gira(3);
        fin;
    fin;
    repetir 2 veces deja-zumbador;
    dop;
    mientras no-orientado-al-norte hacer gira(1);
    mientras frente-libre hacer avanza;
    gira(1);
    mientras frente-libre hacer avanza;
    gira(2);
    peck(0);
        apagate;
    termina-ejecucion
finalizar-programa
