iniciar-programa
define-nueva-instruccion g(g) como repetir g veces gira-izquierda;
define-nueva-instruccion a(a) como repetir a veces avanza;
define-nueva-instruccion final(F) como inicio
    si junto-a-zumbador entonces inicio
        coge-zumbador;
        final(sucede(F));
    fin sino inicio
        avanza;
        repetir f veces deja-zumbador;
        g(3);
        si frente-libre entonces inicio
            avanza;
        fin sino inicio
            apagate;
        fin;
    fin;
fin;
define-nueva-instruccion resta (r) como inicio
    si junto-a-zumbador  entonces inicio
        coge-zumbador;
        resta(sucede(r));
    fin sino inicio
        avanza;
        repetir r veces coge-zumbador;
        g(2);
        final(0);
    fin;
fin;
define-nueva-instruccion comparar (c) como inicio
    si no si-es-cero (C) entonces inicio
        si junto-a-zumbador entonces inicio
            coge-zumbador;
            comparar(precede(c));
        fin sino inicio
            repetir c veces deja-zumbador;
            g(3);
            si frente-libre entonces inicio
                resta(0);
            fin sino inicio
                apagate;
            fin;
        fin;
    fin sino inicio
        si frente-libre entonces inicio
            avanza;
        fin sino inicio
            apagate;
        fin;
        deja-zumbador;
        g(2);
        avanza;
        g(2);
    fin;
fin;
define-nueva-instruccion cuenta (c) como inicio
    si junto-a-zumbador entonces inicio
        coge-zumbador;
        cuenta(sucede(c));
    fin sino inicio
        a(11);
        g(3);
        a(2);
        g(3);
        mientras frente-libre hacer inicio
            repetir c veces deja-zumbador;
            avanza;
        fin;
        si frente-bloqueado entonces inicio
            repetir c veces deja-zumbador;
            g(2);
            A(11);
            G(3);
            a(1);
            g(3);
        fin;
        mientras frente-libre hacer inicio
            si junto-a-zumbador entonces inicio
                comparar(C);
            fin sino inicio
                si frente-libre entonces inicio
                    a(1);
                fin sino inicio
                    apagate;
                fin;
            fin;
        fin;
        si frente-bloqueado entonces apagate;
    fin;
fin;
define-nueva-instruccion cambia como inicio
    g(3);
    a(1);
    si frente-libre entonces inicio
        g(3);
        a(2);
        g(2);
    fin sino inicio
        g(3);
        a(3);
        g(3);
        cuenta(0);
    fin;
fin;
define-nueva-instruccion junta(j) como inicio
    si junto-a-zumbador entonces inicio
        coge-zumbador;
        junta(sucede(J));
    fin sino inicio
        si frente-libre entonces a(1);
        si junto-a-zumbador entonces inicio
            junta(j);
        fin sino inicio
            si frente-libre entonces a(1);
            repetir j veces deja-zumbador;
            cambia;
            junta(0);
        fin;
    fin;
fin;
    inicia-ejecucion
    a(2);
    g(3);
    a(11);
    g(3);
    junta(0);
        apagate;
    termina-ejecucion
finalizar-programa
