iniciar-programa
define-nueva-instruccion a como avanza;
define-nueva-instruccion gi como gira-izquierda;
define-nueva-instruccion mv como repetir 2 veces gi;
define-nueva-instruccion gd como repetir 3 veces gi;
define-nueva-instruccion sa como mientras frente-libre hacer a;
define-nueva-instruccion norte como mientras no-orientado-al-norte hacer gi;
define-nueva-instruccion oeste como mientras no-orientado-al-oeste hacer gi;
define-nueva-instruccion este como mientras no-orientado-al-este hacer gi;
define-nueva-instruccion sur como mientras no-orientado-al-sur hacer gi;
define-nueva-instruccion menor (x ) como
inicio
    si si-es-cero (x) entonces
        mientras junto-a-zumbador hacer coge-zumbador
    sino
    inicio
        si junto-a-zumbador entonces
        inicio
            coge-zumbador;
            menor(precede(x));
        fin
        sino gi;
    fin;
fin;
define-nueva-instruccion dejar(x) como
inicio
    si no si-es-cero (x) entonces
    inicio
        si junto-a-zumbador entonces
        inicio
            coge-zumbador;
            dejar(precede(x));
        fin
        sino repetir x veces deja-zumbador;
    fin;
fin;
define-nueva-instruccion divide(x) como
inicio
    si no si-es-cero (x) entonces
    inicio
        si junto-a-zumbador entonces
        inicio
            coge-zumbador;
            divide(precede(x));
        fin
        sino
        inicio
            repetir x veces deja-zumbador;
            si orientado-al-norte entonces sur
            sino
            norte;
        fin;
    fin;
fin;
define-nueva-instruccion david(x) como
inicio
    si no( frente-bloqueado y izquierda-bloqueada y derecha-bloqueada) entonces
    inicio
    si orientado-al-norte entonces
    inicio
       si junto-a-zumbador entonces
       inicio
       divide(x);
       si orientado-al-norte entonces
       inicio
           david(x);
           repetir x veces deja-zumbador;
       fin
           sino inicio dejar(x); norte; fin;
       fin
       sino
       inicio
           repetir 4 veces
           inicio
               si frente-libre entonces
               inicio
                   a;
                   si junto-a-zumbador o (frente-bloqueado y derecha-bloqueada y izquierda-bloqueada) entonces david(sucede(x));
                   mv;
                   a;
                   mv;
               fin;
               gi;
           fin;
       fin;
    fin
    sino
    inicio
    si orientado-al-este entonces
    inicio
       si junto-a-zumbador entonces
       inicio
           divide(x);
           si no-orientado-al-norte entonces
           inicio
               david(x);
               repetir x veces deja-zumbador;
           fin
               sino
               inicio
                   dejar(x); este;
               fin;
       fin
       sino
       inicio
           repetir 4 veces
           inicio
               si frente-libre entonces
               inicio
                   a;
                   si junto-a-zumbador o (frente-bloqueado y derecha-bloqueada y izquierda-bloqueada) entonces david(sucede(x));
                   mv;
                   a;
                   mv;
               fin;
               gi;
           fin;
       fin;
    fin
    sino
    inicio
        si orientado-al-sur entonces
        inicio
         si junto-a-zumbador entonces
       inicio
           divide(x);
           si no-orientado-al-norte entonces
           inicio
               david(x);
               repetir x veces deja-zumbador;
           fin
           sino
           inicio
               dejar(x); sur;
           fin;
       fin
       sino
       inicio
           repetir 4 veces
           inicio
               si frente-libre entonces
               inicio
                   a;
                   si junto-a-zumbador o (frente-bloqueado y derecha-bloqueada y izquierda-bloqueada) entonces david(sucede(x));
                   mv;
                   a;
                   mv;
               fin;
               gi;
           fin;
       fin;
        fin
        sino
        inicio
         si junto-a-zumbador entonces
       inicio
       divide(x);
       si no-orientado-al-norte entonces
       inicio
           david(x);
           repetir x veces deja-zumbador;
       fin
           sino inicio dejar(x); oeste; fin;
       fin
       sino
       inicio
           repetir 4 veces
           inicio
               si frente-libre entonces
               inicio
                   a;
                   si junto-a-zumbador o (frente-bloqueado y derecha-bloqueada y izquierda-bloqueada) entonces david(sucede(x));
                   mv;
                   a;
                   mv;
               fin;
               gi;
           fin;
       fin;
        fin;
    fin;
    fin;
    fin
    sino
    inicio
        menor(x);
        si frente-bloqueado y derecha-bloqueada y izquierda-bloqueada entonces
        repetir x veces deja-zumbador
        sino
        inicio
            dejar(x);
            gd;
        fin;
    fin;
fin;
    inicia-ejecucion
      david(0);
        apagate;
    termina-ejecucion
finalizar-programa
