iniciar-programa
define-nueva-instruccion g(x) como repetir x veces gira-izquierda;
define-nueva-instruccion arcoiris como inicio
 mientras junto-a-zumbador y frente-libre  hacer avanza;
si no-junto-a-zumbador entonces g(2);
 si no-junto-a-zumbador entonces avanza;
 g(3);
si frente-libre  entonces  avanza;
si frente-bloqueado y orientado-al-este o frente-bloqueado y  orientado-al-oeste o frente-bloqueado y orientado-al-sur o frente-bloqueado y orientado-al-norte entonces g(2);
 si junto-a-zumbador entonces arcoiris;
 si no-junto-a-zumbador entonces inicio
 g(2);
 si no-junto-a-zumbador y frente-libre entonces avanza;
 si frente-libre y junto-a-zumbador entonces avanza;
fin;
 si junto-a-zumbador entonces arcoiris;
fin;
define-nueva-instruccion separa como inicio
  si junto-a-zumbador entonces inicio
    coge-zumbador;
    si no-junto-a-zumbador entonces inicio
    avanza;
    si no-junto-a-zumbador entonces inicio
    g(2);
    avanza;
    avanza;
    fin;
    arcoiris;
    si frente-bloqueado y derecha-bloqueada entonces inicio
     g(2);
     mientras frente-libre hacer avanza;
    fin;
    g(3);
    avanza;
    g(3);
    mientras frente-libre hacer avanza;
   sal-de-instruccion;
    fin;
  si junto-a-zumbador entonces inicio
    coge-zumbador;
      si no-junto-a-zumbador entonces inicio
      avanza;
       si no-junto-a-zumbador entonces inicio
       g(2);
       avanza;
    avanza;
    fin;
      arcoiris;
       si frente-bloqueado y derecha-bloqueada entonces inicio
     g(2);
     mientras frente-libre hacer avanza;
    fin;
      g(3);
      avanza;
      g(1);
      sal-de-instruccion;
      fin;
  fin;
fin;
si junto-a-zumbador entonces separa;
fin;
define-nueva-instruccion cuenta(d) como inicio
si junto-a-zumbador entonces inicio
  coge-zumbador;
  cuenta(sucede(d));
fin;
si si-es-cero (d) entonces inicio
 g(2);
 avanza;
 si derecha-bloqueada entonces g(1);
 si izquierda-bloqueada entonces g(3);
 avanza;
sal-de-instruccion;
fin;
si no-junto-a-zumbador y frente-libre entonces repetir d veces deja-zumbador;
si junto-a-zumbador y frente-libre entonces separa;
 deja-zumbador;
fin;
define-nueva-instruccion sumbador(p) como inicio
  si junto-a-zumbador entonces inicio
  coge-zumbador;
  sumbador(sucede(p));
  fin;
  g(2);
  mientras frente-libre hacer avanza;
  g(1);
  mientras frente-libre hacer avanza;
  g(1);
  mientras derecha-bloqueada hacer avanza;
  mientras no-orientado-al-este hacer gira-izquierda;
  avanza;
  repetir p veces deja-zumbador;
  apagate;
fin;
   inicia-ejecucion
  mientras no-orientado-al-norte hacer g(1);
    mientras junto-a-zumbador hacer inicio
    arcoiris;
    g(2);
    avanza;
    g(1);
    cuenta(0);
      fin;
      g(2);
      avanza;
      g(1);
      avanza;

      mientras junto-a-zumbador hacer inicio
      coge-zumbador;
      g(2);

      mientras frente-libre   hacer inicio
      mientras frente-libre hacer avanza;
      si no-junto-a-zumbador y izquierda-bloqueada entonces inicio
      g(2);
      mientras frente-libre hacer avanza;
      mientras junto-a-zumbador hacer coge-zumbador;
      g(1);
      mientras frente-libre hacer avanza;
      g(1);
      mientras derecha-bloqueada hacer avanza;
      mientras no-orientado-al-este hacer gira-izquierda;
      avanza;
       apagate;
      fin;
      fin;
      fin;
      g(2);
      mientras frente-libre hacer avanza;
      sumbador(0);
       apagate;
    termina-ejecucion
finalizar-programa
