Autor Tema: Indicar cuando se puede agregar else.

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

25 Septiembre, 2026, 06:59 am
Leído 360 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Tengo un código que genera códigos incompletos que pueden implicar números (que representan acciones que no vienen al caso):
Citar
LV1Code1:
1

LV1Code2:
if {
}

LV1Code3:
do {
} while

LV1Code4:
while {
}

CodeBase:
1

LineaDondeAgregar: 0

LV2Code1:
1
1

LV2Code2:
2
1

LV2Code3:
if {
}
1

LV2Code4:
do {
} while
1

LV2Code5:
while {
}
1

LineaDondeAgregar: 1

LV2Code6:
1
1

LV2Code7:
1
2

LV2Code8:
1
if {
}

LV2Code9:
1
do {
} while

LV2Code10:
1
while {
}

CodeBase:
if {
}

LineaDondeAgregar: 0

LV2Code11:
1
if {
}

LV2Code12:
if {
}
if {
}

LV2Code13:
do {
} while
if {
}

LV2Code14:
while {
}
if {
}

LineaDondeAgregar: 1

LV2Code15:
if {
   1
}

etc, etc

Citar
LV2Code46:
while {
}
while {
}

Quiero que así como se agrega if { y }, do { y } while, etc, se agregue } else {, claro sólo si en el código anteriormente hay un if { pero no su }

La parte relevante del código supongo que es:
Código: (actionscript) [Seleccionar]
// Para agregar if, do, while...
AgregablesLinea1 = ["if {", "do {", "while {"];
AgregablesLinea2 = ["}", "} while", "}"];
NroDeCosaaAgregar = 0;
// Repetir mientras no se haya agregado algo de eso:
// Se cambiará qué se agrega:
while (NroDeCosaaAgregar < 3) {
CodesLV2++;
NombredeNewCode = "LV2Code"+CodesLV2;
// Se copia la base:
set (NombredeNewCode, eval("LV1Code"+CodeBase).slice());
// Insertar en la posición LineaDondeAgregar
// Parámetros: (índice, elementos_a_eliminar, nuevo_elemento)
eval(NombredeNewCode).splice(LineaDondeAgregar, 0, EspaciosRequeridos+AgregablesLinea1[NroDeCosaaAgregar]);
eval(NombredeNewCode).splice(LineaDondeAgregar+1, 0, EspaciosRequeridos+AgregablesLinea2[NroDeCosaaAgregar]);
trace (NombredeNewCode+":");
TextoLineaPorLinea = eval(NombredeNewCode).join("\n");
trace (TextoLineaPorLinea+"\n");
NroDeCosaaAgregar++;
}

// Para agregar else sólo cuando hay if no terminado:

Si necesitan algo más avisen.

Lo complicado es describir la condición que debe cumplirse, justamente ahí lo dejé. Puede que tenga que ver con revisar el array que se está formando (eval(NombredeNewCode)) pero no sé exacto cómo, por ejemplo supongamos que fuese
Citar
if {
   while {
   }
   if {
   }
   ACÁ ESTÁ EL CURSOR
}
if {
   2
}

Si pongo:
"Si hay un "if {" antes del cursor"
...entonces no se tiene en cuenta si el if terminó antes del cursor o no

Si pongo:
"Si hay un "if {" antes del cursor y si no hay un } antes del cursor"
...entonces podría ocurrir que el } no sea el final del if sino del while o de otro if.

Quizá tiene que ver con contar la cantidad de ifs pero no alcanza, necesito restar los que terminaron, pero no sé detectarlos porque el } podría ser de ellos o del while.

https://share.google/aimode/zaftDPTTQsG8TNCSI

...

Anduve pensando por mi cuenta y aún no tengo una solución.
Y acabo de leer un poco la solución de la IA y me pareció muy complicada.
¿Pistas, sugerencias...?

07 Octubre, 2026, 06:31 am
Respuesta #1

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Agregué lo que creí necesario en el código pero no hubo cambios en la salida parece. ¿Qué falla?

Código: (actionscript) [Seleccionar]
// Para códigos de 2 cosas:
CodesLV2 = 0;
CodeBase = 0;
// Repetir mientras haya alguna base sin usar:
// Se van a generar códigos con 2 cosas:
while (CodeBase < CodesLV1) {
CodeBase++;
TextoLineaPorLinea = eval("LV1Code"+CodeBase).join("\n");
trace ("CodeBase: \n"+TextoLineaPorLinea+"\n");
LineaDondeAgregar = -1;
// Repetir mientras haya alguna línea posterior en Codebase:
// Se cambiará la línea donde se agrega código en Codebase:
while (LineaDondeAgregar < eval("LV1Code"+CodeBase).length) {
LineaDondeAgregar++;
trace("LineaDondeAgregar: "+LineaDondeAgregar+"\n");

// Para averiguar espacios iniciales requeridos:
// Si hay alguna línea anterior entonces puede...
// que se requieran espacios, sino esto no...
// funcionaría bien y no tiene sentido porque...
// el resultado siempre debería ser 0:
EspaciosRequeridos = "";
if (LineaDondeAgregar > 0) {
// 1ero se averigua la cantidad de espacios...
// iniciales de la línea anterior:
// AÚN NO PUEDE SABERSE SI ESTO FUNCIONA
LineaAnterior = eval("LV1Code"+CodeBase)[LineaDondeAgregar-1];
CaracterEvaluandose = 0;
do {
if (LineaAnterior.charAt(CaracterEvaluandose) == " ") {
EspaciosRequeridos = EspaciosRequeridos+" ";
} else {
break;
}
CaracterEvaluandose++;
} while (CaracterEvaluandose < eval("LV1Code"+CodeBase)[LineaDondeAgregar].length);

// Luego se averigua si la línea es un if o...
// algo así que requiera espacios,
// en cuyo caso se le agregan:
// Extrae el texto desde la posición...
// EspaciosRequeridos hasta el final:
LineaSinEspacios = LineaAnterior.substr(EspaciosRequeridos);
// trace("LineaSinEspacios: "+LineaSinEspacios);
if (LineaSinEspacios == "if {" or LineaSinEspacios == "do {" or LineaSinEspacios == "while {") {
EspaciosRequeridos = EspaciosRequeridos+"   ";
}
}
Action = 0;
// Repetir mientras haya alguna acción agregable
// (se refiere a 1, 2, etc, no ifs, etc):
// Se cambiará la acción que se agrega:
while (Action <= eval("LV1Code"+CodeBase+"MaxAction")) {
Action++;
CodesLV2++;
NombredeNewCode = "LV2Code"+CodesLV2;

// Para agregar código 1ero se copia el base:
set (NombredeNewCode, eval("LV1Code"+CodeBase).slice());

// Insertar en la posición LineaDondeAgregar:
// Parámetros: (índice, elementos_a_eliminar, nuevo_elemento)
eval(NombredeNewCode).splice(LineaDondeAgregar, 0, EspaciosRequeridos+Action);
trace (NombredeNewCode+":");
TextoLineaPorLinea = eval(NombredeNewCode).join("\n");
trace (TextoLineaPorLinea+"\n");
}

// Para agregar if, do, while...
AgregablesLinea1 = ["if {", "do {", "while {"];
AgregablesLinea2 = ["}", "} while", "}"];
NroDeCosaaAgregar = 0;
// Repetir mientras no se haya agregado algo de eso:
// Se cambiará qué se agrega:
while (NroDeCosaaAgregar < 3) {
CodesLV2++;
NombredeNewCode = "LV2Code"+CodesLV2;
// Se copia la base:
set (NombredeNewCode, eval("LV1Code"+CodeBase).slice());
// Insertar en la posición LineaDondeAgregar
// Parámetros: (índice, elementos_a_eliminar, nuevo_elemento)
eval(NombredeNewCode).splice(LineaDondeAgregar, 0, EspaciosRequeridos+AgregablesLinea1[NroDeCosaaAgregar]);
eval(NombredeNewCode).splice(LineaDondeAgregar+1, 0, EspaciosRequeridos+AgregablesLinea2[NroDeCosaaAgregar]);
trace (NombredeNewCode+":");
TextoLineaPorLinea = eval(NombredeNewCode).join("\n");
trace (TextoLineaPorLinea+"\n");
NroDeCosaaAgregar++;
}

// Para agregar else sólo cuando hay if no terminado,
// y la posición del else no sea entre otros bloques:
// Desde la línea actual ir mirando hacia arriba:
NroDeLineaMirandose = LineaDondeAgregar;
LineaMirandose = eval("LV1Code"+CodeBase)[NroDeLineaMirandose];
PuedeHaberElse = undefined;
while (NroDeLineaMirandose > 0) {
NroDeLineaMirandose--;
// Para averiguar espacios iniciales que...
// deben borrarse para saber qué tiene...
// la línea sin ellos:
EspaciosaQuitar = "";
CaracterEvaluandose = 0;
do {
if (LineaMirandose.charAt(CaracterEvaluandose) == " ") {
EspaciosaQuitar = EspaciosaQuitar+" ";
} else {
break;
}
CaracterEvaluandose++;
} while (CaracterEvaluandose < eval("LV1Code"+CodeBase)[LineaMirandose].length);
LineaSinEspacios = LineaMirandose.substr(EspaciosaQuitar);
DosAbiertos = 0;
OtrosAbiertos = 0;
if (LineaSinEspacios == "} while") {
DosAbiertos++;
} else if (LineaSinEspacios == "}") {
OtrosAbiertos++;
} else if (LineaSinEspacios == "do {") {
DosAbiertos--;
if (DosAbiertos == -1) {
PuedeHaberElse = false;
break;
}
} else if (LineaSinEspacios == "while {") {
OtrosAbiertos--;
if (OtrosAbiertos == -1) {
PuedeHaberElse = false;
break;
}
} else if (LineaSinEspacios == "if {") {
OtrosAbiertos--;
if (OtrosAbiertos == -1) {
PuedeHaberElse = true;
break;
}
} else if (LineaSinEspacios == "} else if {") {
PuedeHaberElse = true;
break;
}
}
if (PuedeHaberElse == true) {
CodesLV2++;
NombredeNewCode = "LV2Code"+CodesLV2;
// Se copia la base:
set (NombredeNewCode, eval("LV1Code"+CodeBase).slice());
// Insertar en la posición LineaDondeAgregar
// Parámetros: (índice, elementos_a_eliminar, nuevo_elemento)
eval(NombredeNewCode).splice(LineaDondeAgregar, 0, EspaciosRequeridos+"} else if {");
trace (NombredeNewCode+":");
TextoLineaPorLinea = eval(NombredeNewCode).join("\n");
trace (TextoLineaPorLinea+"\n");
}
}
}
stop ();

18 Octubre, 2026, 01:09 pm
Respuesta #2

w a y s

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 256
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
  • I
Buenos días Tachikomaia,

¿Has probado a utilizar una pila?

Creo que para este tipo de problemas en los que el orden de las operaciones importa te puede venir bastante bien.

Un saludo.

18 Octubre, 2026, 03:58 pm
Respuesta #3

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
No sé de eso, luego le preguntaré a una IA.

En cuanto a mi código, algo cambié que ya funciona mejor, pero no está listo.