iniciar-programa
   define-nueva-instruccion g(n) como
   inicio
      repetir n veces
         gira-izquierda;
   fin;
   define-nueva-instruccion siguiente como
   inicio
      mientras derecha-bloqueada y izquierda-bloqueada hacer
         avanza;
   fin;
   define-nueva-instruccion tunel como
   inicio
      mientras frente-libre y (derecha-libre o izquierda-libre) hacer
         avanza;
      si no (derecha-libre o izquierda-libre) entonces
         siguiente
      sino
      inicio
         g(1);
         mientras frente-libre y (derecha-bloqueada) y (izquierda-libre) hacer
            avanza;
         si derecha-libre entonces
         inicio
            g(3);
            avanza;
            siguiente;
         fin
         sino
         inicio
            g(2);
            mientras (izquierda-bloqueada) hacer
            avanza;
            g(1);
            avanza;
            siguiente;
         fin;
      fin;
   fin;
   define-nueva-instruccion arriba como
   inicio
      mientras no-orientado-al-norte hacer
         gira-izquierda;
      mientras frente-libre y (derecha-libre o izquierda-libre) hacer
         avanza;
      si (derecha-libre o izquierda-libre) entonces
         g(1)
      sino
      inicio
          g(2);
          avanza;
          g(3);
      fin;
      mientras frente-libre y (derecha-libre o izquierda-libre) hacer
         avanza;
      g(2);
      si no (derecha-libre o izquierda-libre) entonces
         avanza;
   fin;
   define-nueva-instruccion termina como
   inicio
      arriba;
       mientras frente-libre y (derecha-libre o izquierda-libre) hacer
         avanza;
       si no (derecha-libre o izquierda-libre) entonces
       inicio
          g(2);
          avanza;
       fin;
       apagate;
   fin;
   define-nueva-instruccion busca como
   inicio
     mientras orientado-al-este hacer
     inicio
         mientras frente-libre y (derecha-libre o izquierda-libre) y no-junto-a-zumbador hacer
            avanza;
         si (junto-a-zumbador) entonces
             sal-de-instruccion;
         si no (derecha-libre o izquierda-libre) entonces
         inicio
             g(2);
             avanza;
             g(2);
         fin;
         si derecha-libre entonces
         inicio
            g(3);
            avanza;
            si (derecha-libre o izquierda-libre) entonces
            inicio
               g(3);
               mientras frente-libre y (derecha-libre o izquierda-libre) hacer
                 avanza;
               g(2);
               si no (derecha-libre o izquierda-libre) entonces
                  avanza;
            fin
            sino
            inicio
               g(2);
               avanza;
               termina;
            fin;
         fin
         sino
         inicio
               g(1);
               termina;

         fin;
      fin;
   fin;


    inicia-ejecucion
        mientras frente-libre o frente-bloqueado hacer
        inicio
           arriba;
           busca;
           si junto-a-zumbador entonces
           inicio
             coge-zumbador;
             si no-junto-a-zumbador entonces
             inicio

                mientras no-orientado-al-norte hacer
                   g(1);
                tunel;
             fin
             sino
             inicio
               coge-zumbador;
               si no-junto-a-zumbador entonces
               inicio

                  mientras no-orientado-al-este hacer
                   g(1);
                  tunel;
                fin
                sino
                inicio
                   coge-zumbador;
                   si no-junto-a-zumbador entonces
                   inicio

                      mientras no-orientado-al-sur hacer
                      g(1);
                      tunel;
                   fin
                   sino
                   inicio
                      coge-zumbador;
                      mientras no-orientado-al-oeste hacer
                         g(1);
                      tunel;
                   fin;
                fin;
             fin;
          fin;
       fin;
        apagate;

    termina-ejecucion
finalizar-programa
