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 minimo como
inicio
   si frente-bloqueado o derecha-bloqueada entonces
   inicio
      deja-zumbador;
      apagate;
   fin;
   deja-zumbador;
   avanza;
   si frente-bloqueado entonces apagate;
   sur;
   avanza;
   este;
   avanza;
   si frente-bloqueado entonces apagate;
   oeste;
   avanza;
   coge-zumbador;
   norte;
fin;

define-nueva-instruccion eskina como
inicio
   sur;
   mientras frente-libre hacer avanza;
   oeste;
   mientras frente-libre hacer avanza;
fin;

define-nueva-instruccion busca_menor(n) como
inicio
   si frente-libre entonces
   inicio
      avanza;
      busca_menor(sucede(n));
   fin
   sino inicio
      eskina;
      este;
      repetir n veces si frente-libre entonces avanza;
      si frente-libre entonces
      inicio
         eskina;
         norte;
      fin
      sino inicio
         eskina;
         este;
      fin;
   fin;
fin;

define-nueva-instruccion mide_frente(n) como
inicio
   si frente-libre entonces
   inicio
      avanza;
      mide_frente(sucede(n));
   fin

   sino inicio
      eskina;
      norte;
      repetir 4 veces
      inicio
         repetir n veces avanza;
         deja-zumbador;
         repetir 3 veces gira-izquierda;
      fin;
      repetir n veces deja-zumbador;
   fin;
fin;

define-nueva-instruccion marca_linea1(n) como
inicio
   si junto-a-zumbador entonces
   inicio
      repetir 2 veces si junto-a-zumbador entonces coge-zumbador;
      marca_linea1(sucede(n));
   fin
   sino
   inicio
      repetir 4 veces inicio
         mientras no-junto-a-zumbador hacer
           inicio
              repetir n veces deja-zumbador;
              si frente-libre entonces avanza;
           fin;
         repetir 3 veces gira-izquierda;
         si junto-a-zumbador entonces coge-zumbador;
         si junto-a-zumbador entonces deja-zumbador;
      fin;
   fin;
fin;

define-nueva-instruccion traza_cubo(n) como
inicio
   si junto-a-zumbador entonces inicio
      coge-zumbador;
      traza_cubo(sucede(n));
   fin
   sino
     inicio
        si si-es-cero(precede(n)) entonces inicio
           deja-zumbador;
           apagate;
        fin;
        repetir n veces deja-zumbador;
        norte;
        avanza;
        este;
        avanza;
        norte;
        repetir 4 veces inicio
           mientras no-junto-a-zumbador hacer inicio
              repetir precede(n) veces deja-zumbador;
              si frente-libre entonces avanza;
           fin;
           repetir 2 veces gira-izquierda;
           avanza;
           gira-izquierda;
           mientras junto-a-zumbador y no-orientado-al-norte hacer coge-zumbador;
        fin;
        si junto-a-zumbador entonces inicio
           coge-zumbador;
           si junto-a-zumbador entonces deja-zumbador
           sino inicio
              deja-zumbador;
              apagate;
           fin;
         fin;
        oeste;
        avanza;
        norte;
     fin;

fin;

    inicia-ejecucion
        norte;
        minimo;
        busca_menor(0);
        mientras frente-libre y (orientado-al-este o orientado-al-norte) hacer
        inicio
           si frente-libre entonces inicio
              avanza;
              si frente-bloqueado entonces inicio
                 repetir 2 veces gira-izquierda;
                 avanza;
              fin;
           fin;
           si frente-libre y (orientado-al-norte o orientado-al-este) entonces avanza;
        fin;
        si (orientado-al-norte o orientado-al-este) entonces
        repetir 2 veces gira-izquierda;
        mide_frente(0);
        marca_linea1(0);
        si no-junto-a-zumbador entonces deja-zumbador;
        mientras frente-libre o frente-bloqueado hacer traza_cubo(0);
        apagate;
    termina-ejecucion
finalizar-programa
