iniciar-programa
define-nueva-instruccion gira-derecha como
inicio
  repetir 3 veces
    gira-izquierda;
fin;
define-nueva-instruccion mira-oeste como
inicio
  mientras no-orientado-al-oeste hacer
    gira-izquierda;
fin;
define-nueva-instruccion mira-norte como
inicio
  mientras no-orientado-al-norte hacer
    gira-izquierda;
fin;
define-nueva-instruccion mira-sur como
inicio
  mientras no-orientado-al-sur hacer
    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 largo como
inicio
  si frente-libre entonces
  inicio
    avanza;
    largo;
    deja-zumbador;
  fin
  sino
  inicio
    mira-sur;
    mientras frente-libre hacer
      avanza;
  fin;
fin;
define-nueva-instruccion mira-este como
inicio
  mientras no-orientado-al-este hacer
    gira-izquierda;
fin;
define-nueva-instruccion ancho(n) como
inicio
  si frente-libre entonces
  inicio
    avanza;
    ancho(sucede(N));
  fin
  sino
  inicio
    mira-oeste;
    mientras frente-libre y no-junto-a-zumbador hacer
      avanza;
    si junto-a-zumbador entonces
      paso-atras;
    repetir n veces
      deja-zumbador;
  fin;
fin;
define-nueva-instruccion uno como
inicio
  si frente-bloqueado y izquierda-bloqueada y derecha-bloqueada entonces
  inicio
     deja-zumbador;
  apagate;
  fin;
fin;
define-nueva-instruccion cantidad(n) como
inicio
  si no(si-es-cero(N)) y junto-a-zumbador entonces
  inicio
    coge-zumbador;
    cantidad(precede(N));
  fin
  sino
  inicio
    si si-es-cero(n) entonces
    inicio
      mira-este;
    fin
    sino
    inicio
      si no(si-es-cero(N)) y no-junto-a-zumbador entonces
      inicio
        mira-sur;
      fin;
    fin;
  fin;
fin;
define-nueva-instruccion cuenta como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    cuenta;
    deja-zumbador;
    paso-atras;
    deja-zumbador;
    avanza;
  fin
  sino
    avanza;
fin;
define-nueva-instruccion lleva como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    lleva;
    deja-zumbador;
  fin
  sino
  inicio
    mira-oeste;
    mientras frente-libre hacer
      avanza;
    mira-sur;
    mientras frente-libre hacer
      avanza;
    mira-norte;
  fin;
fin;
define-nueva-instruccion compara(n) como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    compara(sucede(N));
  fin
  sino
  inicio
    gira-derecha;
    avanza;
    mira-norte;
    cuenta;
    paso-atras;
    cantidad(n);
    si orientado-al-sur entonces
    inicio
      paso-atras;
      mira-norte;
      lleva;
    fin
    sino
    inicio
      mira-oeste;
      mientras frente-libre hacer
        avanza;
      mira-norte;
      repetir n veces
        deja-zumbador;
      avanza;
     mira-este;
     avanza;
     mientras junto-a-zumbador hacer
       coge-zumbador;
     mira-oeste;
     mientras frente-libre hacer
       avanza;
     mira-sur;
     mientras frente-libre hacer
       avanza;
     gira-izquierda;
     avanza;
     mientras junto-a-zumbador hacer
       coge-zumbador;
     paso-atras;
     gira-izquierda;
    fin;
    mira-norte;
  fin;
fin;
define-nueva-instruccion camino(N) como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    camino(sucede(N));
   fin
  sino
  inicio
  repetir 4 veces
  inicio
    repetir n veces
    inicio
      si no-junto-a-zumbador entonces
      deja-zumbador;
      si frente-libre entonces
      avanza;
    fin;
    si no-junto-a-zumbador entonces
      paso-atras;
    gira-izquierda;
  fin;
  fin;
fin;
define-nueva-instruccion mitad(n) como
inicio
  si frente-libre y junto-a-zumbador y orientado-al-norte entonces
  inicio
    repetir 2 veces
      avanza;
    si frente-libre entonces
    inicio
      avanza;
      si junto-a-zumbador entonces
      inicio
        paso-atras;


      fin
      sino
      inicio
        paso-atras;
        mira-sur;

      fin;
    fin;
    mitad(sucede(N));
  fin
  sino
  inicio
    mira-sur;
    repetir n veces
      avanza;
  fin;
fin;
define-nueva-instruccion mitad2 como
inicio
  si no-junto-a-zumbador entonces
  inicio
    repetir 2 veces
      avanza;
    mitad2;
    avanza;
  fin
  sino
    mira-oeste;
fin;
define-nueva-instruccion ene(n) como
inicio
  si no-junto-a-zumbador entonces
  inicio
    avanza;
    ene(sucede(N));
  fin
  sino
  inicio
    mira-este;
    mientras junto-a-zumbador y frente-libre hacer
      avanza;
    si no-junto-a-zumbador entonces
      paso-atras;
    mira-oeste;
    repetir 4 veces
    inicio
      mientras junto-a-zumbador y frente-libre hacer
      inicio
      mientras junto-a-zumbador hacer
        coge-zumbador;
        repetir sucede(N) veces
          deja-zumbador;
        si frente-libre entonces
          avanza;
      fin;
      si no-junto-a-zumbador entonces
      inicio
        paso-atras;

      fin;

        gira-izquierda;

    fin;
  fin;
fin;
define-nueva-instruccion cubos(n) como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    cubos(sucede(N));
  fin
  sino
  inicio
    repetir n veces
      deja-zumbador;
    gira-izquierda;
    avanza;
    avanza;
    si junto-a-zumbador entonces
    inicio
      paso-atras;
      deja-zumbador;
      apagate;
    fin
    sino
    inicio
      paso-atras;
      mira-oeste;
    fin;
    repetir 4 veces
    inicio
        mientras no-junto-a-zumbador hacer
        inicio
           repetir precede(N) veces
           inicio
             deja-zumbador;
           fin;
           avanza;
        fin;
        paso-atras;
        gira-izquierda;
        avanza;
      fin;
     gira-derecha;
     avanza;
     gira-izquierda;
    fin;
  fin;
define-nueva-instruccion carga como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    carga;
    deja-zumbador;
    paso-atras;
    deja-zumbador;
    avanza;
  fin
  sino
    avanza;
fin;
define-nueva-instruccion hasimpar(n) como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    hasimpar(sucede(N));
  fin
  sino
  inicio
    paso-atras;
    repetir precede(N) veces
      deja-zumbador;
  fin;
fin;
define-nueva-instruccion impar como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    impar;
    deja-zumbador;
  fin
  sino
    paso-atras;
fin;
define-nueva-instruccion par(n) como
inicio
  si junto-a-zumbador y orientado-al-norte entonces
  inicio
    si junto-a-zumbador entonces
    inicio
      coge-zumbador;
      si junto-a-zumbador entonces
      inicio
        coge-zumbador;
        par(sucede(N));
      fin
      sino
      inicio
        mira-este;
        par(N);
      fin;
    fin
    sino
      mira-oeste;
  fin
  sino
  inicio
    si orientado-al-este entonces
    inicio
       mira-norte;
       avanza;
       impar;
    fin
    sino
    inicio
      avanza;
      hasimpar(0);
    fin;
  fin;
fin;

    inicia-ejecucion
    mira-norte;
    uno;
    si frente-bloqueado entonces
    inicio
      deja-zumbador;
      apagate;
    fin;
    largo;
    deja-zumbador;
    mira-este;
    ancho(1);
    mira-oeste;
    mientras frente-libre hacer
      avanza;
    mira-norte;
    compara(0);
    carga;
    paso-atras;
    par(0);
    mira-este;
    camino(0);
    mira-norte;
    avanza;
    si frente-bloqueado entonces
      apagate
    sino
      paso-atras;
    mitad(0);
    gira-izquierda;
    repetir 2 veces
      avanza;
    mitad2;
    avanza;
    mira-norte;
    ene(0);
    avanza;
    mientras junto-a-zumbador hacer
    cubos(0);

           apagate;
    termina-ejecucion
finalizar-programa
