iniciar-programa

define-nueva-instruccion gira-derecha como
inicio
  repetir 3 veces
    gira-izquierda;
fin;

define-nueva-instruccion siguiente-columna como
inicio
  si orientado-al-norte entonces
  inicio
    si derecha-libre entonces
    inicio
      gira-derecha;
      avanza;
      gira-izquierda;
    fin;
  fin
  sino
  si orientado-al-sur entonces
  inicio
    si izquierda-libre entonces
    inicio
      gira-izquierda;
      avanza;
      gira-derecha;
    fin;
  fin;
fin;

define-nueva-instruccion aventar(n) como
inicio
  si frente-libre entonces
  inicio
    si no(si-es-cero(n)) entonces
    inicio
      repetir precede(n) veces
      inicio
        si frente-libre entonces
        inicio
          avanza;
        fin;
      fin;
      si frente-libre entonces
      inicio
        siguiente-columna;
        aventar(precede(n));
      fin;
    fin;
  fin;
fin;

define-nueva-instruccion caer(n) como
inicio
  si orientado-al-sur entonces
  inicio
    siguiente-columna;
    si frente-libre entonces
    inicio
    repetir sucede(n) veces
    inicio
      si frente-libre entonces
      inicio
        avanza;
      fin sino
      inicio
          sal-de-instruccion;
      fin;
    fin;
    caer(sucede(n));
    fin;
  fin;
fin;

define-nueva-instruccion fuerza(n) como
inicio
  si junto-a-zumbador entonces
  inicio
    coge-zumbador;
    fuerza(sucede(n));
  fin
  sino
  inicio
    aventar(n);
    si frente-bloqueado entonces
      siguiente-columna;
    repetir 2 veces
      gira-izquierda;
  fin;
fin;

define-nueva-instruccion medir(n) como
inicio
  si frente-libre entonces
  inicio
    avanza;
    medir(sucede(n));
  fin
  sino
    repetir n veces
      deja-zumbador;
fin;

  inicia-ejecucion
    mientras no-orientado-al-norte hacer gira-izquierda;
    si frente-bloqueado y orientado-al-norte entonces
    inicio
        repetir 2 veces gira-izquierda;
        si frente-bloqueado y orientado-al-sur entonces
        inicio
            gira-izquierda;
            mientras junto-a-zumbador hacer coge-zumbador;
            si frente-bloqueado entonces
            inicio
                deja-zumbador;
                repetir 2 veces gira-izquierda;
                apagate;
            fin sino
            inicio
                repetir 2 veces deja-zumbador;
                repetir 2 veces gira-izquierda;
                apagate;
            fin;
        fin sino
        inicio
            mientras no-orientado-al-norte hacer gira-izquierda;
        fin;
    fin;
    fuerza(0);
    caer(0);
    gira-derecha;
    medir(1);
    apagate;
  termina-ejecucion
finalizar-programa

