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

define-nueva-instruccion pintar(n) como
inicio
   si junto-a-zumbador y orientado-al-oeste entonces
   inicio
      coge-zumbador;
      pintar(sucede(n));
   fin
   sino
   inicio
      si no-junto-a-zumbador y orientado-al-oeste entonces
      inicio
         si frente-libre entonces
         inicio
            avanza;
            si frente-bloqueado entonces
            inicio
               este;
               avanza;
               deja-zumbador;
            fin;
         fin;
         pintar(0);
      fin;

         si no si-es-cero(n) entonces inicio
         si si-es-cero(precede(precede(precede(n)))) entonces
         inicio
            este;
            avanza;
            si no-junto-a-zumbador entonces deja-zumbador;
         fin;
         si si-es-cero(precede(precede(n))) entonces
         inicio
            sur;
            avanza;
            si no-junto-a-zumbador entonces deja-zumbador;
         fin;
         si si-es-cero(precede(n)) entonces
         inicio
            norte;
            avanza;
            si no-junto-a-zumbador entonces deja-zumbador;
         fin;
         fin;

    fin;
fin;

define-nueva-instruccion reyena como
inicio
   si no-junto-a-zumbador entonces
   inicio
      deja-zumbador;
      norte;
      si frente-libre entonces
      inicio
         avanza;
         reyena;
         sur;
         avanza;
      fin;
      sur;
      si frente-libre entonces
      inicio
         avanza;
         reyena;
         norte;
         avanza;
      fin;
      este;
      si frente-libre entonces
      inicio
         avanza;
         reyena;
         oeste;
         avanza;
      fin;
      oeste;
      si frente-libre entonces
      inicio
         avanza;
         reyena;
         este;
         avanza;
      fin;
   fin;
fin;

define-nueva-instruccion comprobar como
inicio
   si junto-a-zumbador y frente-libre entonces
   inicio
      avanza;
      mientras no-junto-a-zumbador y frente-libre hacer avanza;
      si junto-a-zumbador entonces
      inicio
         oeste;
         avanza;
         mientras no-junto-a-zumbador hacer avanza;
         este;
         avanza;
         reyena;
      fin;
   fin;
fin;

define-nueva-instruccion contar(n) como
inicio
   mientras orientado-al-este hacer
   inicio
      mientras no-junto-a-zumbador y frente-libre hacer avanza;
      si junto-a-zumbador entonces
      inicio
         si frente-libre entonces avanza
         sino
         inicio
            si izquierda-libre entonces
            inicio
               oeste;
               mientras frente-libre hacer avanza;
               norte;
               avanza;
               este;
            fin
            sino
            inicio
               eskina;
               repetir sucede(n) veces deja-zumbador;
               apagate;
            fin;
         fin;
         contar(sucede(n));
      fin;
      si frente-bloqueado entonces
      inicio
            si izquierda-libre entonces
            inicio
               oeste;
               mientras frente-libre hacer avanza;
               norte;
               avanza;
               este;
            fin
            sino
            inicio
               eskina;
               repetir n veces deja-zumbador;
               apagate;
            fin;
      fin;
   fin;
fin;

    inicia-ejecucion
        este;
        avanza;
        si no-junto-a-zumbador entonces
        inicio
           deja-zumbador;
           oeste;
           avanza;
           deja-zumbador;
           apagate;
        fin;
        mientras junto-a-zumbador y frente-libre hacer avanza;
        oeste;
        si no-junto-a-zumbador entonces avanza;
        pintar(0);
        eskina;
        este;
        avanza;
        mientras frente-libre hacer
        inicio
           comprobar;
        fin;
        eskina;
        este;
        contar(0);
        apagate;
    termina-ejecucion
finalizar-programa
