iniciar-programa
define-nueva-instruccion norte como mientras no-orientado-al-norte 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 sur como mientras no-orientado-al-sur hacer gira-izquierda;
define-nueva-instruccion acamoda como
    inicio
        norte;
        mientras junto-a-zumbador hacer coge-zumbador;
        mientras algun-zumbador-en-la-mochila hacer
            inicio
                deja-zumbador;
                si frente-libre entonces avanza;
            fin;
       sur;
       mientras frente-libre hacer avanza;
       este;
       avanza;
       norte;
       mientras junto-a-zumbador hacer coge-zumbador;
       mientras algun-zumbador-en-la-mochila hacer
           inicio
               repetir 2 veces deja-zumbador;
               si frente-libre entonces avanza;
           fin;
       apagate;
    fin;
define-nueva-instruccion toma-haz(n) como
    inicio
        si junto-a-zumbador y no orientado-al-sur o junto-a-zumbador y derecha-libre entonces
        inicio
            coge-zumbador;
            si no-junto-a-zumbador entonces
            toma-haz(sucede(n))
            sino inicio
                coge-zumbador;
                si no-junto-a-zumbador entonces toma-haz(sucede(sucede(n)))
                sino inicio
                    coge-zumbador;
                    toma-haz(sucede(sucede(sucede(n))));
                fin;

            fin;
        fin
        sino
        inicio
            si frente-libre entonces avanza;
            mientras no-junto-a-zumbador y frente-libre hacer avanza;
            si junto-a-zumbador entonces toma-haz(0);
            si frente-bloqueado y no-junto-a-zumbador entonces
                inicio
                si (derecha-libre y orientado-al-sur) o orientado-al-norte entonces
                inicio
                    este;
                    si frente-libre entonces
                       inicio
                           avanza;
                           si izquierda-bloqueada entonces sur;
                           si derecha-bloqueada entonces
                               norte;
                           toma-haz(0);
                       fin
                    sino
                        inicio
                            sur;
                            mientras frente-libre hacer avanza;
                            oeste;
                            mientras frente-libre hacer avanza;
                            sur;
                        fin;
                fin;
              fin;
        fin;
                            si si-es-cero(n) entonces inicio

                            gira-izquierda;
                            sur;
                            fin;
                            si si-es-cero(precede(n)) entonces deja-zumbador;
                            si si-es-cero (precede(precede(n))) entonces
                                inicio
                                    este;
                                    avanza;
                                    deja-zumbador;
                                    deja-zumbador;
                                    oeste;
                                    avanza;
                                    sur;
                                fin;
                           si si-es-cero (precede(precede(precede(n)))) entonces
                               inicio
                                   deja-zumbador;
                                   este;
                                   avanza;
                                   repetir 2 veces deja-zumbador;
                                   oeste;
                                   avanza;
                                   sur;
                               fin;
                          si ningun-zumbador-en-la-mochila entonces acamoda;

    fin;
    inicia-ejecucion
        toma-haz(0);
        apagate;
    termina-ejecucion
finalizar-programa
