iniciar-programa
define-nueva-instruccion norte como mientras no orientado-al-norte hacer gira-izquierda;
define-nueva-instruccion sur como mientras no orientado-al-sur hacer gira-izquierda;
define-nueva-instruccion oeste como mientras no orientado-al-oeste hacer gira-izquierda;
define-nueva-instruccion este como mientras no orientado-al-este hacer gira-izquierda;
define-nueva-instruccion relleno2 como
    inicio
        si frente-libre entonces avanza;
        mientras algun-zumbador-en-la-mochila hacer
            inicio
                este;
                si frente-libre entonces avanza;
                sur;
                mientras frente-libre y no junto-a-zumbador hacer
                    inicio
                       deja-zumbador;
                       si frente-libre entonces  avanza;
                    fin;
                norte;
                mientras junto-a-zumbador y frente-libre hacer avanza;

            fin;
          este;
          si frente-libre entonces avanza;
          sur;
          apagate;
    fin;
define-nueva-instruccion relleno como
    inicio
        este;
        si  frente-libre entonces avanza;
        sur;
        si frente-libre entonces avanza;
        si frente-bloqueado y junto-a-zumbador y orientado-al-sur entonces
            inicio
                oeste;
                mientras junto-a-zumbador y frente-libre hacer avanza;
                norte;
                relleno2;
                apagate;
            fin;
        mientras frente-libre y no junto-a-zumbador hacer
            inicio
               deja-zumbador;
               si frente-libre entonces  avanza;
            fin ;
        norte;
        mientras junto-a-zumbador y frente-libre hacer avanza;
        sur;
        si no junto-a-zumbador y frente-libre entonces avanza;
        relleno;
    fin;
define-nueva-instruccion altura(i) como
    inicio
        si junto-a-zumbador entonces
            inicio
                si frente-libre entonces avanza;
                 altura(sucede(i));
                 si no junto-a-zumbador entonces deja-zumbador;
                 si frente-libre entonces avanza;
            fin sino
                inicio
                    sur;
                    si frente-libre entonces avanza;
                    mientras frente-libre y junto-a-zumbador hacer
                        inicio
                            mientras junto-a-zumbador hacer coge-zumbador;
                            si frente-libre entonces avanza;
                        fin;
                    este;
                    repetir i veces si frente-libre entonces avanza;
                    oeste;
                    si frente-libre entonces avanza;
                    norte;
                fin;
    fin;
define-nueva-instruccion base como
    inicio
        si junto-a-zumbador entonces
            inicio
                  si junto-a-zumbador entonces
                      inicio
                          coge-zumbador;
                          base;
                          deja-zumbador;
                          si frente-libre entonces avanza;
                      fin sino
                          inicio
                              este;

                          fin;
            fin;

    fin;
define-nueva-instruccion acarrea como
    inicio
            mientras junto-a-zumbador hacer coge-zumbador;
            mientras no junto-a-zumbador y frente-libre hacer avanza;
            si junto-a-zumbador entonces
                inicio
                    norte;
                    si frente-libre entonces avanza;
                    mientras algun-zumbador-en-la-mochila hacer deja-zumbador;
                fin sino
                    inicio
                        norte;
                        mientras algun-zumbador-en-la-mochila hacer deja-zumbador;
                    fin;
            si frente-libre entonces avanza;
            mientras no junto-a-zumbador y frente-libre hacer avanza;
            si frente-bloqueado y no junto-a-zumbador entonces
                inicio
                    sur;
                    mientras frente-libre hacer avanza;
                    este;
                    base;
                    oeste;
                    mientras frente-libre hacer avanza;
                    norte;
                    altura(0);
                    sur;
                    si frente-libre entonces avanza;
                    relleno;
                    apagate;
                fin;
            sur;
            acarrea;

    fin;
define-nueva-instruccion cimiento(x) como
    inicio

          si junto-a-zumbador entonces
              inicio
                  coge-zumbador;
                  cimiento(sucede(x));
              fin sino
                  inicio
                      repetir x veces deja-zumbador;
                      si frente-libre entonces avanza;
                      repetir x veces deja-zumbador;
                      si algun-zumbador-en-la-mochila entonces deja-zumbador;
                      si algun-zumbador-en-la-mochila entonces deja-zumbador;

                   fin;
    fin;
define-nueva-instruccion junta como
    inicio
         si junto-a-zumbador entonces
             inicio
                 coge-zumbador;
                 junta;
             fin sino
                 inicio
                     mientras no junto-a-zumbador y frente-libre hacer avanza;
                     si junto-a-zumbador entonces junta;
                     si frente-bloqueado y derecha-bloqueada entonces
                         inicio
                             oeste;
                             mientras frente-libre hacer avanza;
                             sur;
                             mientras frente-libre hacer avanza;
                             norte;
                             mientras frente-libre hacer avanza;
                             sur;
                             si algun-zumbador-en-la-mochila entonces deja-zumbador;

                             mientras algun-zumbador-en-la-mochila hacer
                                 inicio

                                       cimiento(0);
                                 fin;
                             acarrea;
                             apagate;
                         fin;
                     si frente-bloqueado entonces
                         inicio
                             sur;
                             mientras frente-libre hacer avanza;
                             este;
                             si frente-libre entonces avanza;
                             norte;
                             junta;
                         fin;

                 fin;
    fin;
    inicia-ejecucion
    oeste;
    mientras frente-libre hacer avanza;
    sur;
    mientras frente-libre hacer avanza;
    norte;
    junta;
        apagate;
    termina-ejecucion
finalizar-programa
