iniciar-programa

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

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

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

    define-nueva-instruccion 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 sobrante(x) como
    inicio
         si no-junto-a-zumbador entonces
         inicio
               norte;
               si frente-libre entonces
               inicio
                   avanza;
                   si no-junto-a-zumbador entonces
                   inicio
                      sur;
                      avanza;
                   fin
                   sino
                   inicio
                       sobrante(x);
                   fin;
               fin;
               sur;
               si frente-libre entonces
               inicio
                   avanza;
                   si no-junto-a-zumbador entonces
                   inicio
                      norte;
                      avanza;
                   fin
                   sino
                   inicio
                       sobrante(x);
                   fin;
               fin;
               oeste;
               si frente-libre entonces
               inicio
                   avanza;
                   si no-junto-a-zumbador entonces
                   inicio
                      este;
                      avanza;
                   fin
                   sino
                   inicio
                       sobrante(x);
                   fin;
               fin;
               este;
               si frente-libre entonces
               inicio
                   avanza;
                   si junto-a-zumbador entonces
                   inicio
                      sobrante(x);
                   fin
                   sino
                   inicio
                       si si-es-cero(x) entonces
                       inicio
                            repetir 5 veces
                            inicio
                                deja-zumbador;
                            fin;
                            apagate;
                       fin
                       sino
                       inicio
                           oeste;
                           avanza;
                           repetir x veces
                           inicio
                               deja-zumbador;
                           fin;
                           apagate;
                       fin;
                   fin;
               fin
               sino
               inicio
                   repetir x veces
                   inicio
                       deja-zumbador;
                   fin;
                   apagate;
               fin;
        fin
        sino
        inicio
            coge-zumbador;
            si junto-a-zumbador entonces
            inicio
               mientras junto-a-zumbador hacer
               inicio
                   coge-zumbador;
               fin;
               sobrante(sucede(x));
            fin
            sino
            inicio
                sobrante(x);
            fin;
        fin;
    fin;

    define-nueva-instruccion ruta(x) como
    inicio
        si (no(si-es-cero(x))) entonces
        inicio
           si no-junto-a-zumbador entonces
           inicio
               norte;
               si frente-libre entonces
               inicio
                   avanza;
                   si no-junto-a-zumbador entonces
                   inicio
                      sur;
                      avanza;
                   fin
                   sino
                   inicio
                       ruta(x);
                   fin;
               fin;
               sur;
               si frente-libre entonces
               inicio
                   avanza;
                   si no-junto-a-zumbador entonces
                   inicio
                      norte;
                      avanza;
                   fin
                   sino
                   inicio
                       ruta(x);
                   fin;
               fin;
               oeste;
               si frente-libre entonces
               inicio
                   avanza;
                   si no-junto-a-zumbador entonces
                   inicio
                      este;
                      avanza;
                   fin
                   sino
                   inicio
                       ruta(x);
                   fin;
               fin;
               este;
               si frente-libre entonces
               inicio
                   avanza;
                   si junto-a-zumbador entonces
                   inicio
                      ruta(x);
                   fin
                   sino
                   inicio
                       repetir 5 veces
                       inicio
                           deja-zumbador;
                       fin;
                       apagate;
                   fin;
               fin;
        fin
        sino
        inicio
            coge-zumbador;
            si junto-a-zumbador entonces
            inicio
                mientras junto-a-zumbador hacer
                inicio
                    coge-zumbador;
                fin;
                ruta(precede(x));
            fin
            sino
            inicio
                ruta(x);
            fin;
            fin;
        fin
        sino
        inicio
            sobrante(0);
        fin;
    fin;

    define-nueva-instruccion cuenta(x) como
    inicio
        si junto-a-zumbador entonces
        inicio
           coge-zumbador;
           cuenta(sucede(x));
        fin
        sino
        inicio
            ruta(x);
        fin;
    fin;

    inicia-ejecucion
        cuenta(0);
        apagate;
    termina-ejecucion
finalizar-programa
