Autor Tema: ¿Cómo hago un programa que genere el repetitivo código que preciso

0 Usuarios y 1 Visitante están viendo este tema.

11 Octubre, 2024, 04:12 am
Leído 610 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Tengo datos sobre 7 escaleras:
- Por dónde el personaje tocó 1ero cada una.
- Cuántas veces tocó cada una desde la izquierda.
- Desde la derecha.
- Desde arriba.
- Por dónde tocó cada una por última vez.

No hay desde abajo.

Entonces las variables de la escalera 1 pueden ser:
Escalera1First = "Izq";
Escalera1Izq = 3;
Escalera1Der = 0;
Escalera1Arr = 1;
Escalera1Last = "Arr";

Las otras 6 escaleras tienen 5 variables así también. Pregunté en un foro cómo hacerlo con arrays pero no me respondieron y me sale mejor así. Igual ese no es el problema.

Bueno, ahora tengan en cuenta que:
- L1 y L2 son lados (izq, der, arr) y pueden ser iguales o no.
- X e Y son cantidades (0, 1, >0, >1, que corresponden con nunca, sólo 1 vez, alguna vez, más de 1 vez) y pueden ser iguales o no.
- SC es un símbolo comparador (==, <, >, <=, >=, !=).

A partir de los datos mencionados, quiero que el programa me diga:
- Cuántas escaleras fueron contactadas 1ero desde L1.
- Cuántas escaleras fueron contactadas X veces.
- Cuántas escaleras fueron contactadas sólo desde L1 (L2==0 y L3==0).
- Cuántas escaleras fueron contactadas X veces desde L1.
- Cuántas escaleras fueron contactadas por última vez desde L1.
- La cantidad de escaleras contactadas cuyo 1st == last.
- La cantidad de escaleras contactadas cuyo 1st != last.
- La cantidad de escaleras que por L1 fueron contactadas SC que por L2 (en este caso L1 y L2 son distintos, o sea si L1 es izq L2 no).

L1, X y SC deben sustituirse por todos los valores posibles, entonces sería:
- Cuántas escaleras fueron contactadas 1ero desde la izq.
- Cuántas escaleras fueron contactadas 1ero desde la der.
- Cuántas escaleras fueron contactadas 1ero desde arr.
- Cuántas escaleras fueron contactadas sólo 1 vez.
- Cuántas escaleras fueron contactadas más de 1 vez.
etc.
Lo de "nunca" y "alguna vez" no lo puse porque todas las escaleras fueron contactadas alguna vez, sino ni les pondría sus datos, pero esas cantidades son válidas en casos como:
- Cuántas escaleras nunca fueron contactadas desde la izq (contactadas 0 veces desde izq).
- Cuántas escaleras fueron contactadas alguna vez desde la der.

Pero también quiero que cuente mezclas de 2 cosas y otras que incluyan la palabra no, estas:
- La cantidad que fueron contactadas 1ero desde no L1.
- La cantidad que fueron contactadas 1ero desde L1 o L2.
- La cantidad que fueron contactadas 1ero desde L1 o fueron contactadas X veces.
- La cantidad que fueron contactadas 1ero desde L1 y fueron contactadas X veces.
- La cantidad que fueron contactadas 1ero desde L1 o sólo fueron contactadas desde L2.
- La cantidad que fueron contactadas 1ero desde L1 o fueron contactadas X veces desde L2.
- La cantidad que fueron contactadas 1ero desde L1 y fueron contactadas X veces desde L2.
- La cantidad que fueron contactadas 1ero desde L1 o por última vez desde L2.
- La cantidad que fueron contactadas 1ero desde L1 y por última vez desde L2.
- La cantidad que fueron contactadas 1ero desde L1 o cuyo 1st == last.
- La cantidad que fueron contactadas 1ero desde L1 o cuyo 1st != last.
- La cantidad que fueron contactadas 1ero desde L1 y cuyo 1st == last.
- La cantidad que fueron contactadas 1ero desde L1 y cuyo 1st != last.
- La cantidad que fueron contactadas 1ero desde L1, y que por L2 fueron contactadas SC que por L3 (L2 y L3 son distintos).
- Cuántas escaleras fueron contactadas no X veces.
- Cuántas escaleras fueron contactadas X o Y veces.
- Cuántas escaleras fueron contactadas X veces o sólo desde L1.
- Cuántas escaleras fueron contactadas X veces y sólo desde L1.
- Cuántas escaleras fueron contactadas X veces, o desde L1 Y veces.
- Cuántas escaleras fueron contactadas X veces, y desde L1 Y veces.
- Cuántas escaleras fueron contactadas X veces, o por última vez desde L1.
- Cuántas escaleras fueron contactadas X veces, y por última vez desde L1.
- Cuántas escaleras fueron contactadas X veces, o cuyo 1st == last.
- Cuántas escaleras fueron contactadas X veces, y cuyo 1st == last.
- Cuántas escaleras fueron contactadas X veces, o cuyo 1st != last.
- Cuántas escaleras fueron contactadas X veces, y cuyo 1st != last.
- Cuántas escaleras fueron contactadas X veces, y que por L1 fueron contactadas SC que por L2 (L1 y L2 son distintos).
Y siguen las combinaciones, se habrán dado una idea de que son muchas cosas, sería mucho código, que no quiero escribir, pero aprender a que programas generen los códigos que quiero me interesa.

¿Cómo lo hago?

Lo que tenía hecho de estos conteos, programando yo uno por uno es:
Código: [Seleccionar]
// Programa para contar cosas...
// relativas a contactos con escaleras.
// 1 condición:
function ContarPriIzq () {
PriIzq++;
PriIzqoDer++;
PriIzqoArr++;
}
function ContarPriDer () {
PriDer++;
PriIzqoDer++;
PriDeroArr++;
}
function ContarPriArr () {
PriArr++;
PriIzqoArr++;
PriDeroArr++;
}
// Escalera 1:
Escalera1First = "Izq";
Escalera1Izq = 3;
Escalera1Der = 0;
Escalera1Arr = 0;
Escalera1Last = "Izq";
// 2:
Escalera2First = "Der";
Escalera2Izq = 0;
Escalera2Der = 2;
Escalera2Arr = 0;
Escalera2Last = "Der";
// 3:
Escalera3First = "Izq";
Escalera3Izq = 1;
Escalera3Der = 0;
Escalera3Arr = 0;
Escalera3Last = "Izq";
// 4:
Escalera4First = "Der";
Escalera4Izq = 2;
Escalera4Der = 1;
Escalera4Arr = 1;
Escalera4Last = "Izq";
// 5:
Escalera5First = "Arr";
Escalera5Izq = 1;
Escalera5Der = 0;
Escalera5Arr = 1;
Escalera5Last = "Izq";
// 6:
Escalera6First = "Der";
Escalera6Izq = 0;
Escalera6Der = 1;
Escalera6Arr = 0;
Escalera6Last = "Der";
// 7:
Escalera7First = "Izq";
Escalera7Izq = 1;
Escalera7Der = 0;
Escalera7Arr = 0;
Escalera7Last = "Izq";
//
Escalera = 0;
do {
Escalera++;
// Resumen:
Res = "Escalera"+Escalera;
// Contar escaleras contactadas 1ero por (lado):
eval("ContarPri"+eval(Res+"First"))();
Contactos = eval(Res+"Izq")+eval(Res+"Der")+eval(Res+"Arr");
if (Contactos == 1) {
// Contar escaleras contactadas sólo 1 vez:
OneTime++;
} else {
// Más de 1 vez:
VariousTimes++;
}
// Contar escaleras que por un lado no fueron contactadas,
// o sólo 1 vez, o más de 1 vez:
Res2 = eval(Res+"Izq");
if (Res2 == 0) {
// nunca contactadas por la izq:
Izq0++;
} else if (Res2 == 1) {
// que por la izq sólo fueron contactadas 1 vez:
Izq1++;
} else {
// q por la izq fueron contactadas más de 1 vez:
IzqX++;
}
Res2 = eval(Res+"Der");
if (Res2 == 0) {
// nunca contactadas por la Der:
Der0++;
} else if (Res2 == 1) {
// que por la Der sólo fueron contactadas 1 vez:
Der1++;
} else {
// q por la Der fueron contactadas más de 1 vez:
DerX++;
}
Res2 = eval(Res+"Arr");
if (Res2 == 0) {
// nunca contactadas por Arr:
Arr0++;
} else if (Res2 == 1) {
// que por Arr sólo fueron contactadas 1 vez:
Arr1++;
} else {
// q por Arr fueron contactadas más de 1 vez:
ArrX++;
}
} while (Escalera<7);

24 Octubre, 2024, 11:27 am
Respuesta #1

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Es posible que haya solucionado esto, pero no como pensaba. Debo corregir y ampliar el código, pero parece bastante bien:
Código: [Seleccionar]
// Programa para contar cosas...
// relativas a contactos con escaleras.
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í");
}
}
// Datos sobre la escalera 1:
Escalera1First = "I";
Escalera1Izq = 3;
Escalera1Der = 0;
Escalera1Arr = 0;
Escalera1Last = "I";
// 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";
// 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:
VariableaAumentarNro1 = "F"+(eval(Res+"First").toLowerCase());
// trace("VariableaAumentarNro1: "+VariableaAumentarNro1);
// Total:
Contactos = eval(Res+"Izq")+eval(Res+"Der")+eval(Res+"Arr");
ContactosTransformada = Contactos;
if (Contactos > 1) {
ContactosTransformada = "s";
}
// trace("VariableaAumentarNro2: "+VariableaAumentarNro2);
// Sólo por un lado:
if (Contactos - eval(Res+"Izq") == 0) {
DebeAumentarLaVar6 = "Sí";
// trace("única");
} else if (Contactos - eval(Res+"Der") == 0) {
DebeAumentarLaVar7 = "Sí";
// trace("única");
} else if (Contactos - eval(Res+"Arr") == 0) {
DebeAumentarLaVar8 = "Sí";
// trace("única");
}
// 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:
VariableaAumentarNro3 = "L"+(eval(Res+"Last").toLowerCase());
// 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();
// Averiguar variables que no fueron especificadas...
// y aumentar las marcadas como que deben aumentar:
Variable = 0;
Averiguando = 1;
Averiguar = eval("VariableaAumentarNro"+Averiguando);
do {
Variable++;
if (Averiguar == eval("Nombre"+Variable)) {
set("DebeAumentarLaVar"+Variable, "Sí");
set(eval("Nombre"+Variable), eval(eval("Nombre"+Variable))+1);
// trace("Se incrementó "+eval("Nombre"+Variable));
Averiguando++;
Averiguar = eval("VariableaAumentarNro"+Averiguando);
} else if (eval("DebeAumentarLaVar"+Variable) == "Sí") {
// trace("Nombre"+Variable);
// trace(eval("Nombre"+Variable));
set(eval("Nombre"+Variable), eval(eval("Nombre"+Variable))+1);
trace("Se incrementó "+eval("Nombre"+Variable));
}
} while (Variable < 43);
// Aumentar negaciones:
} while (Escalera<7);

¿Cómo contar los "No"?
Cuando una variable no está marcada como "Sí", se incremente la variable "negativa", algo así:
Código: [Seleccionar]
set("No"+eval("Nombre"+Variable), eval("No"+eval("Nombre"+Variable))+1);
¿Cómo contar los "o"?
Cuando una variable está marcada como "Sí", su nombre se mezcla con "o" y las próximas, usando un while. Algo como:
Código: [Seleccionar]
set(eval("Nombre"+Variable)+"o"+eval("Nombre"+Variable2), eval(eval("Nombre"+Variable)+"o"+eval("Nombre"+Variable2))+1);
¿Cómo contar los "y"?
Cuando una variable está marcada como "Sí", se mira cada una de las siguientes. Cuando estén marcadas también con sí, sus nombres se mezclarán con "y".