iniciar-programa
define-nueva-instruccion a como si frente-libre entonces avanza;
define-nueva-instruccion gi como gira-izquierda;
define-nueva-instruccion mv como repetir 2 veces gi;
define-nueva-instruccion gd como repetir 3 veces gi;
define-nueva-instruccion z(x) como
inicio
    si no(si-es-cero (x))entonces
    si no-junto-a-zumbador entonces
    inicio
        repetir 10 veces
        inicio
            mientras frente-libre y no-junto-a-zumbador hacer
            inicio
                a;
            fin;
            si no-junto-a-zumbador entonces gi;
        fin;
        si junto-a-zumbador entonces z(x)
        sino
        inicio
            mientras no-orientado-al-oeste hacer gi;
            mientras frente-libre hacer a;
            mientras no-orientado-al-sur hacer gi;
            mientras frente-libre hacer a;
            repetir x veces deja-zumbador;
            deja-zumbador;
            apagate;
        fin;
    fin
    sino
    inicio
        si frente-libre entonces
        inicio
            a
        fin
        sino
        inicio
            gi;
            a;
        fin;
        z(precede(x));
    fin
    sino
    inicio
        si no-junto-a-zumbador entonces
        inicio
            repetir 8 veces
            inicio
                mientras frente-libre y no-junto-a-zumbador hacer
                si no-junto-a-zumbador entonces a;
                 si no-junto-a-zumbador entonces gi;
            fin;
        fin;
        si no-junto-a-zumbador entonces
        inicio
        mientras no-orientado-al-oeste hacer gi;
        mientras frente-libre hacer a;
        gi;
        mientras frente-libre hacer a;
        deja-zumbador;
        apagate;
        fin;
    fin;
fin;
define-nueva-instruccion bloques (x) como
inicio
    si junto-a-zumbador entonces
    inicio
        coge-zumbador;
        bloques(sucede(x));
        z(x);
        si junto-a-zumbador entonces bloques(0)
        sino
        inicio
            repetir 4 veces
            inicio
                mientras frente-libre hacer
                inicio
                    si no-junto-a-zumbador entonces a
                    sino bloques(0);
                fin;
                si no-junto-a-zumbador entonces  gi
                sino bloques(0);
            fin;
        fin;
    fin;
fin;
    inicia-ejecucion
    mientras no-orientado-al-oeste hacer gi;
    mientras frente-libre hacer a;
    mientras no-orientado-al-sur hacer gi;
    mientras frente-libre hacer a;
    mientras no-orientado-al-este hacer gi;
    bloques(0);
        apagate;
    termina-ejecucion
finalizar-programa
