iniciar-programa
define-nueva-instruccion mira-norte como
inicio
  mientras no-orientado-al-norte hacer
    gira-izquierda;
fin;
define-nueva-instruccion mira-oeste como
inicio
  mientras no-orientado-al-oeste hacer
    gira-izquierda;
fin;
define-nueva-instruccion mira-este como
inicio
  mientras no-orientado-al-este hacer
    gira-izquierda;
fin;
define-nueva-instruccion gira-derecha como
inicio
  repetir 3 veces
    gira-izquierda;
fin;
define-nueva-instruccion mira-sur como
inicio
  mientras no-orientado-al-sur hacer
    gira-izquierda;
fin;
define-nueva-instruccion paso-atras como
inicio
  repetir 2 veces
    gira-izquierda;
  avanza;
  repetir 2 veces
    gira-izquierda;
fin;
define-nueva-instruccion largo como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    largo;
    si no-junto-a-zumbador entonces
    deja-zumbador;
    si frente-libre entonces
    avanza;
  fin
  sino
  inicio
    mira-norte;
    gira-izquierda;
    mientras no-junto-a-zumbador  hacer
      avanza;
    gira-derecha;
    mientras frente-libre hacer
      avanza;
    mira-sur;
  fin;
fin;
define-nueva-instruccion ancho como
inicio
 si junto-a-zumbador entonces
 inicio
   coge-zumbador;
   ancho;
   si algun-zumbador-en-la-mochila y no-junto-a-zumbador entonces
     deja-zumbador;
   si frente-libre entonces
     avanza;
 fin
 sino
 inicio
   gira-izquierda;
   mientras no-junto-a-zumbador  hacer
     avanza;
   mira-norte;
   mientras frente-libre hacer
     avanza;
   gira-derecha;
 fin;
fin;
define-nueva-instruccion rellena(n) como
inicio
  si junto-a-zumbador y orientado-al-sur entonces
  inicio
    si frente-libre entonces
      avanza
    sino
      mira-norte;
    rellena(sucede(n));
  fin
  sino
  inicio
    mientras frente-libre hacer
      avanza;
    gira-derecha;
    avanza;
    mira-sur;
    mientras junto-a-zumbador hacer
    inicio
      repetir n veces
      inicio
        si frente-libre entonces
          avanza;
        si no-junto-a-zumbador entonces
          deja-zumbador;
      fin;
      mira-norte;
      mientras frente-libre hacer
        avanza;
        si derecha-libre entonces
        inicio
        gira-derecha;
        avanza;
        mira-sur;
        fin
        sino
          coge-zumbador;
    fin;
  fin;
fin;
define-nueva-instruccion cuentaderecha(x) como
inicio
  si orientado-al-este  entonces
  inicio
  si frente-libre entonces
    avanza;
  si frente-bloqueado entonces
    mira-oeste;
    cuentaderecha(sucede(x));
  fin
  sino
  inicio
    mira-sur;
    mientras frente-libre hacer
      avanza;
    mira-oeste;
    mientras frente-libre hacer
      avanza;
    mira-sur;
   
    paso-atras;
    mira-este;
    mientras frente-libre hacer
      avanza;
      mira-sur;
      avanza;
      gira-izquierda;
      avanza;
    repetir x veces
      deja-zumbador;
    apagate;
  fin;
fin;
define-nueva-instruccion cuenta2(n) como
inicio
  si no-junto-a-zumbador y no(si-es-cero(n)) y orientado-al-este entonces
  inicio
    si frente-libre entonces
      avanza
    sino
    inicio
    mira-oeste;
    fin;
    cuenta2(precede(n));
  fin
  sino
  inicio
    si si-es-cero(n)  y orientado-al-este entonces
    inicio
      mira-oeste;
      mientras frente-libre hacer
        avanza;
      mira-este;
      cuentaderecha(1);
    fin;
  fin;
fin;
define-nueva-instruccion reduce(z) como
inicio
   si frente-libre entonces
   inicio
     avanza;
     reduce(precede(z));
   fin
   sino
   inicio
     mientras frente-libre hacer
       avanza;
     mira-sur;
     mientras frente-libre hacer
       avanza;
     paso-atras;
     mira-este;
     mientras frente-libre hacer
        avanza;
      mira-sur;
      mientras frente-libre hacer
        avanza;
        gira-izquierda;
        avanza;
      repetir z veces
        deja-zumbador;
   fin;
fin;
define-nueva-instruccion cuenta-izquierda(z) como
inicio
  si frente-libre entonces
  inicio
    avanza;
    cuenta-izquierda(sucede(z));
  fin
  sino
  inicio
    mira-oeste;
    reduce(z);
  fin;
fin;
define-nueva-instruccion cuenta(n) como
inicio
  si no-junto-a-zumbador entonces
  inicio
    avanza;
    cuenta(sucede(n));
  fin
  sino
  inicio
    mientras junto-a-zumbador y frente-libre hacer
      avanza;
   si junto-a-zumbador entonces
   inicio
     mira-oeste;
     mientras frente-libre hacer
       avanza;
   fin
   sino
   inicio
     cuenta2(n);
     si orientado-al-oeste entonces
     inicio
       mientras frente-libre hacer
         avanza;
       mira-este;
       cuenta-izquierda(1);
     fin;
   fin;
  fin;
fin;
define-nueva-instruccion ubicate como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    ubicate;
    si frente-libre entonces
    avanza;
  fin
  sino
  inicio
    gira-izquierda;
    mientras frente-libre hacer
      avanza;
    repetir 2 veces
      gira-izquierda;
  fin;
fin;
    inicia-ejecucion
    mira-norte;
    gira-derecha;
    avanza;
    mira-norte;
    ubicate;
    si frente-libre entonces
      paso-atras;
    deja-zumbador;
    avanza;
    mientras no-junto-a-zumbador hacer
      avanza;
    gira-derecha;
    mira-norte;
    largo;
    gira-izquierda;
    avanza;
    mientras no-junto-a-zumbador hacer
      avanza;
    mira-norte;
    ancho;
    si junto-a-zumbador entonces
    coge-zumbador;
    paso-atras;
    repetir 2 veces
      gira-izquierda;
    mientras junto-a-zumbador y frente-libre hacer
    inicio
    si frente-libre entonces
      avanza;
    fin;
    si no-junto-a-zumbador entonces
    paso-atras;
    mira-sur;
    rellena(0);
    mira-norte;
    gira-izquierda;
    mientras frente-libre hacer
      avanza;
     repetir 2 veces
       gira-izquierda;
    cuenta(0);

        apagate;
    termina-ejecucion
finalizar-programa
