iniciar-programa
define-nueva-instruccion g(n) como
  inicio
    repetir n veces gira-izquierda;
  fin;
  define-nueva-instruccion apa como
    inicio
       g(2);
       si frente-libre entonces avanza;
       si algun-zumbador-en-la-mochila entonces deja-zumbador;
       apagate;

    fin;
    define-nueva-instruccion c3 como
      inicio
        si derecha-libre entonces
          inicio
            si frente-libre entonces
              inicio
                avanza;
            si derecha-libre entonces
              apa
            sino
             inicio
               g(2);
               si frente-libre entonces avanza;
               g(2);
               sal-de-instruccion;
             fin;
            fin
            sino
             g(2);

          fin
         sino
          g(2);

      fin;
  define-nueva-instruccion c2 como
    inicio
     si izquierda-libre entonces
       inicio
         si frente-libre entonces
           inicio
           avanza;
            si izquierda-libre entonces
              apa
           sino
             inicio
              g(2);
              si frente-libre entonces avanza;
              g(2);
              sal-de-instruccion;
             fin;

            fin
           sino
            inicio
              g(2);
              c3;
              sal-de-instruccion;

            fin;
       fin;

    fin;
  define-nueva-instruccion checa como
    inicio
     si orientado-al-norte  entonces
       inicio
        mientras no-orientado-al-sur hacer gira-izquierda;
         c2;
        mientras no orientado-al-norte hacer gira-izquierda;
        sal-de-instruccion;
       fin;
        si orientado-al-oeste entonces
       inicio
         mientras no-orientado-al-sur hacer gira-izquierda;
         c2;
         mientras no-orientado-al-oeste hacer gira-izquierda;
         sal-de-instruccion;
       fin;
      si orientado-al-este entonces
        inicio
         mientras no-orientado-al-sur hacer gira-izquierda;
          c2;
         mientras no-orientado-al-este hacer gira-izquierda;
          sal-de-instruccion;
        fin;

    fin;
  define-nueva-instruccion busca como
    inicio

      si algun-zumbador-en-la-mochila entonces
         deja-zumbador;
      repetir 4 veces
           inicio
           si frente-libre y no-orientado-al-oeste entonces
             inicio
               avanza;
               si no-junto-a-zumbador y algun-zumbador-en-la-mochila entonces
                 inicio
                 checa;
                 busca;
                 coge-zumbador;
                fin;
                g(2);
                si frente-libre entonces avanza;
                g(2);
             fin;
          g(1);
        fin;


    fin;

    define-nueva-instruccion rev como
      inicio
          g(3);
          si frente-libre entonces avanza;
          si junto-a-zumbador entonces coge-zumbador;
          g(2);
          si frente-libre entonces avanza;
          g(3);

      fin;
    define-nueva-instruccion chder como
      inicio

          mientras izquierda-bloqueada  hacer
           inicio
             si junto-a-zumbador entonces
              inicio
               coge-zumbador;
                si frente-libre entonces avanza;
              fin
             sino
               inicio
                g(2);
                si frente-libre entonces avanza;
                g(2);
                si algun-zumbador-en-la-mochila entonces
                deja-zumbador;
                si frente-libre entonces avanza;
                mientras izquierda-bloqueada hacer
                  inicio
                    si no-junto-a-zumbador y algun-zumbador-en-la-mochila entonces
                      deja-zumbador;
                      si frente-libre entonces avanza;

                  fin;
              fin;

           fin;
           si izquierda-libre y no junto-a-zumbador entonces
             inicio
              g(2);
              si frente-libre entonces avanza;
               si no-junto-a-zumbador y algun-zumbador-en-la-mochila entonces
                      deja-zumbador;
               g(2);
               si frente-libre entonces avanza;

             fin;

            si izquierda-libre entonces
             inicio
              g(1);
              si algun-zumbador-en-la-mochila y no junto-a-zumbador entonces deja-zumbador;
              si frente-libre entonces avanza;
              busca;
              si junto-a-zumbador entonces coge-zumbador;
              g(2);
              si frente-libre entonces
               avanza;
               g(1);
              si junto-a-zumbador  entonces coge-zumbador;
              si frente-libre entonces avanza;

             fin;
             chder;

      fin;
    inicia-ejecucion
    g(1);
       mientras frente-libre  hacer
       inicio
         si algun-zumbador-en-la-mochila entonces
           deja-zumbador;
          si frente-libre entonces  avanza;
       fin;
        g(3);
        si frente-libre entonces
         inicio
           avanza;
            g(3);
           mientras frente-libre hacer
            inicio
             rev;
              si frente-libre entonces avanza;

            fin;
            rev;
            g(3);
             si frente-libre entonces avanza;
           g(1);
           si frente-libre entonces avanza;
        fin
        sino
         inicio
            si no-junto-a-zumbador entonces deja-zumbador;
           g(3);
         fin;
     chder;


        apagate;
    termina-ejecucion
finalizar-programa
