iniciar-programa
define-nueva-instruccion a como si frente-libre entonces si junto-a-zumbador entonces apagate sino avanza;
define-nueva-instruccion gi como gira-izquierda;
define-nueva-instruccion mv como repetir 2 veces gi;
define-nueva-instruccion gd como repetir 3 veces gi;
define-nueva-instruccion sa como mientras frente-libre hacer a;
define-nueva-instruccion norte como mientras no-orientado-al-norte hacer gi;
define-nueva-instruccion oeste como mientras no-orientado-al-oeste hacer gi;
define-nueva-instruccion este como mientras no-orientado-al-este hacer gi;
define-nueva-instruccion sur como mientras no-orientado-al-sur hacer gi;
define-nueva-instruccion avanzar(x) como
inicio
    si no si-es-cero (x) entonces
    inicio
    si frente-libre entonces
    inicio
        si izquierda-bloqueada entonces
        inicio
            a;
            avanzar(precede(x));
            a;
        fin
        sino
        inicio
            gi;
            a;
            avanzar(precede(x));
            a;
            gd;
        fin;
    fin
    sino
    inicio
        si frente-bloqueado y izquierda-libre entonces
        inicio
           gi;
            a;
            avanzar(precede(x));
            a;
            gd;
        fin
        sino
        inicio
        si frente-bloqueado y derecha-libre entonces
        inicio
            gd;
            a;
            avanzar(precede(x));
            a;
            gi;
        fin
        sino
        inicio
            si frente-bloqueado y derecha-bloqueada y izquierda-bloqueada entonces
            inicio
                mv;
                a;
                avanzar(precede(x));
                a;
                mv;
            fin;
        fin;
    fin;
    fin;
    fin
    sino
    inicio
        mv;
    fin;
fin;
define-nueva-instruccion avanzaros(x) como
inicio
    si no si-es-cero (x) entonces
    inicio
    si frente-libre entonces
    inicio
        si derecha-bloqueada entonces
        inicio
            a;
            avanzaros(precede(x));
            a;
        fin
        sino
        inicio
            gd;
            a;
            avanzaros(precede(x));
            a;
            gi;
        fin;
    fin
    sino
    inicio
        si frente-bloqueado y derecha-libre entonces
        inicio
            gd;
            a;
            avanzaros(precede(x));
            a;
            gi;
        fin
        sino
        inicio
        si frente-bloqueado y izquierda-libre entonces
        inicio
            gi;
            a;
            avanzaros(precede(x));
            a;
            gd;
        fin
        sino
        inicio
            si frente-bloqueado y derecha-bloqueada y izquierda-bloqueada entonces
            inicio
                mv;
                a;
                avanzaros(precede(x));
                a;
                mv;
            fin;
        fin;
    fin;
    fin;
    fin
    sino
    inicio
        mv;
    fin;
fin;
define-nueva-instruccion killi(x) como
inicio
    si junto-a-zumbador entonces apagate;
    mientras frente-libre hacer gi;
    si frente-bloqueado y izquierda-libre y derecha-libre entonces
    inicio
        gd;
        avanzar(x);
    fin
    sino
    inicio
        si izquierda-bloqueada y derecha-libre y frente-bloqueado entonces
        inicio
            gd;
            avanzar(x);
        fin
        sino
        si izquierda-libre y derecha-bloqueada y frente-bloqueado entonces
        inicio
            gi;
            avanzar(x);
        fin
        sino
        inicio
            si izquierda-bloqueada y frente-bloqueado y derecha-bloqueada entonces
            inicio
                gd;
                avanzar(x);
            fin;
        fin;
    fin;
fin;
define-nueva-instruccion killd(x) como
inicio
    mientras frente-libre hacer gi;
    si frente-bloqueado y izquierda-libre y derecha-libre entonces
    inicio
        gi;
        avanzaros(x);
    fin
    sino
    inicio
        si izquierda-bloqueada y derecha-libre y frente-bloqueado entonces
        inicio
            gi;
            avanzaros(x);
        fin
        sino
        si izquierda-libre y derecha-bloqueada y frente-bloqueado entonces
        inicio
            mv;
            avanzaros(x);
        fin
        sino
        inicio
            si izquierda-bloqueada y frente-bloqueado y derecha-bloqueada entonces
            inicio
                mv;
                avanzaros(x);
            fin;
        fin;
    fin;
fin;
    inicia-ejecucion
    killi(4);
    killd(16);
    killi(55);
    killd(156);
    killi(530);
    killd(1500);
    killi(1500);
    apagate;
    termina-ejecucion
finalizar-programa
