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 colocarbase(n) como
inicio
  si junto-a-zumbador entonces
    inicio
      coge-zumbador;
      colocarbase(sucede(n));
    fin
  sino
    inicio
      este;
      repetir 11 veces
        inicio
          avanza;
          repetir n veces deja-zumbador;
        fin;
    fin;
fin;

define-nueva-instruccion tomar(x) como
inicio
  si junto-a-zumbador entonces
    inicio
      coge-zumbador;
      tomar(sucede(x));
    fin
  sino
    inicio
      avanza;
      repetir x veces deja-zumbador;
    fin;
fin;

define-nueva-instruccion agregar como
inicio
  sur;
  mientras frente-libre hacer avanza;
  oeste;
  avanza;
  norte;
  avanza;
  deja-zumbador;
fin;

define-nueva-instruccion iranterior como
inicio
  sur;
  mientras frente-libre hacer avanza;
  este;
  avanza;
  sur;
fin;

define-nueva-instruccion devolver como
inicio
  sur;
  mientras frente-libre hacer avanza;
  este;
  avanza;
  norte;
  repetir 2 veces avanza;
  este;
fin;

define-nueva-instruccion resta(j) como
inicio
  si junto-a-zumbador entonces
    inicio
      coge-zumbador;
      resta(sucede(j));
    fin
  sino
    inicio
      norte;
      avanza;
      repetir j veces coge-zumbador;
    fin;
fin;

define-nueva-instruccion dejacifra(i) como
inicio
  si junto-a-zumbador entonces
    inicio
      coge-zumbador;
      dejacifra(sucede(i));
    fin
  sino
    inicio
      sur;
      mientras frente-libre hacer avanza;
      repetir i veces deja-zumbador;
    fin;
fin;

define-nueva-instruccion comparar(n) como
inicio
  si junto-a-zumbador entonces
    inicio
      coge-zumbador;
      comparar(sucede(n));
    fin
  sino
    inicio
      repetir n veces deja-zumbador;
      sur;
      avanza;
      si no-junto-a-zumbador entonces dejacifra(0);
      este;
      mientras junto-a-zumbador y frente-libre hacer
        inicio
          repetir n veces
            inicio
              si junto-a-zumbador y orientado-al-este entonces coge-zumbador
              sino
                inicio
                    sur;
                fin;
              si orientado-al-sur entonces deja-zumbador;
            fin;
            si no-orientado-al-sur entonces
              inicio
                si no-junto-a-zumbador entonces oeste
                sino norte;
              fin;
            si orientado-al-oeste entonces
              inicio
                 agregar;
                 iranterior;
              fin;
            si orientado-al-norte entonces
              inicio
                agregar;
                devolver;
              fin;
            si orientado-al-sur y frente-libre entonces
              inicio
                  resta(0);
                  dejacifra(0);
              fin;
        fin;
    fin;

fin;

define-nueva-instruccion siguiente como
inicio
  oeste;
  si frente-libre entonces
    inicio
     avanza;
     si frente-bloqueado y izquierda-bloqueada entonces
             inicio
               norte;
               avanza;
               dejacifra(0);
               apagate;
             fin;
     norte;
     avanza;
    fin
  sino sur;

fin;

    inicia-ejecucion
        repetir 3 veces avanza;
        colocarbase(0);
        sur;
        repetir 2 veces avanza;
        norte;
        mientras frente-libre hacer
          inicio
             tomar(0);
            avanza;
            sur;
            este;
           comparar(0);
           siguiente;

          fin;
        apagate;
    termina-ejecucion
finalizar-programa
