iniciar-programa
define-nueva-instruccion gira-derecha como
inicio
  repetir 3 veces
    gira-izquierda;
fin;
define-nueva-instruccion mira-norte como
inicio
  mientras no-orientado-al-norte hacer
    gira-izquierda;
fin;
define-nueva-instruccion mira-sur como
inicio
  mientras no-orientado-al-sur hacer
    gira-izquierda;
fin;
define-nueva-instruccion mira-este como
inicio
  mientras no-orientado-al-este hacer
    gira-izquierda;
fin;
define-nueva-instruccion mira-oeste como
inicio
  mientras no-orientado-al-oeste 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 postes(n) como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    postes(sucede(n));
  fin
  sino
  inicio
  repetir n veces
    deja-zumbador;
    gira-izquierda;
    avanza;
    deja-zumbador;
    avanza;
    repetir precede(n) veces
    inicio
      si derecha-bloqueada entonces
        avanza
      sino
      inicio
        gira-derecha;
        avanza;
      fin;
    fin;
    mientras no-junto-a-zumbador hacer
    inicio
      deja-zumbador;
     repetir n veces
     inicio
      si derecha-bloqueada entonces
        avanza
      sino
      inicio
        gira-derecha;
        avanza;
      fin;
     fin;
    fin;
  fin;
fin;
define-nueva-instruccion metros como
inicio
  avanza;
  repetir 4 veces
  inicio
   mientras derecha-bloqueada hacer
   inicio
     si no-junto-a-zumbador entonces
     inicio
       repetir 2 veces
         deja-zumbador;
     fin;
     avanza;
   fin;
   si derecha-libre entonces
   inicio
     si no-junto-a-zumbador entonces
     inicio
       repetir 2 veces
         deja-zumbador;
     fin;
     gira-derecha;
     avanza;
   fin;
  fin;
fin;
define-nueva-instruccion cuentapostes(n) como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    si no-junto-a-zumbador entonces
    inicio
      si derecha-bloqueada entonces
        avanza
      sino
      inicio
        gira-derecha;
        avanza;
      fin;
      cuentapostes(sucede(N))
    fin
    sino
    inicio
      deja-zumbador;
      si derecha-bloqueada entonces
        avanza
      sino
      inicio
       gira-derecha;
       avanza;
      fin;
      cuentapostes(n);
    fin;
  fin
  sino
  inicio
    mira-sur;
    mientras frente-libre hacer
      avanza;
    mira-oeste;
    mientras frente-libre hacer
      avanza;
    mira-este;
   repetir 2 veces
     avanza;
    repetir n veces
      deja-zumbador;
  fin;
fin;
define-nueva-instruccion cuentametros(n) como
inicio
  si junto-a-zumbador o derecha-bloqueada entonces
  inicio
  si junto-a-zumbador entonces
  inicio
    repetir 2 veces
      coge-zumbador;
    si derecha-bloqueada entonces
    inicio
      avanza;
    fin;
    cuentametros(sucede(n));
   fin
   sino
   inicio
     si derecha-bloqueada entonces
       avanza;
     cuentametros(n);
   fin;
  fin
  sino
  inicio
    mira-oeste;
    mientras frente-libre hacer
      avanza;
    mira-sur;
    mientras frente-libre hacer
      avanza;
    mira-este;
    repetir 3 veces
      avanza;
    repetir n veces
      deja-zumbador;
  fin;
fin;
define-nueva-instruccion ubicate como
inicio
   mira-oeste;
   mientras frente-libre hacer
     avanza;
   mira-norte;
   avanza;
   gira-derecha;
   repetir 2 veces
     avanza;
   mientras izquierda-bloqueada hacer
     avanza;
fin;
inicia-ejecucion
    mira-norte;
    gira-derecha;
    avanza;
    postes(0);
    mira-sur;
    mientras frente-libre hacer
      avanza;
    mira-oeste;
    mientras frente-libre hacer
      avanza;
    paso-atras;
    gira-derecha;
    avanza;
    metros;
    mira-sur;
    mientras frente-libre hacer
      avanza;
   mira-oeste;
   mientras frente-libre hacer
     avanza;
   paso-atras;
   mira-norte;
   avanza;
   avanza;
   cuentapostes(0);
   paso-atras;
   gira-izquierda;
   avanza;
   avanza;
   cuentametros(0);
   mira-oeste;
   mientras frente-libre hacer
     avanza;
   mira-norte;
   avanza;
   gira-derecha;
   repetir 2 veces
     avanza;
   mientras izquierda-bloqueada hacer
     avanza;
   mira-oeste;
   si no-junto-a-zumbador entonces
     avanza;
   cuentametros(0);
   ubicate;
   gira-izquierda;
   avanza;
   mientras izquierda-bloqueada hacer
     avanza;
   mira-sur;
   si no-junto-a-zumbador entonces
     avanza;
   cuentametros(0);
   ubicate;
   gira-izquierda;
   avanza;
   mientras izquierda-bloqueada hacer
     avanza;
   mira-oeste;
   avanza;
   mientras izquierda-bloqueada hacer
     avanza;
   mira-este;
   si no-junto-a-zumbador entonces
     avanza;
   cuentametros(0);
        apagate;
    termina-ejecucion
finalizar-programa
