iniciar-programa

define-nueva-instruccion norte como mientras no-orientado-al-norte hacer gira-izquierda;
define-nueva-instruccion oeste como mientras no-orientado-al-oeste hacer gira-izquierda;
define-nueva-instruccion este como mientras no-orientado-al-este hacer gira-izquierda;
define-nueva-instruccion sur como mientras no-orientado-al-sur hacer gira-izquierda;

   define-nueva-instruccion cuantos como inicio
       si frente-libre entonces inicio
           avanza;
           cuantos;
       fin sino inicio
           mientras junto-a-zumbador hacer coge-zumbador;
       fin;
       deja-zumbador;
   fin;

    define-nueva-instruccion cuenta como inicio
        sur;
        mientras frente-libre hacer avanza;
        oeste;
        cuantos;
        apagate;
    fin;

   define-nueva-instruccion caer(a) como inicio
       repetir precede(a) veces inicio
            repetir a veces deja-zumbador;
            si frente-libre entonces inicio
                avanza;
            fin sino inicio
                cuenta;
            fin;
       fin;

       repetir a veces deja-zumbador;
       si frente-bloqueado entonces cuenta;
       este;
       si frente-libre entonces inicio
           avanza;
           sur;
       fin sino inicio
           cuenta;
       fin;
       caer(sucede(a));
   fin;

    define-nueva-instruccion bajar como inicio
        si junto-a-zumbador entonces inicio
            este;
            si frente-libre entonces inicio
                avanza;
            fin sino inicio
                cuenta;
            fin;
        fin;
        sur;
        caer(1);
    fin;

    define-nueva-instruccion subir(x) como inicio
        si junto-a-zumbador entonces inicio
            coge-zumbador;
            subir(sucede(x));

            repetir precede(x) veces inicio
                repetir x veces deja-zumbador;
                si frente-libre entonces inicio
                    avanza;
                fin sino inicio
                    bajar;
                fin;
            fin;                         

           repetir x veces deja-zumbador;
           si frente-bloqueado y no si-es-cero (precede(precede(x))) entonces bajar;
           este;
           si frente-libre entonces inicio
               avanza;
               norte;
           fin sino inicio
               cuenta;
           fin;

        fin;
    fin;

    inicia-ejecucion
        norte;
        si junto-a-zumbador entonces inicio
            subir(1);
        fin;
        bajar;
        apagate;
    termina-ejecucion
finalizar-programa
