iniciar-programa

define-nueva-instruccion norte como mientras no-orientado-al-norte hacer gira-izquierda;
define-nueva-instruccion sur como mientras no-orientado-al-sur hacer gira-izquierda;
define-nueva-instruccion choca como mientras frente-libre hacer avanza;

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

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

define-nueva-instruccion next(n) como inicio
    si junto-a-zumbador entonces inicio
        coge-zumbador;
        next(sucede(n));
    fin sino inicio
        repetir precede(n) veces deja-zumbador;
        sur; choca;
        por(n);
    fin;
fin;

define-nueva-instruccion mismo como inicio
    si junto-a-zumbador entonces inicio
        coge-zumbador;
        mismo;
        deja-zumbador;
    fin sino inicio
        choca;
    fin;
fin;

 define-nueva-instruccion multiplica(n) como inicio
     si junto-a-zumbador entonces inicio
         coge-zumbador;
         multiplica(precede(n));
     fin sino inicio
         norte; avanza; avanza;
         repetir n veces inicio
             deja-zumbador;
         fin;
             coge-zumbador;
             si junto-a-zumbador entonces inicio
                 coge-zumbador;
                 sur;
                 avanza;
                 permuta(0);
                 norte;
                 repetir 3 veces avanza;
              fin sino inicio
                  sur;
                  avanza;
                  mismo;
                  norte;
                  repetir 2 veces avanza;
                  (*mismo valor*)
              fiN;
          mientras junto-a-zumbador hacer inicio
              coge-zumbador;
              sur; avanza;
              next(0);
              norte; avanza; avanza; avanza;
          fin;
     fin;
 fiN;

define-nueva-instruccion factorial(n) como inicio
    si junto-a-zumbador entonces inicio
         coge-zumbador;
         factorial(sucede(n));
    fin sino inicio
         repetir n veces deja-zumbador;
         sur; avanza;
         multiplica(n);
    fin;
fin;

    inicia-ejecucion
            avanza; avanza;
            factorial(0);
            apagate;
    termina-ejecucion
finalizar-programa
