iniciar-programa

define-nueva-instruccion gira (n) como inicio
repetir n veces gira-izquierda;
fin;

define-nueva-instruccion mover como inicio
    si junto-a-zumbador entonces inicio
        coge-zumbador;
        mover;
        deja-zumbador;
    fin
    sino inicio
    avanza;
    fin;
fin;
define-nueva-instruccion intercambia (s) como inicio
    si junto-a-zumbador entonces inicio
       coge-zumbador;
       intercambia (sucede(s));
    fin
    sino inicio
    avanza;
    gira (2);
    mover;
    gira (2);
    avanza;
    gira (2);
    repetir s veces deja-zumbador;
    avanza;
    fin;

fin;

define-nueva-instruccion sort1 (m) como inicio
       si junto-a-zumbador y no si-es-cero (m) entonces inicio
          coge-zumbador;
          sort1 (precede(m));
          deja-zumbador;
          fin
       sino inicio
       si no-junto-a-zumbador entonces gira (2);


       fin;
fin;

define-nueva-instruccion sort (m) como inicio
     si junto-a-zumbador entonces inicio
         coge-zumbador;
         sort (sucede(m));
     fin
     sino inicio
         repetir m veces deja-zumbador;
         avanza;
         sort1 (m);

     fin;


fin;

define-nueva-instruccion ordena (k) como inicio
si no si-es-cero (k) entonces inicio
    repetir k veces inicio
    sort (0);
    si orientado-al-oeste entonces intercambia (0);
    fin;

    gira (2);
    mientras frente-libre hacer avanza;
    gira (2);
    ordena (precede(k));
    fin;
fin;


define-nueva-instruccion num (k) como inicio
    si frente-libre y junto-a-zumbador entonces inicio
        avanza;
        num (sucede(k));

    fin
    sino inicio
       gira (2);
       mientras frente-libre hacer avanza;
       gira (2);
       ordena (k);
    fin;

fin;


define-nueva-instruccion mat (i) como inicio
    si junto-a-zumbador entonces inicio
       coge-zumbador;
       mat (sucede(i));
    fin
    sino inicio
        si frente-libre entonces avanza;
        mientras junto-a-zumbador y frente-libre hacer inicio
        repetir i veces coge-zumbador;
        si no-junto-a-zumbador y frente-libre entonces inicio
        avanza;
        fin






        sino inicio

        si junto-a-zumbador entonces repetir i veces deja-zumbador;
       gira (2);
       mientras frente-libre hacer avanza;

fin;
fin;
si orientado-al-este entonces inicio
si frente-bloqueado entonces inicio
    gira (2);
    mientras frente-libre hacer avanza;
    deja-zumbador;
    deja-zumbador;
    apagate;
fin;
    gira (2);
    mientras frente-libre hacer avanza;

    deja-zumbador;
    apagate;
fin;
gira (2);
       deja-zumbador;
       avanza;
       mientras frente-libre y no junto-a-zumbador hacer avanza;
       fin;
fin;

    inicia-ejecucion
    num (0);

    si no-junto-a-zumbador entonces avanza;
    mientras junto-a-zumbador hacer mat (0);
    gira (2);
    mientras frente-libre hacer avanza;

        apagate;
    termina-ejecucion
finalizar-programa
 