iniciar-programa

    define-nueva-instruccion gira-derecha como
    inicio
        repetir 3 veces
        inicio
            gira-izquierda;
        fin;
    fin;

    define-nueva-instruccion gira-doble como
    inicio
        repetir 2 veces
        inicio
            gira-izquierda;
        fin;
    fin;

    define-nueva-instruccion orientar-al-norte como
    inicio
        mientras no-orientado-al-norte hacer
        inicio
            gira-izquierda;
        fin;
    fin;

    define-nueva-instruccion jumiles(x) como
    inicio
        si junto-a-zumbador entonces
        inicio
            coge-zumbador;
            jumiles(precede(x));
        fin
        sino
        inicio
            si si-es-cero(x) entonces
            inicio
                deja-zumbador;
                si frente-libre entonces
                inicio
                    avanza;
                fin;
            fin
            sino
            inicio
                si frente-libre entonces
                inicio
                    avanza;
                fin;
            fin;
        fin;
    fin;

    define-nueva-instruccion busca(x) como
    inicio
        si (junto-a-zumbador y orientado-al-norte) entonces
        inicio
            coge-zumbador;
            busca(sucede(x));
        fin
        sino
        inicio
            repetir x veces
            inicio
                deja-zumbador;
            fin;
            repetir 4 veces
            inicio
                avanza;
            fin;
            gira-derecha;
            mientras frente-libre hacer
            inicio
                jumiles(x);
            fin;
            jumiles(x);
        fin;
    fin;

    define-nueva-instruccion contar(p) como
    inicio
            si junto-a-zumbador entonces
            inicio
                si junto-a-zumbador entonces
                inicio
                    coge-zumbador;
                    si frente-libre entonces
                    inicio
                        avanza;
                    fin;
                    contar(sucede(p));
                fin;
            fin
            sino
            inicio
                repetir p veces
                inicio
                   deja-zumbador;
                fin;
                si frente-libre entonces
                inicio
                    avanza;
                fin;
            fin;
    fin;

    define-nueva-instruccion job como
    inicio
        si junto-a-zumbador entonces
        inicio
            coge-zumbador;
            job;
            deja-zumbador;
        fin
        sino
        inicio
            gira-doble;
            mientras frente-libre hacer
            inicio
                avanza;
            fin;
            gira-doble;
            mientras junto-a-zumbador hacer
            inicio
                avanza;
            fin;
        fin;
    fin;

    define-nueva-instruccion ordenar(x) como
    inicio
        si junto-a-zumbador entonces
        inicio
        coge-zumbador;
        ordenar(sucede(x));
        fin
        sino
        inicio
            repetir x veces
            inicio
                deja-zumbador;
            fin;
            avanza;
            repetir x veces
            inicio
                si junto-a-zumbador entonces
                inicio
                    coge-zumbador;
                fin;
            fin;
            si junto-a-zumbador entonces
            inicio
                mientras algun-zumbador-en-la-mochila hacer
                inicio
                    deja-zumbador;
                fin;
            fin
            sino
            inicio
                gira-doble;
                avanza;
                mientras junto-a-zumbador hacer
                inicio
                    coge-zumbador;
                fin;
                gira-doble;
                avanza;
                repetir x veces
                inicio
                    deja-zumbador;
                fin;
                gira-doble;
                avanza;
                mientras algun-zumbador-en-la-mochila hacer
                inicio
                    deja-zumbador;
                fin;
                gira-doble;
                avanza;
            fin;
        fin;
    fin;

    define-nueva-instruccion fila como
    inicio
        mientras frente-libre hacer
        inicio
            mientras (junto-a-zumbador y frente-libre) hacer
            inicio
                avanza;
            fin;
            mientras (no-junto-a-zumbador y frente-libre) hacer
            inicio
                avanza;
            fin;
            si junto-a-zumbador entonces
            inicio
                job;
            fin;
        fin;
    fin;

    define-nueva-instruccion limpia como
    inicio
        gira-izquierda;
        avanza;
        mientras algun-zumbador-en-la-mochila hacer
        inicio
            deja-zumbador;
        fin;
        gira-doble;
        avanza;
        gira-izquierda;
    fin;

    define-nueva-instruccion mover como
    inicio
    si junto-a-zumbador entonces
    inicio
        coge-zumbador;
        mover;
        deja-zumbador;
    fin
    sino                           
    inicio
        gira-derecha;
        mientras frente-libre hacer
        inicio
            avanza;
        fin;
        gira-derecha;
        mientras frente-libre hacer
        inicio
            avanza;
        fin;
    fin;
    fin;

    inicia-ejecucion
        orientar-al-norte;
        avanza;
        busca(0);
        gira-doble;
        mientras frente-libre hacer
        inicio
        si junto-a-zumbador entonces
        inicio
            contar(0);
        fin
        sino
        inicio
            avanza;
        fin;
        fin;
        gira-doble;
        fila;
        limpia;
        repetir 100 veces
        inicio
            gira-doble;
            mientras frente-libre hacer
            inicio
                avanza;
            fin;
            gira-doble;
            mientras frente-libre hacer
            inicio
                ordenar(0);
            fin;
        fin;
        mover;
        apagate;
    termina-ejecucion
finalizar-programa
