iniciar-programa
   define-nueva-instruccion gira(n) como
   inicio
      repetir n veces
         gira-izquierda;
   fin;
   define-nueva-instruccion arriba como
   inicio
      mientras no orientado-al-norte hacer
         gira-izquierda;
      mientras frente-libre hacer
         avanza;
      gira-izquierda;
      mientras frente-libre hacer
         avanza;
      gira(2);
   fin;
   define-nueva-instruccion adelante como
   inicio
      si frente-libre entonces
        avanza
      sino
      inicio
         si derecha-libre entonces
         inicio
            gira(2);
            mientras frente-libre hacer
               avanza;
            gira(1);
            avanza;
            gira(1);
         fin
         sino
            gira(1);
      fin;
   fin;
   define-nueva-instruccion revisa1(n) como
   inicio
       mientras no-junto-a-zumbador y orientado-al-este hacer
        adelante;
      si junto-a-zumbador entonces
      inicio
         mientras junto-a-zumbador hacer
            coge-zumbador;
         revisa1(sucede(n));
         deja-zumbador;
      fin
      sino
      inicio
         mientras no orientado-al-oeste hacer
            gira-izquierda;
         mientras frente-libre hacer
            avanza;
         fin;
   fin;
   define-nueva-instruccion revisa como
   inicio
      mientras no orientado-al-norte hacer
         gira-izquierda;
      mientras frente-libre hacer
         avanza;
      gira-izquierda;
      mientras frente-libre hacer
         avanza;
      gira(2);
      mientras orientado-al-este hacer
      inicio
         si junto-a-zumbador entonces
         inicio
            coge-zumbador;
            si no-junto-a-zumbador entonces
            inicio
               gira(1);
               deja-zumbador;
            fin
            sino
            inicio
               deja-zumbador;
               adelante;
            fin;
         fin
         sino
            adelante;
      fin;
   fin;
   define-nueva-instruccion dfs2 como
   inicio
      repetir 4 veces
      inicio
         si frente-libre entonces
         inicio
            avanza;
            si junto-a-zumbador entonces
            inicio
               coge-zumbador;
               si junto-a-zumbador entonces
               inicio
                  coge-zumbador;
                  si junto-a-zumbador entonces
                  inicio
                      deja-zumbador;
                      dfs2;
                   fin
                   sino
                   repetir 2 veces
                      deja-zumbador;
               fin
               sino
                 deja-zumbador;

            fin;
            gira(2);
            avanza;
            gira(2);
         fin;
         gira-izquierda;
      fin;
   fin;
   define-nueva-instruccion pon(n) como
   inicio
       repetir 2 veces
       inicio
           repetir n veces
               si frente-libre entonces
               inicio
                  avanza;
                  si junto-a-zumbador entonces
                  inicio
                     coge-zumbador;
                     si junto-a-zumbador entonces
                     inicio
                        mientras junto-a-zumbador hacer
                           coge-zumbador;
                        repetir 2 veces
                           deja-zumbador;
                     fin
                     sino
                        deja-zumbador;
                  fin
                   sino
                      repetir 2 veces
                        deja-zumbador;
               fin;
         gira(2);
         mientras junto-a-zumbador hacer
            avanza;
      fin;
      repetir 2 veces
         deja-zumbador;
   fin;
   define-nueva-instruccion dfssur(n) como
   inicio
      si no si-es-cero(n) entonces
      inicio
         mientras no-orientado-al-sur hacer
            gira-izquierda;
         si frente-libre entonces
         inicio
            avanza;
            dfssur(precede(n));
            gira(2);
            avanza;
            gira(2);
         fin;
         gira(1);
         si junto-a-zumbador entonces
         inicio
            coge-zumbador;
            si junto-a-zumbador entonces
            inicio
                mientras junto-a-zumbador hacer
                   coge-zumbador;
                pon(n);
            fin
            sino
            inicio

               deja-zumbador;
            fin;
         fin
         sino
            pon(n);
       fin
       sino
       inicio
          si junto-a-zumbador entonces
          inicio
             coge-zumbador;
             si junto-a-zumbador entonces
             inicio
                mientras junto-a-zumbador hacer
                   coge-zumbador;
                repetir 2 veces
                   deja-zumbador;
             fin
             sino
                deja-zumbador;
         fin
          sino
           repetir 2 veces
                   deja-zumbador;
      fin;
      mientras no orientado-al-sur hacer
         gira-izquierda;
   fin;
   define-nueva-instruccion dfs(n) como
   inicio
      si no si-es-cero(n) entonces
      inicio
         mientras no-orientado-al-norte hacer
            gira-izquierda;
         si frente-libre entonces
         inicio
            avanza;
            dfs(precede(n));
            gira(2);
            avanza;
            gira(2);
         fin;
         gira(1);
         si junto-a-zumbador entonces
         inicio
            coge-zumbador;
            si junto-a-zumbador entonces
            inicio
                mientras junto-a-zumbador hacer
                   coge-zumbador;
                pon(n);
            fin
            sino
            inicio
               pon(n);
               deja-zumbador;
            fin;
         fin
         sino
            pon(n);
       fin
       sino
       inicio
          si junto-a-zumbador entonces
          inicio
             coge-zumbador;
             si junto-a-zumbador entonces
             inicio
                mientras junto-a-zumbador hacer
                   coge-zumbador;
                repetir 2 veces
                   deja-zumbador;
             fin;
          fin
          sino
           repetir 2 veces
                   deja-zumbador;
      fin;
      mientras no orientado-al-norte hacer
         gira-izquierda;
   fin;
   define-nueva-instruccion coge(n) como
   inicio
      si junto-a-zumbador entonces
      inicio
         coge-zumbador;
         coge(sucede(n));
      fin
      sino
      inicio
      mientras frente-libre o frente-bloqueado hacer
      inicio
         revisa;
         si no-junto-a-zumbador entonces
         inicio
            arriba;
            revisa1(0);
            apagate;
         fin
         sino
         inicio
            coge-zumbador;
            si junto-a-zumbador entonces
            inicio
               arriba;
               revisa1(0);
               apagate;
            fin
            sino
            inicio
               dfs(n);
               dfssur(n);
            fin;
         fin;
      fin;
      fin;
   fin;
   inicia-ejecucion
      mientras no-orientado-al-este hacer
         gira-izquierda;
      coge(0);
    apagate;
    termina-ejecucion
finalizar-programa
