iniciar-programa
define-nueva-instruccion a como avanza;
define-nueva-instruccion gi como gira-izquierda;
define-nueva-instruccion mv como inicio gi; gira-izquierda; fin;
define-nueva-instruccion gd como inicio gi; gi; gira-izquierda; fin;
define-nueva-instruccion ttt como
inicio
    mientras no-orientado-al-oeste hacer gi;
    si frente-libre entonces
    inicio
        a;
        ttt;
        deja-zumbador;
    fin
    sino
    mientras junto-a-zumbador hacer coge-zumbador;
fin;
define-nueva-instruccion ava(x) como
inicio
    repetir x veces
    inicio
    a;
    si junto-a-zumbador entonces
    si frente-libre entonces inicio ttt; apagate; fin;
    fin;
fin;
define-nueva-instruccion pasos2(x) como
inicio
    si junto-a-zumbador entonces
    inicio
        coge-zumbador;
        pasos2(sucede(x));
    fin
    sino
    inicio
        repetir x veces deja-zumbador;
        si frente-libre entonces a;
        mientras frente-libre hacer a;
        mv;
        a;
        mientras frente-libre hacer
        inicio
            a;
            si junto-a-zumbador y frente-libre entonces
            inicio
                coge-zumbador;
                si no-junto-a-zumbador entonces deja-zumbador
                sino
                inicio
                    deja-zumbador;
                    mv;
                    ava(x);
                    deja-zumbador;
                    deja-zumbador;
                    mv;
                    mientras frente-libre hacer inicio a; si junto-a-zumbador y frente-libre entonces repetir 2 veces coge-zumbador; fin;
                fin;
            fin;
        fin;
        si frente-bloqueado entonces
        inicio
            mv;
            ava(x);
            deja-zumbador;
            deja-zumbador;
        fin;
        mientras frente-libre hacer a;
        mv;
    fin;
fin;
define-nueva-instruccion pasos(x) como
si  junto-a-zumbador entonces
inicio
    coge-zumbador;
    pasos(sucede(x));
fin
sino
inicio
    repetir x veces deja-zumbador;
    si frente-libre entonces a;
    mientras frente-libre hacer a;
    mv;
    a;
    mientras frente-libre hacer
    inicio
        a;
        si junto-a-zumbador y frente-libre entonces
        inicio
            coge-zumbador;
            si junto-a-zumbador entonces deja-zumbador
            sino
            inicio
                deja-zumbador;
                mv;
                ava(x);
                deja-zumbador;
                mv;
                mientras frente-libre hacer inicio a; si junto-a-zumbador y frente-libre entonces coge-zumbador; fin;
            fin;
       fin;
    fin;
    si frente-bloqueado entonces
    inicio
        mv;
        ava(x);
        deja-zumbador;
    fin;
    si orientado-al-norte entonces gi;
    mientras frente-libre hacer a;
    mv;
    pasos2(0);
fin;
    inicia-ejecucion
    mientras no-orientado-al-este hacer gi;
    repetir 200 veces
    pasos(0);
        apagate;
    termina-ejecucion
finalizar-programa
