iniciar-programa
    define-nueva-instruccion gira(g) como inicio
       repetir g veces gira-izquierda;
    fin;
    define-nueva-instruccion muevete(m) como inicio
       si si-es-cero(m) entonces inicio
          mientras frente-libre hacer avanza;
       fin sino inicio
          si si-es-cero(precede(m)) entonces inicio
             mientras junto-a-zumbador y frente-libre hacer avanza;
          fin sino inicio
             si si-es-cero(precede(precede(m))) entonces inicio
                mientras no-junto-a-zumbador y frente-libre hacer avanza;
             fin;
          fin;
       fin;
    fin;
    define-nueva-instruccion esquina(e) como inicio
       gira(e);
       avanza;
    fin;
    define-nueva-instruccion portero como inicio
       si junto-a-zumbador entonces inicio
          coge-zumbador;
          portero;
          si frente-bloqueado entonces inicio
             gira(2);
          fin sino inicio
             avanza;
          fin;
       fin sino inicio
          muevete(0);
       fin;
    fin;
    define-nueva-instruccion base(b) como inicio
       si junto-a-zumbador entonces inicio
          coge-zumbador;
          base(b);
          gira-izquierda;
          repetir b veces inicio
             deja-zumbador;
             si frente-libre entonces avanza;
          fin;
          gira(2);
          muevete(0);
          esquina(1);
       fin sino inicio
          esquina(2);
          avanza;
          portero;
          deja-zumbador;
       fin;
    fin;
    define-nueva-instruccion alto(a) como inicio
       si junto-a-zumbador entonces inicio
          coge-zumbador;
          alto(sucede(a));
       fin sino inicio
          avanza;
          base(a);
       fin;
    fin;
    define-nueva-instruccion es-derecha como inicio
       si frente-libre entonces inicio
          avanza;
          es-derecha;
          deja-zumbador;
       fin sino inicio
          gira(3);
          muevete(0);
          esquina(1);
          deja-zumbador;
       fin;
    fin;
    define-nueva-instruccion descuento(d) como inicio
       si frente-libre entonces inicio
          avanza;
          si si-es-cero (precede(d)) entonces inicio
             gira(2);
             muevete(0);
             gira(2);
             es-derecha;
          fin sino inicio
             descuento(precede(d));
          fin;
       fin sino inicio
          si frente-bloqueado entonces inicio
             gira(3);
             muevete(0);
             esquina(1);
             deja-zumbador;
          fin;
       fin;
    fin;
    define-nueva-instruccion es-izquierda(e) como inicio
       si frente-libre y no-junto-a-zumbador entonces inicio
          avanza;
          es-izquierda(sucede(e));
       fin sino inicio
          si junto-a-zumbador entonces inicio
             muevete(1);
             descuento(e);
          fin sino inicio
             si frente-bloqueado entonces inicio
                gira(3);
                muevete(0);
                esquina(1);
                deja-zumbador;
             fin;
          fin;
       fin;
    fin;
    inicia-ejecucion
        esquina(3);
        avanza;
        alto(0);
        gira(2);
        muevete(2);
        si junto-a-zumbador entonces inicio
           muevete(1);
           si no-junto-a-zumbador entonces inicio
              esquina(2);
              gira(2);
           fin;
        fin;
        gira(3);
        muevete(1);
        si no-junto-a-zumbador entonces inicio
           esquina(2);
           gira(2);
        fin;
        gira-izquierda;
        muevete(0);
        gira(2);
        si junto-a-zumbador entonces inicio
           es-derecha;
        fin sino inicio
           es-izquierda(0);
        fin;
        apagate;
    termina-ejecucion
finalizar-programa
