iniciar-programa
define-nueva-instruccion oeste como mientras no-orientado-al-oeste hacer gira-izquierda;
define-nueva-instruccion este como mientras no-orientado-al-este hacer gira-izquierda;
define-nueva-instruccion sur como mientras no-orientado-al-sur hacer gira-izquierda;
define-nueva-instruccion norte como mientras no-orientado-al-norte hacer gira-izquierda;
define-prototipo-instruccion pareja(n);
define-nueva-instruccion ir11 como
  inicio
     oeste;
     mientras frente-libre hacer avanza;
  fin;

define-nueva-instruccion ordenar(n) como
  inicio
    repetir n veces
      inicio
        ir11;
        repetir n veces
          inicio

           este;
           pareja(0);

          fin;
      fin;
  fin;

   define-nueva-instruccion comparar(n) como inicio
      si junto-a-zumbador entonces inicio
         si no si-es-cero(n) entonces inicio
           coge-zumbador;
           comparar(precede(n));
           (*dejar el numero menor en ambos lados*)
           deja-zumbador;
           oeste;
           avanza;
           deja-zumbador;
           este;
           avanza;
         fin;
      fin sino inicio
        (*n es el mayor*)
        repetir n veces inicio
           deja-zumbador;
        fin;

      fin;
   fin;

   define-nueva-instruccion pareja(n) como inicio
     si junto-a-zumbador entonces inicio
         coge-zumbador;
         pareja(sucede(n));
     fin sino inicio
         avanza;
         comparar(n)
     fin;
   fin;
define-nueva-instruccion sumar(n) como
    inicio
        si junto-a-zumbador entonces inicio
           coge-zumbador;
           sumar(sucede(n));
        fin sino inicio
            norte;
            avanza;
            oeste;
            si frente-libre entonces avanza;
            repetir n veces deja-zumbador;
            sur;
            avanza;
            repetir n veces deja-zumbador;
        fin;

    fin;
define-nueva-instruccion mover como
    inicio
       si junto-a-zumbador entonces inicio
           coge-zumbador;
           mover;
           deja-zumbador;
       fin sino inicio
           si frente-libre entonces avanza;
           mientras junto-a-zumbador y frente-libre hacer avanza;
       fin;
    fin;
define-nueva-instruccion calcula(n) como
    inicio

          ordenar(n);
          ir11;
          sumar(0);
          este;
          avanza;
          sumar(0);
          este;
          repetir 2 veces avanza;
          mientras junto-a-zumbador hacer avanza;
          oeste;
          avanzA;
          mover;
          si frente-libre entonces avanza;
          este;

    fin;
define-nueva-instruccion contar(n) como
  inicio
    si junto-a-zumbador entonces
      inicio
        avanza;
        contar(sucede(n));
        si no si-es-cero (n) entonces calcula(n);
      fin;
  fin;
    inicia-ejecucion
        contar(0);
        apagate;
    termina-ejecucion
finalizar-programa
