iniciar-programa

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 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 busca-unos como
inicio
    mira-oeste;
    mientras frente-libre hacer
        avanza;
    mira-sur;
    mientras frente-libre hacer
        avanza;
    mira-norte;
    mientras frente-libre hacer
    inicio
        mira-este;
        mientras frente-libre hacer
        inicio
            si junto-a-zumbador entonces
                deja-zumbador;
            avanza;
            si frente-bloqueado entonces
                si junto-a-zumbador entonces deja-zumbador;
        fin;
        mira-oeste;
        mientras frente-libre hacer avanza;
        mira-norte;
        avanza;
    fin;
    mira-este;
    mientras frente-libre hacer
    inicio
         si junto-a-zumbador entonces
             deja-zumbador;
         avanza;
         si frente-bloqueado entonces
            si junto-a-zumbador entonces deja-zumbador;
    fin;
    mira-oeste;
    mientras frente-libre hacer avanza;
    mira-sur;
    mientras frente-libre hacer avanza;
    mira-norte;
fin;

define-nueva-instruccion media-vuelta como
inicio
    gira-izquierda;
    gira-izquierda;
fin;

define-nueva-instruccion paso-atras como
inicio
    media-vuelta;
    avanza;
    media-vuelta;
fin;

define-nueva-instruccion marca como
inicio
    repetir 4 veces
    inicio
        si frente-libre entonces
        inicio
              avanza;
              si no-junto-a-zumbador entonces deja-zumbador;
              paso-atras;
        fin;
        gira-izquierda;
    fin;
 fin;

define-nueva-instruccion busca-dos como
inicio
    mientras frente-libre hacer
    inicio
        si junto-a-zumbador entonces
        inicio
            coge-zumbador;
            si junto-a-zumbador entonces
            inicio
                marca;

            fin
            sino
                deja-zumbador;
            avanza;
        fin
        sino
            avanza;
    fin;
    si junto-a-zumbador entonces
    inicio
          coge-zumbador;
          si junto-a-zumbador entonces
          inicio
              marca;
          fin
          sino
              deja-zumbador;

     fin;
fin;

define-nueva-instruccion deja-marca como
inicio
      busca-unos;
      mira-este;
      mientras frente-libre hacer
      inicio
          mira-norte;
          busca-dos;
          mira-sur;
          mientras frente-libre hacer avanza;
          mira-este;
          avanza;
      fin;
      mira-norte;
      busca-dos;
      mira-sur;
      mientras frente-libre hacer avanza;
      mira-oeste;
      mientras frente-libre hacer avanza;
      mira-norte;
fin;

define-nueva-instruccion simula como
inicio
     si junto-a-zumbador entonces
     inicio
         coge-zumbador;
         simula;
         deja-marca;
     fin;
fin;

define-nueva-instruccion cuenta(n) como
inicio
     si frente-libre entonces
     inicio
         si junto-a-zumbador entonces
         inicio
             coge-zumbador;
             avanza;
             cuenta(sucede(n));
         fin
         sino
         inicio
             avanza;
             cuenta(n);
         fin;
     fin
     sino
     inicio
         si junto-a-zumbador entonces
         inicio
             mira-sur;
             coge-zumbador;
             mientras frente-libre hacer avanza;

             repetir n veces
                 deja-zumbador;
             deja-zumbador;
         fin
         sino
         inicio
            mira-sur;
             mientras frente-libre hacer avanza;

             repetir n veces
                 deja-zumbador;
         fin;
     fin;
fin;
define-nueva-instruccion cuenta-unos como
inicio
    mira-este;
    mientras frente-libre hacer
    inicio
        mira-norte;
        cuenta(0);
        mira-este;
        avanza;
    fin;
    mira-norte;
    cuenta(0);
fin;

define-nueva-instruccion recoje(n) como
inicio
    si frente-libre entonces
    inicio
        si junto-a-zumbador entonces
        inicio
            coge-zumbador;
            recoje(sucede(n));
        fin
        sino
        inicio
            avanza;
            recoje(n);
        fin;
    fin
    sino
    inicio
        si junto-a-zumbador entonces
        inicio
            coge-zumbador;
            recoje(sucede(n));
        fin
        sino
        inicio
            mira-oeste;
            mientras frente-libre hacer avanza;
            repetir n veces deja-zumbador;
        fin;
    fin;

fin;

    inicia-ejecucion
        simula;
        cuenta-unos;
        mira-oeste;
        mientras frente-libre hacer avanza;
        mira-este;
        recoje(0);
        apagate;
    termina-ejecucion
finalizar-programa
