iniciar-programa

    define-nueva-instruccion giraDerecha como inicio
        gira-izquierda; gira-izquierda; gira-izquierda;
    fin;

    define-nueva-instruccion apaga como inicio
        mientras no-orientado-al-sur hacer gira-izquierda;
        mientras frente-libre hacer avanza;
        mientras no-orientado-al-oeste hacer gira-izquierda;
        mientras frente-libre hacer avanza;
        giraDerecha;
        avanza;
        giraDerecha;
        mientras junto-a-zumbador hacer coge-zumbador;
        mientras frente-libre hacer inicio
           avanza;
           mientras junto-a-zumbador hacer coge-zumbador;
       fin;
       gira-izquierda;
       avanza;
       gira-izquierda;
        mientras junto-a-zumbador hacer coge-zumbador;
        mientras frente-libre hacer inicio
           avanza;
           mientras junto-a-zumbador hacer coge-zumbador;
       fin;
       apagate;
    fin;

    define-nueva-instruccion mediaVuelta como inicio
        gira-izquierda; gira-izquierda;
    fin;

    define-nueva-instruccion dejaMuchos(cz) como inicio
        si no si-es-cero(cz) entonces inicio
            deja-zumbador;
            dejaMuchos(precede(cz));
        fin;
    fin;

    define-nueva-instruccion dejaFila3 como inicio
            giraDerecha;
            avanza; avanza;
            deja-zumbador;
            mediaVuelta;
            avanza; avanza;
            giraDerecha;
    fin;

    define-nueva-instruccion veAlFinal como inicio
        giraDerecha;
        mientras frente-libre y junto-a-zumbador hacer avanza;
        si no-junto-a-zumbador entonces inicio
            mediaVuelta;
            avanza;
        fin
        sino
            mediaVuelta;
    fin;

    define-nueva-instruccion checaCuantos(hay) como inicio
        si si-es-cero(hay) y no-junto-a-zumbador entonces inicio
            dejaFila3;
        fin
        sino inicio
            si no si-es-cero(hay) y junto-a-zumbador entonces inicio
                coge-zumbador;
                checaCuantos(precede(hay));
                deja-zumbador;
            fin;
        fin;
    fin;

    define-nueva-instruccion comparaConUltimo(nu) como inicio
        si junto-a-zumbador entonces inicio
            coge-zumbador;
            comparaConUltimo(sucede(nu));
        fin
        sino inicio
            dejaMuchos(nu);
            mientras frente-libre hacer inicio
                avanza;
                checaCuantos(nu);
            fin;
        fin;
    fin;

    define-nueva-instruccion cogeYCopia(z1) como inicio
        si junto-a-zumbador entonces inicio
            coge-zumbador;
            cogeYCopia(sucede(z1));
        fin
        sino inicio
            gira-izquierda;
            dejaMuchos(z1);
            avanza;
            dejaMuchos(z1);
            mediaVuelta;
            avanza;
            gira-izquierda;
        fin;
    fin;

    define-nueva-instruccion copiaFila1 como inicio
        mientras junto-a-zumbador hacer inicio
            cogeYCopia(0);
            si frente-libre entonces avanza

        fin;
    fin;

    define-nueva-instruccion preparaPosiblePatron como inicio
        avanza; avanza;
        giraDerecha;
        mientras no-junto-a-zumbador y frente-libre hacer inicio
            avanza;
        fin;
        si junto-a-zumbador entonces inicio
            deja-zumbador;
            mediaVuelta;
            mientras frente-libre hacer avanza;
            gira-izquierda;
            avanza;
            gira-izquierda;
        fin
        sino apaga;
    fin;

    define-nueva-instruccion cogeSiPuedes(cuantos) como inicio
        si no si-es-cero(cuantos) entonces inicio
            si junto-a-zumbador entonces inicio
                coge-zumbador;
                cogeSiPuedes(precede(cuantos));
            fin
            sino inicio
                mientras no-orientado-al-sur hacer gira-izquierda;
            fin;
        fin;
    fin;

    define-nueva-instruccion limpiaTodo como inicio
        mientras no-orientado-al-sur hacer gira-izquierda;
        mientras frente-libre hacer avanza;
        giraDerecha;
        mientras frente-libre hacer avanza;
        giraDerecha;
        avanza;
        giraDerecha;
        mientras frente-libre y junto-a-zumbador hacer inicio
            mientras junto-a-zumbador hacer coge-zumbador;
            avanza;
        fin;
        mediaVuelta;
        mientras frente-libre hacer avanza;
        giraDerecha;
        avanza;
        giraDerecha;
        mientras frente-libre y no-junto-a-zumbador hacer avanza;
        si junto-a-zumbador entonces inicio
            mientras junto-a-zumbador hacer coge-zumbador;
            giraDerecha;
            avanza; avanza;
            giraDerecha;
            mientras frente-libre hacer avanza;
            mediaVuelta;
            copiaFila1;
            mediaVuelta;
            mientras frente-libre hacer avanza;
            gira-izquierda;
        fin
        sino apaga;
    fin;

    define-nueva-instruccion cogeParaComer(llevo) como inicio
        si junto-a-zumbador entonces inicio
            coge-zumbador;
            cogeParaComer(sucede(llevo));
        fin
        sino inicio
            dejaMuchos(llevo);
            gira-izquierda;
            avanza;
            si junto-a-zumbador entonces inicio
                mediaVuelta;
                avanza;
                gira-izquierda;
                mientras frente-libre y junto-a-zumbador hacer avanza;
                mediaVuelta;
                si no-junto-a-zumbador entonces avanza;
                cogeSiPuedes(llevo);
                si junto-a-zumbador o orientado-al-sur entonces inicio
                    limpiaTodo;

                fin
                sino avanza;
            fin
            sino inicio
                mediaVuelta;
                avanza;
                gira-izquierda;
                si frente-libre entonces inicio
                    avanza;
                    cogeParaComer(0);
                    si no-orientado-al-sur entonces inicio
                        cogeSiPuedes(llevo);
                        si junto-a-zumbador o orientado-al-sur entonces inicio
                            limpiaTodo;

                        fin
                        sino avanza;
                    fin;
                fin
                sino inicio
                    apaga;
                fin;
            fin;
        fin;
    fin;

    define-nueva-instruccion intentaComer como inicio
       cogeParaComer(0);
    fin;

    inicia-ejecucion
        veAlFinal;
        comparaConUltimo(0);
        mediaVuelta;
        copiaFila1;
        mediaVuelta;
        mientras frente-libre hacer avanza;
        giraDerecha;

        mientras junto-a-zumbador hacer inicio
            preparaPosiblePatron;
            intentaComer;

            si orientado-al-sur entonces mediaVuelta
            sino inicio
                giraDerecha;
                avanza;
                si junto-a-zumbador entonces inicio
                    coge-zumbador;
                    si junto-a-zumbador entonces inicio
                        giraDerecha;
                        avanza;
                        giraDerecha;
                        avanza; avanza;
                        gira-izquierda;
                        mientras frente-libre hacer inicio
                            mientras junto-a-zumbador hacer coge-zumbador;
                            avanza;
                            si no-junto-a-zumbador entonces apaga;
                        fin;
                        mientras junto-a-zumbador hacer coge-zumbador;
                        apaga;
                    fin
                    sino inicio
                        deja-zumbador;
                        mediaVuelta;
                        avanza;
                        giraDerecha;
                    fin;
                fin;
                si no-orientado-al-oeste entonces
                    gira-izquierda;
                mientras frente-libre hacer avanza;
                gira-izquierda;
                avanza;  si frente-libre entonces avanza;
                mediaVuelta;
            fin;
        fin;

        apaga;
    termina-ejecucion
finalizar-programa
