iniciar-programa

    define-nueva-instruccion orientar-al-norte como
    inicio
        mientras no-orientado-al-norte hacer
        inicio
            gira-izquierda;
        fin;
    fin;

    define-nueva-instruccion orientar-al-sur como
    inicio
        mientras no-orientado-al-sur hacer
        inicio
            gira-izquierda;
        fin;
    fin;

    define-nueva-instruccion orientar-al-este como
    inicio
        mientras no-orientado-al-este hacer
        inicio
            gira-izquierda;
        fin;
    fin;

    define-nueva-instruccion orientar-al-oeste como
    inicio
        mientras no-orientado-al-oeste hacer
        inicio
            gira-izquierda;
        fin;
    fin;

    define-nueva-instruccion gira-derecha como
    inicio
        repetir 3 veces
        inicio
            gira-izquierda;
        fin;
    fin;

    define-nueva-instruccion gira-doble como
    inicio
        repetir 2 veces
        inicio
            gira-izquierda;
        fin;
    fin;

    define-nueva-instruccion camina como
    inicio
        mientras frente-libre hacer
        inicio
            avanza;
        fin;
    fin;

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

    define-nueva-instruccion esquina como
    inicio
        gira-izquierda;
        avanza;
        deja(0);
        gira-izquierda;
        avanza;
        deja(0);
        gira-izquierda;
        avanza;
        deja(0);
        gira-izquierda;
        avanza;
    fin;

    define-nueva-instruccion banderas como
    inicio
        orientar-al-este;
        si (derecha-bloqueada y frente-bloqueado) entonces
        inicio
           esquina;
        fin
        sino
        inicio
            si (frente-bloqueado y izquierda-bloqueada) entonces
            inicio
               orientar-al-norte;
               esquina;
               apagate;
            fin
            sino
            inicio
                si (frente-libre y derecha-bloqueada) entonces
                inicio
                   avanza;
                   gira-izquierda;
                   deja(0);
                   avanza;
                   gira-izquierda;
                   deja(0);
                   avanza;
                   deja(0);
                   si frente-libre entonces
                   inicio
                       avanza;
                       deja(0);
                       gira-izquierda;
                       avanza;
                       deja(0);
                   fin;
                   gira-izquierda;
                   avanza;
                   orientar-al-este;
                fin
                sino
                inicio
                    si (frente-libre y izquierda-bloqueada) entonces
                    inicio
                       avanza;
                       deja(0);
                       gira-derecha;
                       avanza;
                       deja(0);
                       gira-derecha;
                       avanza;
                       deja(0);
                       si frente-libre entonces
                       inicio
                           avanza;
                           deja(0);
                           gira-derecha;
                           avanza;
                           deja(0);
                       fin;
                       gira-derecha;
                       avanza;
                       orientar-al-este;
                    fin
                    sino
                    inicio
                        si (frente-bloqueado y (derecha-libre y izquierda-libre)) entonces
                        inicio
                           repetir 3 veces
                           inicio
                           gira-izquierda;
                           avanza;
                           deja(0);
                           fin;
                           avanza;
                           repetir 2 veces
                           inicio
                               deja(0);
                               gira-izquierda;
                               avanza;
                           fin;
                           orientar-al-este;
                        fin
                        sino
                        inicio
                            si (frente-libre y (derecha-libre y izquierda-libre)) entonces
                            inicio
                               gira-derecha;
                               avanza;
                               deja(0);
                               gira-izquierda;
                               avanza;
                               deja(0);
                               gira-izquierda;
                               avanza;
                               deja(0);
                               avanza;
                               deja(0);
                               gira-izquierda;
                               avanza;
                               deja(0);
                               si frente-bloqueado entonces
                               inicio
                                  gira-izquierda;
                                  avanza;
                                  orientar-al-este;
                               fin
                               sino
                               inicio
                                   avanza;
                                   deja(0);
                                   gira-izquierda;
                                   avanza;
                                   deja(0);
                                   avanza;
                                   deja(0);
                                   gira-izquierda;
                                   avanza;
                                   gira-izquierda;
                                   avanza;
                                   orientar-al-este;
                               fin;
                            fin;
                        fin;
                    fin;
                fin;
            fin;
        fin;
    fin;

    define-nueva-instruccion revisa(x) como
    inicio
        si junto-a-zumbador entonces
        inicio
           coge-zumbador;
           revisa(sucede(x));
        fin
        sino
        inicio
            repetir x veces
            inicio
                deja-zumbador;
            fin;
      si si-es-cero(precede(precede(precede(precede(precede(precede(precede(precede(precede(x)))))))))) entonces
            inicio
                banderas;
            fin
            sino
            inicio

            fin;
        fin;
    fin;

    define-nueva-instruccion volver-a-k como
    inicio
        orientar-al-sur;
        camina;
        orientar-al-oeste;
        camina;
        orientar-al-este;
    fin;

    define-nueva-instruccion revisacion(t) como
    inicio
        si junto-a-zumbador entonces
        inicio
            coge-zumbador;
            revisacion(sucede(t));
        fin
        sino
        inicio
            repetir t veces
            inicio
                deja-zumbador;
            fin;
       si si-es-cero(precede(precede(precede(precede(precede(precede(precede(precede(precede(t)))))))))) entonces
            inicio
                si frente-libre entonces
                inicio
                   gira-doble;
                   avanza;
                   deja(0);
                   gira-doble;
                   avanza;
                   avanza;
                   deja(0);
                   gira-doble;
                   avanza;
                   gira-doble;
                fin
                sino
                inicio
                    gira-doble;
                    avanza;
                    deja(0);
                    gira-doble;
                    avanza;
                fin;
            fin;
        fin;
    fin;

    define-nueva-instruccion parche como
    inicio
        si (derecha-bloqueada y izquierda-bloqueada) entonces
        inicio
            si junto-a-zumbador entonces
            inicio
                si frente-libre entonces
                inicio
                    avanza;
                fin
                sino
                inicio
                    apagate;
                fin;
                si no-junto-a-zumbador entonces
                inicio
                    deja-zumbador;
                fin;
            fin;
            volver-a-k;
            mientras frente-libre hacer
            inicio
                avanza;
                revisacion(0);
            fin;
            apagate;
        fin;
    fin;

    define-nueva-instruccion parche-2 como
    inicio
        orientar-al-norte;
        si (derecha-bloqueada y izquierda-bloqueada) entonces
        inicio
            si junto-a-zumbador entonces
            inicio
                si frente-libre entonces
                inicio
                    avanza;
                fin
                sino
                inicio
                    apagate;
                fin;
                si no-junto-a-zumbador entonces
                inicio
                    deja-zumbador;
                fin;
            fin;
            volver-a-k;
            orientar-al-norte;
            mientras frente-libre hacer
            inicio
                avanza;
                revisacion(0);
            fin;
            apagate;
        fin;
    fin;

    inicia-ejecucion
        volver-a-k;
        parche-2;
        volver-a-k;
        parche;
        mientras (no(frente-bloqueado y izquierda-bloqueada)) hacer
        inicio
            si junto-a-zumbador entonces
            inicio
                revisa(0);
            fin;
            mientras frente-libre hacer
            inicio
                avanza;
                revisa(0);
            fin;
            gira-doble;
            camina;
            gira-derecha;
            si frente-libre entonces
            inicio
                avanza;
                gira-derecha;
            fin
            sino
            inicio
                gira-derecha;
                camina;
            fin;
        fin;
        apagate;
    termina-ejecucion
finalizar-programa
