iniciar-programa
define-nueva-instruccion g(n) como
inicio
repetir n veces
inicio
gira-izquierda;
fin;
fin;
  define-nueva-instruccion cuenta(n) como
  inicio
   si frente-libre entonces
   inicio
   avanza;
   cuenta(sucede(n));
   fin
   sino
   inicio
   repetir sucede(n) veces
   inicio
   deja-zumbador;
   fin;
   apagate;
   fin;
  fin;


  define-nueva-instruccion lanza(n) como
  inicio
    repetir precede(n) veces
    inicio
      si frente-libre entonces
      inicio
        avanza;
      fin
      sino
      inicio
         si orientado-al-norte entonces
         inicio
           si derecha-libre entonces
           inicio
           g(3);
           avanza;
           g(3);
           lanza(1);
           fin
           sino
           inicio
             g(2);
             mientras frente-libre hacer
             avanza;
             g(3);
             cuenta(0);
           fin;
         fin
         sino
         inicio
           g(3);
           cuenta(0);
         fin;
      fin;
    fin;
      si orientado-al-norte entonces
      inicio
      si frente-bloqueado y no si-es-cero(precede(precede(n))) entonces
      inicio
       si derecha-libre entonces
       inicio
       g(3);
       avanza;
       g(3);
        lanza(1);
       fin
       sino
       inicio
          g(2);
          mientras frente-libre hacer
          avanza;
          g(3);
          cuenta(0);
       fin;
      fin;
       si si-es-cero(precede(n)) entonces
       inicio
       si derecha-libre entonces
       inicio

          g(3);
          avanza;

          g(3);
          lanza(n);
          fin
          sino
          inicio
            g(2);
            mientras frente-libre hacer
            avanza;
             g(3);
             cuenta(0);
          fin;
       fin
       sino
      inicio
        si derecha-libre entonces
        inicio
        g(3);
        avanza;
        gira-izquierda;
      lanza(precede(n));
      fin
      sino
      inicio
      g(2);
      mientras frente-libre hacer
      avanza;
      g(3);
      cuenta(0);
      fin;
      fin;

      fin;
      si orientado-al-sur entonces
      inicio
       si frente-bloqueado entonces
        inicio
        g(3);
        cuenta(0);
        fin;
       si izquierda-libre entonces
       inicio
         gira-izquierda;
         avanza;
         g(3);

      lanza(sucede(n));

       fin
       sino
      inicio
      mientras frente-libre hacer
      avanza;
      g(3);
        cuenta(0);
      fin;

      fin;
  fin;
        define-nueva-instruccion kaka(n) como
        inicio
        si junto-a-zumbador entonces
        inicio
         coge-zumbador;
         kaka(sucede(n));

        fin
        sino
        inicio
        lanza(n);
        fin;
        fin;

    inicia-ejecucion
     si orientado-al-sur entonces
     g(2);
     si orientado-al-este entonces
     gira-izquierda;
     si orientado-al-oeste entonces
     g(3);

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