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 eskina como
inicio
   oeste;
   mientras frente-libre hacer avanza;
   sur;
   mientras frente-libre hacer avanza;
   este;
fin;

define-nueva-instruccion arriba como
inicio
   oeste;
   mientras frente-libre hacer avanza;
   norte;
   avanza;
   este;
fin;

define-nueva-instruccion ordena(n) como
inicio
   si junto-a-zumbador entonces
   inicio
      coge-zumbador;
      ordena(sucede(n));
   fin
   sino
   inicio
      oeste;
      mientras frente-libre hacer avanza;
      norte;
      repetir 2 veces avanza;
      este;
      repetir precede(n) veces
      inicio
         si frente-libre entonces avanza
         sino arriba;
      fin;
      deja-zumbador;
   fin;
fin;

define-nueva-instruccion ordenar como
inicio
   mientras junto-a-zumbador hacer
        inicio
           ordena(0);
           eskina;
           mientras no-junto-a-zumbador y frente-libre hacer avanza;
        fin;
fin;

define-nueva-instruccion ubicar como
inicio
   eskina;
   norte;
   repetir 2 veces avanza;
   este;
   repetir 10 veces
   inicio
      si no-junto-a-zumbador entonces
      inicio
         mientras no-junto-a-zumbador y frente-libre hacer avanza;
         si no-junto-a-zumbador entonces arriba;
      fin;
   fin;
fin;

define-nueva-instruccion coloca_num(n) como
inicio
   si frente-libre entonces
   inicio
      avanza;
      si frente-bloqueado entonces
      inicio
         sur;
         repetir 2 veces avanza;
         si frente-bloqueado entonces
         inicio
            norte;
            repetir 2 veces avanza;
            oeste;
         fin
         sino
         inicio
            norte;
            avanza;
            este;
            mientras frente-libre hacer avanza;
            oeste;
            coloca_num(sucede(sucede(n)));
         fin;
      fin;
      si orientado-al-oeste entonces coloca_num(sucede(n));
   fin
   sino
   inicio
      eskina;
      mientras junto-a-zumbador hacer avanza;
      repetir sucede(n) veces deja-zumbador;
   fin;
fin;

define-nueva-instruccion bajarnum como
inicio
   ubicar;
   mientras junto-a-zumbador hacer
   inicio
      coge-zumbador;
      oeste;
      coloca_num(0);
      ubicar;
   fin;
fin;

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

define-nueva-instruccion acumulado(n) como
inicio
   si junto-a-zumbador entonces
   inicio
      coge-zumbador;
      acumulado(sucede(n));
   fin
   sino
   inicio
      repetir n veces deja-zumbador;
      eskina;
      norte;
      avanza;
      repetir n veces deja-zumbador;
   fin;
fin;

    inicia-ejecucion
        si no-junto-a-zumbador entonces apagate;
        mientras frente-libre o frente-bloqueado hacer
        inicio
           ordenar;
           bajarnum;
           eskina;
           avanza;
           si junto-a-zumbador entonces
           inicio
              oeste;
              avanza;
              este;
              sumar(0);
              acumulado(0);
           fin
           sino apagate;
           eskina;
           mientras no-junto-a-zumbador y frente-libre hacer avanza;
        fin;

        apagate;
    termina-ejecucion
finalizar-programa
