iniciar-programa
 define-nueva-instruccion media-vuelta como inicio
   gira-izquierda;
   gira-izquierda;
 fin;
 define-nueva-instruccion gira-derecha como inicio
   gira-izquierda;
   gira-izquierda;
   gira-izquierda;
 fin;
 define-nueva-instruccion men(n) como inicio
   si frente-bloqueado y orientado-al-este entonces inicio
     gira-izquierda;
   fin;
   si frente-libre y orientado-al-norte entonces inicio
     avanza;
     men(precede(n));
     deja-zumbador;
       si si-es-cero(n) entonces inicio
         mientras no-orientado-al-este hacer inicio
           gira-izquierda;
         fin;
       fin;
   fin;
    si frente-libre y orientado-al-este entonces inicio
     avanza;
     men(sucede(n));
     deja-zumbador;
   fin;
 fin;
 define-nueva-instruccion cubo(m) como inicio
    si no si-es-cero(precede(m)) entonces inicio
      repetir 4 veces inicio
        si frente-libre entonces inicio
         avanza;
        fin;
        mientras no-junto-a-zumbador hacer inicio
          repetir m veces inicio
            deja-zumbador;
          fin;
          si frente-libre entonces inicio
           avanza;
          fin;
        fin;
        gira-izquierda;
      fin;
    si frente-libre entonces inicio
      avanza;
    fin;
    gira-izquierda;
    si frente-libre entonces inicio
      avanza;
    fin;
    gira-derecha;
      cubo(precede(m));
    fin;
    apagate;
 fin;
 define-nueva-instruccion num(a) como inicio
  si no si-es-cero(precede(a)) entonces inicio
    repetir a veces inicio
      deja-zumbador;
    fin;
    si frente-libre entonces inicio
      avanza;
    fin;
    gira-izquierda;
    si frente-libre entonces inicio
      avanza;
    fin;
    gira-derecha;
    num(precede(a));
    si si-es-cero(precede(precede(a))) entonces inicio
     si no-junto-a-zumbador entonces inicio
       deja-zumbador;
     fin;
    si frente-libre entonces inicio
      avanza;
    fin;
    gira-izquierda;
    si frente-libre entonces inicio
      avanza;
    fin;
    gira-derecha;
  fin;
    repetir a veces inicio
      deja-zumbador;
    fin;
    si frente-libre entonces inicio
      avanza;
    fin;
    gira-izquierda;
    si frente-libre entonces inicio
      avanza;
    fin;
    gira-derecha;

  fin;
 fin;
 define-nueva-instruccion lado(x) como inicio
   si orientado-al-norte o orientado-al-este entonces inicio
     repetir 2 veces inicio
       si frente-libre y no-orientado-al-sur entonces inicio
         avanza;
       fin
       sino inicio
         mientras no-orientado-al-sur hacer inicio
           gira-izquierda;
         fin;
       fin;
     fin;
     si no-orientado-al-sur entonces inicio
       lado(sucede(x));
     fin
     sino inicio
       si frente-bloqueado entonces inicio
         gira-derecha;
       fin;
       mientras frente-libre hacer inicio
         avanza;
       fin;
       mientras no-orientado-al-este hacer inicio
        gira-izquierda;
       fin;
        si si-es-cero(precede(x)) entonces inicio
       deja-zumbador;
       apagate;
       fin;
       num(x);
     fin;
   fin;
 fin;
 define-nueva-instruccion x(s) como inicio
   si junto-a-zumbador entonces inicio
     coge-zumbador;
     x(sucede(s));
   fin;
   repetir s veces inicio
     deja-zumbador;
   fin;
   mientras frente-libre hacer inicio
     avanzA;
   fin;
   gira-izquierda;
   num(s);
   gira-derecha;
   mientras frente-libre hacer inicio
     avanza;
   fin;
   media-vuelta;
   cubo(s);
fin;
    inicia-ejecucion
     mientras no-orientado-al-este hacer inicio
       gira-izquierda;
     fin;
     men(1);
     mientras junto-a-zumbador hacer inicio
       coge-zumbador;
     fin;
     si orientado-al-norte entonces inicio
       repetir 2 veces inicio
        gira-izquierda;
        mientras frente-libre hacer inicio
         avanza;
        fin;
       fin;
       media-vuelta;
     fin
     sino inicio
      media-vuelta;
      repetir 2 veces inicio
        mientras frente-libre hacer inicio
         avanza;
        fin;
        gira-izquierda;
      fin;
     fin;
     lado(1);
     si no-junto-a-zumbador entonces inicio
       media-vuelta;
       si frente-libre entonces inicio
       avanza;
       fin;
       si no-junto-a-zumbador entonces inicio
         gira-izquierda;
         si frente-libre entonces inicio
         avanza;
         fin;
         gira-derecha;
       fin;
     fin
     sino inicio
       media-vuelta;
     fin;

     x(0);
        apagate;
    termina-ejecucion
finalizar-programa
