iniciar-programa
define-nueva-instruccion a como avanza;
define-nueva-instruccion gi como gira-izquierda;
define-nueva-instruccion aa(x) como
inicio
    si si-es-cero (x) entonces inicio gi; sal-de-instruccion; fin;
    si junto-a-zumbador entonces
    inicio
        coge-zumbador;
        aa(precede(x));
    fin
    sino
    inicio
        repetir x veces deja-zumbador;
    fin;
fin;
define-nueva-instruccion bb(x) como
inicio
    si junto-a-zumbador entonces
    inicio
        coge-zumbador;
        bb(precede(x));
    fin
    sino
    repetir x veces deja-zumbador;
fin;
define-nueva-instruccion menor_distancia(x) como
inicio
    si no-junto-a-zumbador entonces
    inicio
        si frente-libre entonces a
        sino
        apagate;
        menor_distancia(sucede(x));
    fin
    sino
    inicio
        gi;
        gi;
        mientras frente-libre hacer a;
        si no-junto-a-zumbador entonces
        repetir x veces deja-zumbador
        sino
        inicio
            aa(x);
             si orientado-al-sur entonces
                inicio
                    mientras junto-a-zumbador hacer coge-zumbador;
                    repetir x veces deja-zumbador;
                    gi;
                    gi;
                    gi;
                fin
            sino
            si junto-a-zumbador entonces
            inicio
                bb(x);
            fin
            sino repetir x veces deja-zumbador;
        fin;
    fin;
fin;
define-nueva-instruccion ac(x) como
inicio
    si junto-a-zumbador entonces
    inicio
        coge-zumbador;
        ac(sucede(x));
    fin
    sino
    inicio
        a;
        repetir x veces deja-zumbador;
    fin;
fin;
define-nueva-instruccion ubicar(x) como
inicio
    si junto-a-zumbador entonces
    inicio
        coge-zumbador;
        ubicar(sucede(x));
    fin
    sino
    inicio
        mientras no-orientado-al-oeste hacer gi;
        mientras frente-libre hacer a;
        gi;
        a;
        gi;
        repetir x veces avanza;
        repetir x veces deja-zumbador;
        gi;gi;
        mientras frente-libre hacer a;
        repetir 3 veces gi;
        a;
        gi; gi; gi;
        mientras no-junto-a-zumbador hacer si frente-libre entonces a
        sino
        inicio
            gi;
            gi;
            mientras frente-libre hacer a;
            gi;
            a;
            gi;
            mientras no-junto-a-zumbador hacer
            inicio
                si frente-libre entonces a;
                si junto-a-zumbador y frente-libre entonces
                inicio
                    si frente-libre entonces a;
                    menor_distancia(1);
                    gi;
                    gi;
                    a;
                    mientras no-junto-a-zumbador hacer si frente-libre entonces a;
                    mientras junto-a-zumbador hacer coge-zumbador;
                fin
                sino si frente-bloqueado entonces apagate;
            fin;
        fin;
    fin;
fin;
 inicia-ejecucion
 mientras junto-a-zumbador hacer
 inicio
    mientras no-orientado-al-norte hacer gi;
    ac(0);
    gi;
    gi;
    a;
    gi;
    a;
    gi;
 fin;
 gi;
 mientras frente-libre hacer a;
 gi; gi; gi;
 a;
 mientras junto-a-zumbador hacer
 inicio
     gi;
     gi;
     ubicar(0);
 fin;
 apagate;
    termina-ejecucion
finalizar-programa