Contador de escaleras que cumplen ciertas condiciones.

Colapsar
X
 
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes

  • Contador de escaleras que cumplen ciertas condiciones.

    Por ejemplo "las que 1ero fueron contactadas desde la izquierda". Confirmar que el programa funcione bien es una tarea más larga y aburrida que hacer el programa, pero tal vez si uds ven el código noten algún error. Es de Macromedia Flash, supuestamente Action Script 1.0:
    Código:
    // Programa para contar cosas...
    // relativas a contactos con escaleras.
    //
    // Datos sobre la escalera 1:
    // Lugar por el que fue contactada 1ero:
    Escalera1First = "I";
    // Veces que fue contactada por la izq, etc:
    Escalera1Izq = 3;
    Escalera1Der = 0;
    Escalera1Arr = 0;
    // Lugar por el que fue contactada por última vez:
    Escalera1Last = "I";
    // Datos sobre la escalera 2:
    Escalera2First = "D";
    Escalera2Izq = 0;
    Escalera2Der = 2;
    Escalera2Arr = 0;
    Escalera2Last = "D";
    // 3:
    Escalera3First = "I";
    Escalera3Izq = 1;
    Escalera3Der = 0;
    Escalera3Arr = 0;
    Escalera3Last = "I";
    // 4:
    Escalera4First = "D";
    Escalera4Izq = 2;
    Escalera4Der = 1;
    Escalera4Arr = 1;
    Escalera4Last = "I";
    // 5:
    Escalera5First = "A";
    Escalera5Izq = 1;
    Escalera5Der = 0;
    Escalera5Arr = 1;
    Escalera5Last = "I";
    // 6:
    Escalera6First = "D";
    Escalera6Izq = 0;
    Escalera6Der = 1;
    Escalera6Arr = 0;
    Escalera6Last = "D";
    // 7:
    Escalera7First = "I";
    Escalera7Izq = 1;
    Escalera7Der = 0;
    Escalera7Arr = 0;
    Escalera7Last = "I";
    // Inicio variables para más claridad al ver resultados:
    // Escaleras que 1ero fueron contactadas por la izq:
    Fi = 0;
    // derecha:
    Fd = 0;
    // arriba:
    Fa = 0;
    // Escaleras que fueron contactadas sólo 1 vez:
    T1 = 0;
    // más de 1 vez:
    Ts = 0;
    // Escaleras que sólo fueron contactadas por (lado):
    Si = 0;
    Sd = 0;
    Sa = 0;
    // Escaleras que por la izquierda fueron contactadas 0 veces:
    I0 = 0;
    // sólo 1 vez:
    I1 = 0;
    // alguna vez (>0):
    Ia = 0;
    // más de una vez:
    Is = 0;
    // Lo mismo pero por la derecha:
    D0 = 0;
    D1 = 0;
    Da = 0;
    Ds = 0;
    // Lo mismo pero por arriba:
    A0 = 0;
    A1 = 0;
    Aa = 0;
    As = 0;
    // Escaleras que por última vez fueron contactadas desde (lado):
    Li = 0;
    Ld = 0;
    La = 0;
    // Escaleras que 1ero y al final fueron contactadas por el mismo lado (e=equal):
    FeL = 0;
    // x=distinto
    FxL = 0;
    // Escaleras que por la izquierda fueron contactadas...
    // la misma cantidad de veces que por la derecha:
    IeD = 0;
    // desde la izquierda menos (l=lees):
    IlD = 0;
    // desde la izquierda más (m=more):
    ImD = 0;
    // lees or equal:
    IleD = 0;
    // equal or more:
    ImeD = 0;
    // diferente:
    IxD = 0;
    // Todo lo mismo pero en vez de derecha, arriba:
    IeA = 0;
    IlA = 0;
    ImA = 0;
    IleA = 0;
    ImeA = 0;
    IxA = 0;
    // Todo lo mismo pero en vez de izquierda, abajo:
    DeA = 0;
    DlA = 0;
    DmA = 0;
    DleA = 0;
    DmeA = 0;
    DxA = 0;
    // Negativas de las que no tienen ya definidas:
    NoFi = 0;
    NoFd = 0;
    NoFa = 0;
    // Por ejemplo "No solo izq" no significa que haya sido...
    // contactada por la izq y por otro lado,
    // sino simplemente que fue contactada por algún lado que...
    // no es izq, independientemente de si fue contactada por izq.
    // Ponerle otro nombre complicaría el programa:
    NoSi = 0;
    NoSd = 0;
    NoSa = 0;
    NoI1 = 0;
    NoIs = 0;
    NoD1 = 0;
    NoDs = 0;
    NoA1 = 0;
    NoAs = 0;
    NoLi = 0;
    NoLd = 0;
    NoLa = 0;
    function NadaAumentado () {
        Variable = 0;
        do {
          Variable++;
          set("DebeAumentarLaVar"+Variable, "No");
        } while (Variable < 43);
    }
    function ParaTotalPorUnLado () {
        if (Res2 == 0) {
            set("DebeAumentarLaVar"+(9+PunteroDeVariables), "Sí");
        } else if (Res2 == 1) {
            set("DebeAumentarLaVar"+(10+PunteroDeVariables), "Sí");
            set("DebeAumentarLaVar"+(11+PunteroDeVariables), "Sí");
        } else if (Res2 > 1) {
            set("DebeAumentarLaVar"+(11+PunteroDeVariables), "Sí");
            set("DebeAumentarLaVar"+(12+PunteroDeVariables), "Sí");
        }
    }
    function ParaRelacionDeTotales () {
        if (Res2 == Res3) {
            set("DebeAumentarLaVar"+(26+PunteroDeVariables), "Sí");
            set("DebeAumentarLaVar"+(29+PunteroDeVariables), "Sí");
            set("DebeAumentarLaVar"+(30+PunteroDeVariables), "Sí");
        } else if (Res2 < Res3) {
            set("DebeAumentarLaVar"+(27+PunteroDeVariables), "Sí");
            set("DebeAumentarLaVar"+(29+PunteroDeVariables), "Sí");
            set("DebeAumentarLaVar"+(31+PunteroDeVariables), "Sí");
        } else {
            set("DebeAumentarLaVar"+(28+PunteroDeVariables), "Sí");
            set("DebeAumentarLaVar"+(30+PunteroDeVariables), "Sí");
            set("DebeAumentarLaVar"+(31+PunteroDeVariables), "Sí");
        }
    }
    // Cosas que pueden contarse:
    // First:
    Nombre1 = "Fi";
    Nombre2 = "Fd";
    Nombre3 = "Fa";
    // Total:
    Nombre4 = "T1";
    Nombre5 = "Ts";
    // Solo:
    Nombre6 = "Si";
    Nombre7 = "Sd";
    Nombre8 = "Sa";
    // Total desde un lado:
    Nombre9 = "I0";
    Nombre10 = "I1";
    Nombre11 = "Ia";
    Nombre12 = "Is";
    Nombre13 = "D0";
    Nombre14 = "D1";
    Nombre15 = "Da";
    Nombre16 = "Ds";
    Nombre17 = "A0";
    Nombre18 = "A1";
    Nombre19 = "Aa";
    Nombre20 = "As";
    // Last:
    Nombre21 = "Li";
    Nombre22 = "Ld";
    Nombre23 = "La";
    // Relación First y Last:
    Nombre24 = "FeL";
    Nombre25 = "FxL";
    // Relación entre el total de un lado y otro:
    Nombre26 = "IeD";
    Nombre27 = "IlD";
    Nombre28 = "ImD";
    Nombre29 = "IleD";
    Nombre30 = "ImeD";
    Nombre31 = "IxD";
    Nombre32 = "IeA";
    Nombre33 = "IlA";
    Nombre34 = "ImA";
    Nombre35 = "IleA";
    Nombre36 = "ImeA";
    Nombre37 = "IxA";
    Nombre38 = "DeA";
    Nombre39 = "DlA";
    Nombre40 = "DmA";
    Nombre41 = "DleA";
    Nombre42 = "DmeA";
    Nombre43 = "DxA";
    //
    Escalera = 0;
    do {
        NadaAumentado();
        Escalera++;
        trace("Analizando datos de la escalera "+Escalera);
        // Ver qué debe aumentar por datos de esta escalera:
        // Resumen:
        Res = "Escalera"+Escalera;
        // First:
        if (eval(Res+"First") == "I") {
            DebeAumentarLaVar1 = "Sí";
        } else if (eval(Res+"First") == "D") {
            DebeAumentarLaVar2 = "Sí";
        } else {
            DebeAumentarLaVar3 = "Sí";
        }
        // Total:
        Contactos = eval(Res+"Izq")+eval(Res+"Der")+eval(Res+"Arr");
        if (Contactos == 1) {
            DebeAumentarLaVar4 = "Sí";
        } else {
            DebeAumentarLaVar5 = "Sí";
        }
        // Sólo por un lado:
        if (Contactos - eval(Res+"Izq") == 0) {
            DebeAumentarLaVar6 = "Sí";
        } else if (Contactos - eval(Res+"Der") == 0) {
            DebeAumentarLaVar7 = "Sí";
        } else if (Contactos - eval(Res+"Arr") == 0) {
            DebeAumentarLaVar8 = "Sí";
        }
        // Total desde un lado:
        Res2 = eval(Res+"Izq");
        PunteroDeVariables = 0;
        ParaTotalPorUnLado();
        Res2 = eval(Res+"Der");
        PunteroDeVariables = 4;
        ParaTotalPorUnLado();
        Res2 = eval(Res+"Arr");
        PunteroDeVariables = 8;
        ParaTotalPorUnLado();
        // Last:
        if (eval(Res+"Last") == "I") {
            DebeAumentarLaVar21 = "Sí";
        } else if (eval(Res+"Last") == "D") {
            DebeAumentarLaVar22 = "Sí";
        } else {
            DebeAumentarLaVar23 = "Sí";
        }
        // Relación First y Last:
        if (eval(Res+"First") == eval(Res+"Last")) {
            DebeAumentarLaVar24 = "Sí";
        } else {
            DebeAumentarLaVar25 = "Sí";
        }
        // Relación entre el total de un lado y otro:
        // Izq y Der:
        Res2 = eval(Res+"Izq");
        Res3 = eval(Res+"Der");
        PunteroDeVariables = 0;
        ParaRelacionDeTotales();
        // Izq y Arr:
        Res3 = eval(Res+"Arr");
        PunteroDeVariables = 6;
        ParaRelacionDeTotales();
        // Der y Arr:
        Res2 = eval(Res+"Der");
        PunteroDeVariables = 12;
        ParaRelacionDeTotales();
        // Aaumentar variables marcadas como que deben aumentar:
        Variable = 0;
        do {
            Variable++;
            if (eval("DebeAumentarLaVar"+Variable) == "Sí") {
                // La variable está marcada como que debe aumentar, aumenta:
                set(eval("Nombre"+Variable), eval(eval("Nombre"+Variable))+1);
                if (eval("Nombre"+Variable) == "Fi") {
                    trace("Aumentó Fi");
                }
                // Aumentar las mezclas "o" con otras,
                // y si corresponde, las "y":
                Variable2 = Variable+1;
                while (Variable2 < 43) {
                    set(eval("Nombre"+Variable)+"o"+eval("Nombre"+Variable2), eval(eval("Nombre"+Variable)+"o"+eval("Nombre"+Variable2))+1);
                    if (eval("Nombre"+Variable2) == "T1") {
                        trace("Aumentó FioT1");
                    }
                    if (eval("DebeAumentarLaVar"+Variable2) == "Sí") {
                        set(eval("Nombre"+Variable)+"y"+eval("Nombre"+Variable2), eval(eval("Nombre"+Variable)+"y"+eval("Nombre"+Variable2))+1);
                    }
                    Variable2++;
                }
            } else {
                if (eval("Nombre"+Variable) == "Fi") {
                    trace("Fi no aumentó");
                }
                // Ver si su negativa existe:
                if (eval("No"+eval("Nombre"+Variable)) != undefined) {
                    // Aumenta:
                    set("No"+eval("Nombre"+Variable), eval("No"+eval("Nombre"+Variable))+1);
                }
                // Ver si alguna mezcla debe aumentar:
                Variable2 = Variable+1;
                while (Variable2 < 43) {
                    if (eval("DebeAumentarLaVar"+Variable2) == "Sí") {
                        set(eval("Nombre"+Variable)+"o"+eval("Nombre"+Variable2), eval(eval("Nombre"+Variable)+"o"+eval("Nombre"+Variable2))+1);
                        if (eval("Nombre"+Variable2) == "T1") {
                            trace("Aumentó FioT1");
                        }
                    }
                    Variable2++;
                }
            }
        } while (Variable < 43);
    } while (Escalera<7);​​
    La lista de variables es tan larga que por las dudas no la pongo, pero por ejemplo:
    Variable _level0.Fi = 3
    Variable _level0.Fd = 3
    Variable _level0.Fa = 1
    Variable _level0.T1 = 3
    Variable _level0.Ts = 4​
    ...
    Variable _level0.NoFi = 4
    Variable _level0.NoFd = 4
    Variable _level0.NoFa = 6
    Variable _level0.NoSi = 4
    Variable _level0.NoSd = 5​
    ...
    Variable _level0.FioFd = 6
    Variable _level0.FioFa = 4
    Variable _level0.FioT1 = 4
    Variable _level0.FioTs = 6
    Variable _level0.FiyTs = 1​

    A ver, algunas explicaciones, pero será mejor que pregunten.

    Las variables que tienen una "o" significan que cuentan (o deberían contar) las veces que una escalera cumple una condición u otra.
    Las que dicen "y" deberían contar las veces que una escalera cumple las 2 condiciones que dice la variable.
    Son combinaciones de condiciones.

    La idea es ahorrar tiempo. Son datos que pueden deducirse a partir de los datos iniciales al principio del código. La idea es que los deduzca el programa. Hay combinaciones que son un sin sentido, que siempre van a dar 0 o el mismo valor de 1 parte, si la otra es redundante, pero evitar que sucedan ciertas combinaciones implicaría más código y más tiempo dedicado, así que quedó así.

    Me cuesta entender el programa, pero a ver, para que se produzcan las combinaciones me pareció que lo más sencillo era que las posibilidades estuvieran en una lista y un par de contadores en whiles vayan variando. Para eso cree la lista de variables, o sea, no sólo existen las variables (los contadores de cosas relativas a escaleras), sino una lista de ellas: Nombre1, Nombre2, etc, cuyos valores indican a las variables. Asi, usando contador en un while, se indica la variable, o más bien su nombre, que ha de combinarse con otras.

    También hay variables que indican si las variables simples deben aumentar, así cuando se combinan se sabe si deben aumentar o no.
Trabajando...
X