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 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 ir11 como
  inicio
   sur;
   mientras frente-libre hacer avanza;
   oeste;
   mientras frente-libre hacer avanza;
   este;
  fin;

define-nueva-instruccion deja(n) como
  inicio
   si no si-es-cero(n) entonces
     inicio
      deja-zumbador;
      deja(precede(precede(precede(precede(n)))));
     fin;
    apagate;
  fin;

define-nueva-instruccion sitio como
  inicio
   mientras no-junto-a-zumbador hacer
     inicio
      si frente-libre entonces avanza;
      si orientado-al-norte y derecha-bloqueada entonces oeste;
      si orientado-al-norte y izquierda-bloqueada entonces  este;
      si frente-bloqueado y orientado-al-este y izquierda-libre entonces norte;
      si frente-bloqueado y orientado-al-oeste y derecha-libre entonces norte;
     fin;
   fin;

define-nueva-instruccion buscar como
  inicio
   si no-junto-a-zumbador entonces
     inicio
      repetir 4 veces deja-zumbador;
     fin
   sino
     inicio
      coge-zumbador;
      si junto-a-zumbador entonces
        inicio
         coge-zumbador;
         si junto-a-zumbador entonces
           inicio
            repetir 6 veces deja-zumbador;
           fin
         sino repetir 2 veces deja-zumbador;
        fin
      sino
        inicio
         repetir 2 veces deja-zumbador;
         norte;
         si frente-libre entonces
           inicio
            avanza;
            buscar;
            sur;
            avanza;
           fin;

         sur;
         si frente-libre entonces
           inicio
            avanza;
            buscar;
            norte;
            avanza;
           fin;

         este;
         si frente-libre entonces
           inicio
            avanza;
            buscar;
            oeste;
            avanza;
           fin;

         oeste;
         si frente-libre entonces
           inicio
            avanza;
            buscar;
            este;
            avanza;
           fin;
        fin;
     fin;
  fin;

define-nueva-instruccion acomodar como
  inicio
   mientras no-junto-a-zumbador y frente-libre  hacer
     inicio
      si frente-libre entonces avanza;
      si orientado-al-norte y derecha-bloqueada entonces oeste;
      si orientado-al-norte y izquierda-bloqueada entonces  este;
      si frente-bloqueado y orientado-al-este y izquierda-libre entonces norte;
      si frente-bloqueado y orientado-al-oeste y derecha-libre entonces norte;
     fin;
   si junto-a-zumbador entonces
     inicio
      repetir 2 veces coge-zumbador;
      si junto-a-zumbador entonces
        inicio
         repetir 2 veces deja-zumbador;
       fin
     sino acomodar;
    fin;
  fin;

define-nueva-instruccion recoge(n) como
  inicio
   si junto-a-zumbador entonces
     inicio
      coge-zumbador;
      recoge(sucede(n));
     fin
   sino
    acomodar;
    si junto-a-zumbador entonces
      inicio
       recoge(n);
      fin
    sino
      inicio
      ir11;
       deja(n);
      fin;
  fin;

    inicia-ejecucion
    ir11;
    sitio;
    buscar;
    ir11;
    acomodar;
    recoge(0);

        apagate;
    termina-ejecucion
finalizar-programa
