iniciar-programa
define-nueva-instruccion gira-derecha como
inicio
  repetir 3 veces
    gira-izquierda;
fin;
define-nueva-instruccion mira-sur como
inicio
  mientras no-orientado-al-sur hacer
    gira-izquierda;
fin;
define-nueva-instruccion mira-norte como
inicio
  mientras no-orientado-al-norte hacer
    gira-izquierda;
fin;
define-nueva-instruccion mira-este como
inicio
  mientras no-orientado-al-este hacer
    gira-izquierda;
fin;
define-nueva-instruccion mira-oeste como
inicio
  mientras no-orientado-al-oeste hacer
    gira-izquierda;
fin;
define-nueva-instruccion mv como
inicio
  repetir 2 veces
     gira-izquierda;
fin;
define-nueva-instruccion paso-atras como
inicio
  repetir 2 veces
    gira-izquierda;
  avanza;
  repetir 2 veces
    gira-izquierda;
fin;
define-nueva-instruccion backtrack como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    si no-junto-a-zumbador entonces
    inicio
      mira-este;
      avanza;
      backtrack;
      deja-zumbador;
      si frente-libre entonces
      avanza;
    fin
    sino
    inicio
      coge-zumbador;
      si no-junto-a-zumbador entonces
      inicio
        mira-sur;
        avanza;
        backtrack;
        repetir 2 veces
          deja-zumbador;
        si frente-libre entonces
        avanza;
      fin
      sino
      inicio
        coge-zumbador;
        mira-oeste;
        avanza;
        backtrack;
        repetir 3 veces
          deja-zumbador;
         si frente-libre entonces
         avanza;
      fin;
    fin;
  fin
  sino
  inicio
    mira-oeste;
    mientras frente-libre hacer
      avanza;
    mira-este;
  fin;
fin;
define-nueva-instruccion camino(n) como
inicio
   si no(si-es-cero(n)) entonces
   inicio
     si frente-libre entonces
     inicio
       avanza;
       si no-junto-a-zumbador entonces
       inicio
         si orientado-al-norte entonces
         inicio
           repetir 2 veces
             deja-zumbador;
         fin;
         si orientado-al-este entonces
         inicio
           repetir 3 veces
             deja-zumbador;
         fin;
         si orientado-al-oeste entonces
           deja-zumbador;
         camino(precede(N));
         mientras junto-a-zumbador hacer
           coge-zumbador;
         paso-atras;
       fin
       sino
         paso-atras;
     fin
     sino
     inicio
       si orientado-al-norte entonces
       inicio
         backtrack;
         apagate;
       fin;
     fin;
     si izquierda-libre entonces
     inicio
       gira-izquierda;
       avanza;
       si no-junto-a-zumbador entonces
       inicio
          si orientado-al-norte entonces
          inicio
            repetir 2 veces
              deja-zumbador;
          fin;
          si orientado-al-este entonces
          inicio
            repetir 3 veces
              deja-zumbador;
          fin;
          si orientado-al-oeste entonces
           deja-zumbador;
         camino(precede(n));
         mientras junto-a-zumbador hacer
           coge-zumbador;
         paso-atras;
         gira-derecha;
       fin
       sino
       inicio
         paso-atras;
         gira-derecha;
       fin;
     fin
     sino
     inicio
       si orientado-al-este entonces
       inicio
         backtrack;
         apagate;
       fin;
     fin;
     si derecha-libre entonces
     inicio
       gira-derecha;
       avanza;
       si no-junto-a-zumbador entonces
       inicio
         si orientado-al-norte entonces
         inicio
           repetir 2 veces
             deja-zumbador;
         fin;
         si orientado-al-este entonces
         inicio
           repetir 3 veces
             deja-zumbador;
         fin;
         si orientado-al-oeste entonces
           deja-zumbador;
         camino(precede(N));
         mientras junto-a-zumbador hacer
           coge-zumbador;
         paso-atras;
         gira-izquierda;
       fin
       sino
       inicio
         paso-atras;
         gira-izquierda;
       fin;
     fin
     sino
     inicio
       si orientado-al-oeste entonces
       inicio
         backtrack;
         apagate;
       fin;
     fin;
   fin
   sino
   inicio
     si orientado-al-norte y frente-bloqueado entonces
     inicio
       backtrack;
       apagate;
     fin
     sino
     inicio
        si orientado-al-este y izquierda-bloqueada entonces
        inicio
          backtrack;
          apagate;
        fin
        sino
        inicio
          si orientado-al-oeste y derecha-bloqueada entonces
          inicio
            backtrack;
            apagate;
          fin;
        fin;
     fin;
   fin;
fin;
define-nueva-instruccion largo(n) como
inicio
  si frente-libre entonces
  inicio
    avanza;
    largo(sucede(n));
  fin
  sino
  inicio
    MIRA-este;
    mientras no-junto-a-zumbador hacer
      avanza;
    coge-zumbador;
    mira-norte;
    camino(n);
   fin;
fin;
    inicia-ejecucion
    mira-este;
    deja-zumbador;
    mientras frente-libre hacer
      avanza;
    mv;
    largo(1);
        apagate;
    termina-ejecucion
finalizar-programa
