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-este como
inicio
  mientras no-orientado-al-este hacer
    gira-izquierda;
fin;
define-nueva-instruccion mira-sur como
inicio
  mientras no-orientado-al-sur 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 ubicate como
inicio
  mira-sur;
  mientras frente-libre hacer
    avanza;
  mira-oeste;
  mientras frente-libre hacer
    avanza;
  mira-norte;
fin;
define-nueva-instruccion soldados como
inicio
  si junto-a-zumbador entonces
  inicio
    si frente-libre entonces
    inicio
      avanza;
      si no-junto-a-zumbador entonces
      inicio
        paso-atras;
        deja-zumbador;
      fin
      sino
        paso-atras;
    fin;
    si derecha-libre entonces
    inicio
      gira-derecha;
      avanza;
      si no-junto-a-zumbador entonces
      inicio
        paso-atras;
        deja-zumbador;
        gira-izquierda;
      fin
      sino
      inicio
        paso-atraS;
        gira-izquierda;
      fin;
    fin;
    si izquierda-libre entonces
    inicio
      gira-izquierda;
      avanza;
      si no-junto-a-zumbador entonces
      inicio
        paso-atras;
        deja-zumbador;
        gira-derecha;
      fin
      sino
      inicio
        paso-atras;
        gira-derecha;
      fin;
    fin;
    repetir 2 veces
      gira-izquierda;
    si frente-libre entonces
    inicio
      avanza;
      si no-junto-a-zumbador entonces
      inicio
        paso-atras;
        deja-zumbador;
        repetir 2 veces
          gira-izquierda;
      fin
      sino
      inicio
        paso-atras;
        repetir 2 veces
          gira-izquierda;
      fin;
    fin
    sino
    inicio
      repetir 2 veces
        gira-izquierda;
    fin;
  fin;

fin;
define-nueva-instruccion cuenta(n) como
inicio
  si frente-libre entonces
  inicio
    avanza;
    cuenta(sucede(n));
  fin
  sino
  inicio
    mira-sur;
    mientras frente-libre hacer
      avanza;
    mira-este;
    repetir n veces
    inicio
    mientras frente-libre hacer
    inicio
      soldados;
      si frente-libre entonces
        avanza;
    fin;
    soldados;
      si frente-libre entonces
      inicio
        avanza;
      fin
      sino
      inicio
        gira-izquierda;
        si frente-libre entonces
        inicio
          avanza;
          gira-izquierda;
          mientras frente-libre hacer
           avanza;
          mira-este;
        fin
        sino
          mira-este;
      fin;

    fin;
  fin;
fin;
define-nueva-instruccion organiza como
inicio
  mientras izquierda-libre hacer
  inicio
    mientras frente-libre hacer
    inicio
      si junto-a-zumbador entonces
        coge-zumbador;
      avanza;
    fin;
    si frente-bloqueado entonces
    inicio
      si junto-a-zumbador entonces
        coge-zumbador;
      gira-izquierda;
      avanza;
      gira-izquierda;
      mientras frente-libre hacer
        avanza;
      mira-este;
    fin;
  fin;
  mientras izquierda-bloqueada y frente-libre hacer
  inicio
    si junto-a-zumbador entonces
     coge-zumbador;
    si frente-libre entonces
      avanza;
  fin;
  si frente-bloqueado entonces
  inicio
    si junto-a-zumbador entonces
      coge-zumbador;
  fin;
fin;
define-nueva-instruccion recoge(m) como
inicio
  si derecha-libre entonces
  inicio
    si junto-a-zumbador entonces
    inicio
      coge-zumbador;
      recoge(sucede(m));
    fin
    sino
    inicio
      si frente-libre entonces
        avanza
      sino
      inicio
        gira-derecha;
        avanza;
        gira-derecha;
        mientras frente-libre hacer
          avanza;
       mira-norte;
      fin;
    fin;
  fin;
  si derecha-libre y orientado-al-norte entonces
  recoge(m);
  si orientado-al-norte entonces
  inicio
    mira-oestE;
    mientras frente-libre hacer
      avanza;
    repetir m veces
      deja-zumbador;
    sal-de-instruccion;
   fin
   sino
    sal-de-instruccion;

fin;
define-nueva-instruccion recoge-derecha(n) como
inicio
  si frente-libre entonces
  inicio
    si junto-a-zumbador entonces
    inicio
      coge-zumbador;
      recoge-derecha(sucede(n));
    fin
    sino
    inicio
      si frente-libre entonces
        avanza;
    fin;
  fin
  sino
  inicio
    si junto-a-zumbador entonces
    inicio
      coge-zumbador;
      recoge-derecha(sucede(n));
    fin
    sino
    inicio
      mira-sur;
      mientras frente-libre hacer
        avanza;
      gira-derecha;
      mientras frente-libre hacer
        avanza;
      repetir n veces
        deja-zumbador;
    fin;
  fin;
  si orientado-al-norte entonces
    recoge-derecha(n);
fin;

    inicia-ejecucion
    ubicate;
    cuenta(0);
    mientras frente-libre hacer
    inicio
      soldados;
      si frente-libre entonces
        avanza;
    fin;
    soldados;
    ubicate;
    mira-este;
    organiza;
    ubicate;
    recoge(0);
    mira-este;
    mientras frente-libre hacer
      avanza;
    mira-norte;
    recoge-derecha(0);
   apagate;
    termina-ejecucion
finalizar-programa
