iniciar-programa
define-nueva-instruccion gira-derecha como inicio
  gira-izquierda;
  gira-izquierda;
  gira-izquierda;
fin;
define-nueva-instruccion media-vuelta como inicio
  gira-izquierda;
  gira-izquierda;
fin;
define-nueva-instruccion perimetro como inicio
  si no-junto-a-zumbador entonces inicio
    si izquierda-libre entonces inicio
     gira-izquierda;
    fin;
    avanza;
    perimetro;
    deja-zumbador;
  fin
  sino inicio
    coge-zumbador;
    mientras frente-libre hacer inicio
      avanza;
    fin;
    gira-derecha;
    mientras frente-libre hacer inicio
      avanza;
    fin;
  fin;
fin;
define-nueva-instruccion copia(x) como inicio
  si junto-a-zumbador entonces inicio
    coge-zumbador;
    copia(sucede(x));
  fin;
  si frente-bloqueado entonces inicio
 repetir x veces inicio
    deja-zumbador;
  fin;
  media-vuelta;
  repetir 3 veces inicio
   avanza;
  fin;
   repetir x veces inicio
    deja-zumbador;
  fin;
  fin;
fin;
define-nueva-instruccion postes(n) como inicio
  si junto-a-zumbador y orientado-al-este entonces inicio
    coge-zumbador;
    postes(sucede(n));
  fin;
  si no-junto-a-zumbador y orientado-al-este entonces inicio
    repetir n veces inicio
      deja-zumbador;
    fin;
    media-vuelta;
    avanza;
    gira-izquierda;
  fin;
  mientras junto-a-zumbador y orientado-al-sur hacer inicio
    repetir n veces inicio
      si junto-a-zumbador entonces inicio
       coge-zumbador;
      fin;
    fin;
    si orientado-al-sur entonces inicio
      gira-izquierda;
      avanza;
      avanza;
      deja-zumbador;
      media-vuelta;
      avanza;
      avanza;
      gira-izquierda;
    fin;
  fin;
fin;
define-nueva-instruccion resta(z) como inicio
  si junto-a-zumbador entonces inicio
   coge-zumbador;
   resta(sucede(z));
  fin;
  repetir z veces inicio
    deja-zumbador;
  fin;
  avanza;
  repetir z veces inicio
    coge-zumbador;
  fin;
  apagate;
fin;
    inicia-ejecucion
     mientras no-orientado-al-norte hacer inicio
       gira-izquierda;
     fin;
     avanza;
     gira-derecha;
     avanza;
     deja-zumbador;
     avanza;
     perimetro;
     copia(1);
     media-vuelta;
     mientras frente-libre hacer inicio
      avanza;
     fin;
     media-vuelta;
     avanza;
     postes(0);
     mientras no-orientado-al-este hacer inicio
      gira-izquierda;
     fin;
     avanza;
     avanza;
     resta(0);
        apagate;
    termina-ejecucion
finalizar-programa
