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:
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.
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);
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.