iniciar-programa
define-nueva-instruccion norte como mientras no-orientado-al-norte hacer gira-izquierda;
define-nueva-instruccion sur como mientras no-orientado-al-sur hacer gira-izquierda;
define-nueva-instruccion este como mientras no-orientado-al-este hacer gira-izquierda;
define-nueva-instruccion oeste como mientras no-orientado-al-oeste hacer gira-izquierda;

define-nueva-instruccion compara (x) como
    inicio
    si no si-es-cero (x) entonces
        inicio
        si junto-a-zumbador entonces
            inicio
                coge-zumbador;
                compara(precede(x));
                deja-zumbador;
            fin
        sino
            inicio
                sur;
            fin;
        fin
    sino
        inicio
           norte;
        fin;
    fin;

define-nueva-instruccion distancia (d) como
    inicio
    si junto-a-zumbador entonces
        inicio
            coge-zumbador;
        si junto-a-zumbador entonces deja-zumbador sino
            inicio
                deja-zumbador;
                este;
                avanza;
                compara(d);
            si orientado-al-sur y junto-a-zumbador entonces
                inicio
                    oeste;
                    avanza;
                fin
            sino
                inicio
                mientras junto-a-zumbador hacer coge-zumbador;
                    repetir d veces deja-zumbador;
                    oeste;
                    avanza;
                fin;
            fin;
        fin
    sino
        inicio
            repetir 2 veces deja-zumbador;
            norte;
        si frente-libre entonces
            inicio
                avanza;
                distancia(sucede(d));
                sur;
                avanza;
            fin;
            sur;
        si frente-libre entonces
            inicio
                avanza;
                distancia(sucede(d));
                norte;
                avanza;
            fin;
            este;
        si frente-libre entonces
            inicio
                avanza;
                distancia(sucede(d));
                oeste;
                avanza;
            fin;
            oeste;
        si frente-libre entonces
            inicio
                avanza;
                distancia(sucede(d));
                este;
                avanza;
            fin;
            repetir 2 veces coge-zumbador;
        fin;
    fin;

define-nueva-instruccion menor(n) como
    inicio
    si no si-es-cero (n) entonces
        inicio
        si junto-a-zumbador entonces
            inicio
                coge-zumbador;
                menor(precede(n));
                deja-zumbador;
            fin sino sur;
        fin sino norte;
    fin;

define-nueva-instruccion mueve como
    inicio
    si junto-a-zumbador entonces
        inicio
            coge-zumbador;
            mueve;
            deja-zumbador;
        fin
    sino
        inicio
            este;
            avanza;
        fin;
    fin;

define-nueva-instruccion quita(x) como
    inicio
    si junto-a-zumbador entonces
        inicio
            coge-zumbador;
            quita(sucede(x));
        fin
    sino
        inicio
            oeste;
            avanza;
            repetir x veces coge-zumbador;
            mueve;
        fin;
    fin;

define-nueva-instruccion cuentaArriba(n) como
    inicio
    si frente-libre entonces
        inicio
            avanza;
            cuentaArriba(sucede(n));
        fin
    sino
        inicio
        si frente-bloqueado y orientado-al-norte entonces
            inicio
                este;
                cuentaArriba(n);
            fin
        sino
            inicio
                oeste;
            repetir n veces
                inicio
                si frente-bloqueado entonces sur;
                    avanza;
                fin;
                oeste;
                avanza;
                menor(n);
            si orientado-al-norte entonces
                inicio
                mientras junto-a-zumbador hacer coge-zumbador;
                    repetir n veces deja-zumbador;
                fin;
                este;
                avanza;
                quita(0);
            fin;
        fin;
    fin;

define-nueva-instruccion cuentaAbajo(n) como
    inicio
    si frente-libre entonces
        inicio
            avanza;
            cuentaAbajo(sucede(n));
        fin
    sino
        inicio
        si frente-bloqueado y orientado-al-sur entonces
            inicio
                este;
                cuentaAbajo(n);
            fin
        sino
            inicio

                oeste;
            repetir n veces
                inicio
                si frente-bloqueado entonces norte;
                    avanza;
                fin;
                oeste;
                avanza;
                mientras junto-a-zumbador hacer coge-zumbador;
                repetir n veces deja-zumbador;
                este;
                avanza;
                norte;
                cuentaArriba(0);
            fin;
        fin;
    fin;

define-nueva-instruccion mueva(n) como
    inicio
    si junto-a-zumbador entonces
        inicio
            coge-zumbador;
            mueva(sucede(n));
        fin
    sino
        inicio
            oeste;
            avanza;
            repetir n veces deja-zumbador;
            sur;
            cuentaAbajo(0);
        fin;
    fin;

define-nueva-instruccion realiza como
    inicio
        este;
        avanza;
        mueva(0);
    fin;

define-nueva-instruccion salir como
    inicio
    si junto-a-zumbador entonces
        inicio
            coge-zumbador;
        si junto-a-zumbador entonces deja-zumbador sino
            inicio
                realiza;
            fin;
        fin
    sino
        inicio
            repetir 2 veces deja-zumbador;
            norte;
        si frente-libre entonces
            inicio
                avanza;
                salir;
                sur;
                avanza;
            fin;
            sur;
        si frente-libre entonces
            inicio
                avanza;
                salir;
                norte;
                avanza;
            fin;
            este;
        si frente-libre entonces
            inicio
                avanza;
                salir;
                oeste;
                avanza;
            fin;
            oeste;
        si frente-libre entonces
            inicio
                avanza;
                salir;
                este;
                avanza;
            fin;
        fin;
    fin;

    inicia-ejecucion
        distancia(0);
        salir;
        apagate;
    termina-ejecucion
finalizar-programa
