iniciar-programa
define-nueva-instruccion gi como inicio
    gira-izquierda;
fin;
define-nueva-instruccion mv como inicio
    repetir 2 veces gira-izquierda;
fin;
define-nueva-instruccion gd como inicio
    repetir 3 veces gira-izquierda;
fin;
define-nueva-instruccion camino(z) como inicio
    si orientado-al-oeste y frente-libre entonces inicio
        si orientado-al-oeste y frente-libre entonces avanza;
        camino(sucede(z));
    fin;
    si frente-bloqueado y orientado-al-oeste entonces inicio
        mv;
        mientras frente-libre hacer avanza;
        gi;
        mientras derecha-bloqueada hacer avanza;
        gd;
        avanza;
        gd;
        mientras frente-libre hacer avanza;
        gi;
    fin;

    si orientado-al-este entonces repetir z veces avanza;
    si orientado-al-este entonces gd;

fin;
define-nueva-instruccion zumbador(x) como inicio
    si junto-a-zumbador y orientado-al-norte entonces inicio
        coge-zumbador;
        zumbador(sucede(x));
        si junto-a-zumbador entonces zumbador(x);
    fin;
    si no-junto-a-zumbador y orientado-al-norte entonces inicio
        gi;
        si orientado-al-oeste entonces camino(0)
    fin;
    si no-junto-a-zumbador y orientado-al-sur entonces repetir x veces deja-zumbador;
    si orientado-al-sur entonces gi;
    si junto-a-zumbador entonces avanza;

fin;
    inicia-ejecucion
    mientras no-orientado-al-este hacer gira-izquierda;

    mientras orientado-al-este hacer inicio
        mientras no junto-a-zumbador y frente-libre hacer avanza;
        si junto-a-zumbador entonces inicio
            gi;
            zumbador(0);
        fin;
        si no-junto-a-zumbador y frente-bloqueado y orientado-al-este entonces apagate;

        si no-junto-a-zumbador entonces inicio
            mv;
            mientras frente-libre hacer avanza;
            gd;
            mientras izquierda-bloqueada hacer avanza;
            gi;
            avanza;
            gi;
            mientras frente-libre hacer avanza;
            gd;
            mientras frente-libre hacer avanza;
            mv;
        fin;
    fin;

        apagate;
    termina-ejecucion
finalizar-programa
