elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Generar lista evitando ", " al inicio sin repetir code.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Generar lista evitando ", " al inicio sin repetir code.  (Leído 5,045 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.221


Superhacker (es broma xD )


Ver Perfil
Generar lista evitando ", " al inicio sin repetir code.
« en: 22 Noviembre 2023, 05:47 am »

Tengo un programa que en resumen hace esto:
Código:
ListasegunGeneracion = "";
Repetir:
// Generar N.
ListasegunGeneracion = ListasegunGeneracion+", "+N;
Y el resultado final es:
, 0, 33, 16, etc.
Es decir inicia con ", " al inicio.

¿Es posible mejorarlo?

En cierto punto podría borrar esa parte, pero me pregunto si es posible sin usar ese "parche".

Otro modo sería que el 1er N se generara de otro modo, o poner un if para que si es el 1er N se haga
ListasegunGeneracion = N
...pero eso implica "repetir código", es decir, hacer casi lo mismo por sólo 1 caso, o poner un if que será chequeado muchas veces cuando sabemos que lo suyo sólo se aplicaría en el 1er caso. Quisiera saber si hay una mejor solución a eso.

GPT no entendió lo que dije al final:
Citar
Sí, es posible mejorar el programa para evitar la necesidad de eliminar la parte inicial ", " después de generar la lista. Una forma de hacerlo es utilizando un enfoque condicional para agregar la coma solo cuando sea necesario.

Aquí hay una sugerencia de cómo podría ser el programa mejorado:

```
ListasegunGeneracion = "";
Repetir:
    // Generar N.
    si ListasegunGeneracion está vacía:
        ListasegunGeneracion = N;
    en caso contrario:
        ListasegunGeneracion = ListasegunGeneracion + ", " + N;
```

En este caso, se verifica si `ListasegunGeneracion` está vacía antes de agregar el valor `N`. Si la lista está vacía, se asigna el valor directamente sin agregar la coma. De lo contrario, se agrega la coma y luego el valor `N`.

De esta manera, no es necesario eliminar la parte inicial ", " después de generar la lista y se evita repetir código o usar condicionales innecesarios para el primer caso.


En línea

profinet

Desconectado Desconectado

Mensajes: 30



Ver Perfil
Re: Generar lista evitando ", " al inicio sin repetir code.
« Respuesta #1 en: 22 Noviembre 2023, 10:55 am »

Te sugiero emplear un operador ternario en esta situación. La operación ternaria es atómica, ejecutándose como una única operación, y suele ser más eficiente que un bloque if-else, especialmente cuando la condición es simple.

No obstante, es importante tener en cuenta que los compiladores tienden a optimizar el código durante la traducción a código máquina, por lo que generalmente no hay necesidad de preocuparse por el rendimiento en este contexto.

Si ListasegunGeneracion es un arreglo de caracteres, podrías implementar esto en C de la siguiente manera:

Código:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>

int main() {

  int16_t N;
  bool cond = true;
  char charN[6]; // Ajustar el tamaño para manejar números de hasta 5 dígitos y el carácter nulo

  // Reservar memoria para la cadena
  char * ListasegunGeneracion = (char * ) malloc(1);

  // Calcular N
  // ...

  // Inicializar la cadena vacía
  ListasegunGeneracion[0] = '\0';

  // Generar la lista
  while (cond) {
    // Ajustar el tamaño de la cadena
    ListasegunGeneracion = realloc(ListasegunGeneracion,
strlen(ListasegunGeneracion) + sizeof(charN) + 1);

    // Agregar la coma y el número a la cadena
    snprintf(charN, sizeof(charN), "%d", N);
    strcat(ListasegunGeneracion, (N > 0) ? ", " : ""); // Operador ternario
    strcat(ListasegunGeneracion, charN);

    // Modificar condición o establecer un punto de salida, de lo contrario, habrá un bucle infinito
    // Aquí deberías modificar 'cond' o agregar una sentencia 'break' en algún momento.
  }

  // Imprimir la cadena final
  printf("%s\n", ListasegunGeneracion);

  // Liberar la memoria
  free(ListasegunGeneracion);

  return 0;
}


En línea

Don't shy away from the terminal; embrace it! In the GNU world, everything is a file.
EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.072



Ver Perfil
Re: Generar lista evitando ", " al inicio sin repetir code.
« Respuesta #2 en: 22 Noviembre 2023, 14:21 pm »

Supongo que lo más sencillo sería quitar los dos primeros caracteres (coma+espacio) al final, siempre y cuando se sepa la cantidad de caracteres a quitar no debería haber problemas

Código
  1. // Agrega 5 números generados
  2. var ListaSegunGeneracion = "";
  3. for (var i = 0; i < 5; i++) {
  4.    ListaSegunGeneracion += ", " + GenerarN();
  5. }
  6.  
  7. // Imprime la String pero le quita los dos primeros caracteres
  8. trace(ListaSegunGeneracion.substring(2));
  9. stop();
  10.  
  11. // Genera un número aleatorio entre 1 y 100 inclusive
  12. function GenerarN() {
  13.    return Math.ceil(Math.random(100)*100);
  14. }


Otra opción interesante es usar un Array que ya tiene métodos para unir (join) sus elementos especificando un separador, en tu caso una coma+espacio, así solo se colocarían donde deben, por ejemplo:

Código
  1. var ListaSegunGeneracion = new Array();
  2.  
  3. // Agrega 5 números generados al Array
  4. for (var i = 0; i <5; i++) {
  5.    ListaSegunGeneracion[i] = GenerarN();
  6. }
  7.  
  8. // Imprime el Array como String unidos por coma+espacio
  9. trace(ListaSegunGeneracion.join(", "));
  10. stop();
  11.  
  12. // Genera un número aleatorio entre 1 y 100 inclusive
  13. function GenerarN() {
  14.    return Math.ceil(Math.random(100)*100);
  15. }

NOTA: todos mis ejemplos están basados en ActionScript 2 y mínimo Flash 5, versiones anteriores serían extremadamente antiguas
En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.221


Superhacker (es broma xD )


Ver Perfil
Re: Generar lista evitando ", " al inicio sin repetir code.
« Respuesta #3 en: 23 Noviembre 2023, 03:20 am »

profinet yo no sé lenguaje tan técnico.

Te sugiero emplear un operador ternario en esta situación. La operación ternaria es atómica, ejecutándose como una única operación, y suele ser más eficiente que un bloque if-else, especialmente cuando la condición es simple.
https://lenguajejs.com/fundamentos/estructuras-de-control/operador-ternario/
No me sirve, es casi como un if. Según vi en tu código haces eso. Además no uso arrays.
En línea

profinet

Desconectado Desconectado

Mensajes: 30



Ver Perfil
Re: Generar lista evitando ", " al inicio sin repetir code.
« Respuesta #4 en: 23 Noviembre 2023, 13:17 pm »

Si he comprendido correctamente, estás indagando sobre la manera más eficiente de ejecutar código. En ese caso, si prefieres evitar el uso de una estructura if-else, la opción más eficiente, especialmente para operaciones simples, sería emplear un operador ternario.

No son, como mencionaste, "casi lo mismo". Permíteme demostrarte la diferencia.

He escrito los siguientes códigos de pruebas:

# Código 1

Código:
void hal_entry(void) {

volatile uint32_t seed, randNumm;
volatile bool isGreater;
SysTick_Config(SystemCoreClock / 960);

while (true) {
seed = (_ulTickCount * 1664525 + 1013904223) % 4294967296;
randNumm = seed % (10 - 2 + 1) + 2;

if (randNumm >= 5) {
isGreater = true;
} else {
isGreater = false;
}
}
}

Este código realiza las siguientes operaciones:

    - Inicializa el contador de pulsos de un microcontrolador basado en ARM Cortex-M.
    - Genera un número aleatorio acotado entre 2 y 10.
    - Comprueba si el número obtenido es mayor o igual a 5 y actualiza una flag en consecuencia.

Al examinar el desensamblado de la instrucción condicional, se revela lo siguiente:

Código:
115       	if (randNumm >= 5) {
00001084:   ldr     r3, [sp, #12]     ; Load the value of randNumm from the stack into register r3
00001086:   cmp     r3, #4            ; Compare the value in r3 (randNumm) with 4
116       isGreater = true;    ; Set isGreater to true if the condition is met
00001088:   ite     hi                ; Conditional (IT) block, executing based on "If Higher" logic
0000108a:   strbhi.w        r4, [sp, #7]  ; Store 1 in memory at [sp + #7] if the condition is true (hi)
118       isGreater = false;   ; Set isGreater to false if the condition is not met
0000108e:   strbls.w        r5, [sp, #7]  ; Store 0 in memory at [sp + #7] if the condition is false (ls)
00001092:   b.n     0x106a <hal_entry()+58> ; Branch to the specified address (conditional, not taken if the condition is false)

    - Se extrae el valor de randNumm del stack y se almacena en el registro r3.
    - Se realiza una comparación para verificar si el valor en r3 es mayor que 4:
        - Si la afirmación es verdadera, se guarda el valor de r4 (1) en [sp +#7].
        - En caso contrario, se guarda el valor de r5 (0) en [sp +#7].
    - Se realiza un salto a la dirección de memoria 0x106a si el resultado de la comparación es verdadero.


# Código 2

Código:
void hal_entry(void) {

volatile uint32_t seed, randNumm;
volatile bool isGreater;
SysTick_Config(SystemCoreClock / 960);

while (true) {
seed = (_ulTickCount * 1664525 + 1013904223) % 4294967296;
randNumm = seed % (10 - 2 + 1) + 2;
isGreater = (randNumm >= 5) ? true : false;
}
}

Este ejecuta la misma lógica que el código 1, pero usando un operador ternario.

Si nos vamos a su código ensamblador, vemos que:

Código:
113       		isGreater = (randNumm >= 5) ? true : false;
00001080:   ldr     r3, [sp, #12]     ; Load the value of randNumm from the stack into register r3
00001082:   cmp     r3, #4            ; Compare the value in r3 (randNumm) with 4
00001084:   ite     ls                 ; Conditional IT block, executing based on "If Lower or Same" logic
00001086:   movls   r3, #0            ; If less than or equal to 4 (ls condition), set r3 to 0
00001088:   movhi   r3, #1            ; If greater than 4 (hi condition), set r3 to 1
0000108a:   strb.w  r3, [sp, #7]      ; Store the result in the memory at [sp + #7]

    - Se recupera el valor de randNumm desde el stack y se almacena en el registro r3.
    - Se compara el valor de r3 con 4:
        - Si es menor o igual, se asigna 0 a r3.
        - Si es mayor, se asigna 1 a r3.
    - Se guarda el valor actualizado de r3 en la posición de memoria [sp, #7].
 
En términos de eficiencia, el segundo bloque de código sobresale por varias razones:

    - Simplicidad: En el segundo bloque, el valor de isGreater se asigna directamente, simplificando la lógica del código.

    - Menor número de saltos: Mientras que el primer bloque utiliza dos instrucciones de salto condicional (ite, strbhi.w, y strbls.w), el segundo bloque se limita a una sola instrucción (it y strb.w), reduciendo la complejidad y el consumo de recursos.

    - Eliminación de redundancia: En el segundo bloque, se utiliza el mismo registro r3 de manera consistente, a diferencia del primer bloque que emplea los registros r3, r4 y r5. Esto elimina la necesidad de instrucciones adicionales para cambiar el valor de isGreater después de la comparación, como se evidencia en el primer bloque.

No obstante, es importante señalar que las optimizaciones del compilador pueden atenuar las diferencias prácticas entre ambas implementaciones.
De modo que declaré las variables como volátiles para evitar estas optimizaciones, permitiendo una evaluación más precisa del rendimiento.
« Última modificación: 23 Noviembre 2023, 13:42 pm por profinet » En línea

Don't shy away from the terminal; embrace it! In the GNU world, everything is a file.
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.357


Ver Perfil
Re: Generar lista evitando ", " al inicio sin repetir code.
« Respuesta #5 en: 24 Noviembre 2023, 23:32 pm »

Es sencillo..

Crea primero el primer elemento, por ejemplo: 'a'
Luego el resto ',b,c,d...'
En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.221


Superhacker (es broma xD )


Ver Perfil
Re: Generar lista evitando ", " al inicio sin repetir code.
« Respuesta #6 en: 25 Noviembre 2023, 07:15 am »

EdePC:
Bien, me funcionó esto que me dijiste:
Citar
String.substr
Sintaxis

myString.substr(inicio, longitud);
Argumentos

inicio Un número entero que indica la posición del primer carácter de la subcadena que se está creando. Si inicio es un número negativo, el punto inicial se determina desde el final de la matriz, donde -1 es el último carácter.

longitud El número de caracteres en la subcadena que se está creando. Si no se especifica longitud, la subcadena incluye todos los caracteres desde el inicio al final de la cadena.

Descripción

Método; devuelve los caracteres de una cadena desde el índice especificado en el argumento inicio, hasta el número de caracteres especificados en el argumento longitud.

Reproductor

Flash 5 o posterior.
Pensaba probar algo de eso. Para mí eso es medio confuso porque le llaman "borrar" creo pero no es que borre desde el caracter 2 en este caso, sino que genera una cadena desde el caracter 2. Sería más claro si por ejemplo le llamaran take o get (from, until).

Los arrays no me gustan, no sé, mañas mías xD

Citar
todos mis ejemplos están basados en ActionScript 2 y mínimo Flash 5, versiones anteriores serían extremadamente antiguas
Ah, ya que sabes del tema, y suponiendo que te refieres a Macromedia Flash 5, no el de Adobe (creo que es CS5). ¿MF5 usa AS2 entonces? Te pregunto porque sé que en cierto punto salió el AS3, pero nunca supe cual uso, que yo sepa no dice "es AS2", además en cada nueva versión de Flash agregaron/quitaron cosas, por lo que yo en el fondo dudo que existan sólo 3 versiones de AS... Ojo con eso.
« Última modificación: 25 Noviembre 2023, 07:17 am por Tachikomaia » En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.471


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Generar lista evitando ", " al inicio sin repetir code.
« Respuesta #7 en: 25 Noviembre 2023, 07:27 am »

Hola!

Ah, ya que sabes del tema, y suponiendo que te refieres a Macromedia Flash 5, no el de Adobe (creo que es CS5). ¿MF5 usa AS2 entonces? Te pregunto porque sé que en cierto punto salió el AS3, pero nunca supe cual uso, que yo sepa no dice "es AS2", además en cada nueva versión de Flash agregaron/quitaron cosas, por lo que yo en el fondo dudo que existan sólo 3 versiones de AS... Ojo con eso.

Wikipedia lo explica sencillo (revisa el apartado Timeline by player version): https://en.wikipedia.org/wiki/ActionScript

AS1 nace con Flash5. AS2 nace con Flash 7 y mejora con Flash 8. AS3 nace con Flash 9 (inicialmente llamado Flash 8.5) y, aparte, el producto cambia a llamarse Adobe Flash Player (No es más de Macromedia).

Saludos!
En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.072



Ver Perfil
Re: Generar lista evitando ", " al inicio sin repetir code.
« Respuesta #8 en: 25 Noviembre 2023, 13:46 pm »

EdePC:
1. Bien, me funcionó esto que me dijiste: Pensaba probar algo de eso. Para mí eso es medio confuso porque le llaman "borrar" creo pero no es que borre desde el caracter 2 en este caso, sino que genera una cadena desde el caracter 2. Sería más claro si por ejemplo le llamaran take o get (from, until).

2. Los arrays no me gustan, no sé, mañas mías xD

3. Ah, ya que sabes del tema, y suponiendo que te refieres a Macromedia Flash 5, no el de Adobe (creo que es CS5). ¿MF5 usa AS2 entonces? Te pregunto porque sé que en cierto punto salió el AS3, pero nunca supe cual uso, que yo sepa no dice "es AS2", además en cada nueva versión de Flash agregaron/quitaron cosas, por lo que yo en el fondo dudo que existan sólo 3 versiones de AS... Ojo con eso.

1. Exacto, la variable original no se modifica, sino que se toma su valor, se le hacen modificaciones en memoria y eso es lo que devuelve, ya dependerá de cada uno que hacer con ese valor devuelto, si se sobreescribe la variable original o simplemente se lo usa para mostrar, o trabajarla aparte como una copia modificada

2. Sería buena idea aprender a usarlos porque están presentes en prácticamente todos los lenguaje de programación y da una mínima introducción a objetos y propiedades, en ActionScript 2.0 ya se pueden usar Clases que se asemejan más a la programación orientada a objetos de los lenguajes comunes, en ActionScript 1.0 también se puede implementar algo similar pero ya es un poquito más raro XD

3. En resumen con respecto a ese rango de versiones sería así:

Macromedia Flash 4.0, junio de 1999, Flash Player 4
Macromedia Flash 5.0, agosto de 2000, ActionScript 1.0, Flash Player 5
Macromedia Flash MX, marzo de 2002, ActionScript 1.0, Flash Player 6
Macromedia Flash MX 2004, septiembre de 2003, ActionScript 1.0 y 2.0, Flash Player 7

Como tienes Macromedia Flash 5.0 tienes disponible ActionScript 1.0 y Flash Player 5. Por un lado está el Programa en si (Macromedia Flash) y sus capacidades, luego el Lenguaje de Programación (ActionScript) y al final el Reproductor (Flash Player) que ejecutará/mostrará lo que has programado/escenificado (swf).
En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.221


Superhacker (es broma xD )


Ver Perfil
Re: Generar lista evitando ", " al inicio sin repetir code.
« Respuesta #9 en: 27 Noviembre 2023, 04:33 am »

profinet:
Aunque un operador ternario fuese más eficiente como dices, estás haciendo varias comprobaciones por algo que sabemos a priori que sólo se aplicará en el 1er caso, por eso tampoco me sirve.

Crea primero el primer elemento, por ejemplo: 'a'
Luego el resto ',b,c,d...'
Sí, pero resumí o simplifiqué demasiado el problema, si hago eso repito código creo, tengo esto (no quise postearlo porque es complicado de entender/explicar):
Código
  1. Escena 1
  2.   actions for fotograma 1
  3.      function ChequearCandidato () {
  4.         C = String(N).charat(N);
  5.         trace (N+" resulta "+C);
  6.         if (C == 0) {
  7.            if (Solfor0 == undefined) {
  8.               Solfor0 = N;
  9.            }
  10.         } else if (C == -9) {
  11.            if (Solfor9 == undefined) {
  12.               Solfor9 = N;
  13.            }
  14.         } else if (C == 4.5) {
  15.            if (Solfor4 == undefined) {
  16.               Solfor4 = N;
  17.            }
  18.         } else if (C == -7.2) {
  19.            if (Solfor7 == undefined) {
  20.               Solfor7 = N;
  21.            }
  22.         }
  23.         ListasegunGeneracion = ListasegunGeneracion+", "+N;
  24.      }
  25.      MinN = 0;
  26.      MaxN = 33;
  27.      Rango = MaxN-MinN+1;
  28.      MenoroMayor = -1;
  29.      ListPart1 = MinN;
  30.      ListPart2 = MaxN;
  31.      ListParts = 2;
  32.      N = MinN-MaxN;
  33.      ListasegunGeneracion = "";
  34.      do {
  35.         N = N+MaxN;
  36.         ChequearCandidato();
  37.      } while (N != MaxN);
  38.      Mayordistancia = 0;
  39.      Puntero = ListParts;
  40.      Lista = "";
  41.   actions for fotograma 2
  42.      Distancia = eval("ListPart"+Puntero)-eval("ListPart"+(Puntero-1));
  43.      if (MenoroMayor == -1) {
  44.         if (Distancia == Mayordistancia) {
  45.            NElegido = Puntero;
  46.            CambiarMenoroMayor = "Sí";
  47.         } else if (Distancia>Mayordistancia) {
  48.            NElegido = Puntero;
  49.            Mayordistancia = Distancia;
  50.            CambiarMenoroMayor = "No";
  51.         }
  52.      } else if (Distancia == Mayordistancia) {
  53.         CambiarMenoroMayor = "Sí";
  54.      } else if (Distancia>Mayordistancia) {
  55.         NElegido = Puntero;
  56.         Mayordistancia = Distancia;
  57.         CambiarMenoroMayor = "No";
  58.      }
  59.      Puntero = Puntero-1;
  60.   actions for fotograma 3
  61.      if (Puntero>1) {
  62.         gotoAndPlay (2);
  63.      } else {
  64.         if (MenoroMayor == -1) {
  65.            N = Math.floor((eval("ListPart"+NElegido)+eval("ListPart"+(NElegido-1)))/2);
  66.         } else {
  67.            N = Math.ceil((eval("ListPart"+NElegido)+eval("ListPart"+(NElegido-1)))/2);
  68.         }
  69.         ChequearCandidato();
  70.         Lista = "";
  71.      }
  72.   actions for fotograma 5
  73.      if (N<eval("ListPart"+Puntero)) {
  74.         Saver = eval("ListPart"+Puntero);
  75.         set ("ListPart"+Puntero, N);
  76.         Lista = Lista+", "+N;
  77.         N = Saver;
  78.      } else {
  79.         Puntero = Puntero+1;
  80.         Lista = Lista+", "+eval("ListPart"+(Puntero-1));
  81.         gotoAndPlay (4);
  82.      }
  83.   actions for fotograma 7
  84.      if (Puntero == ListParts) {
  85.         ListParts = ListParts+1;
  86.         // Sólo falta correr al último elemento.
  87.         set ("ListPart"+ListParts, N);
  88.         // ¿Se analizaron todos los números del rango?
  89.         if (Rango == ListParts) {
  90.            // Sí, mostrar los Ns que cumplen la condición y finalizar.
  91.            if (Solfor0 != undefined) {
  92.               trace ("Para que C sea 0 usar N: "+Solfor0);
  93.            }
  94.            if (Solfor9 != undefined) {
  95.               trace ("Para que C sea -9 usar N: "+Solfor9);
  96.            }
  97.            if (Solfor4 != undefined) {
  98.               trace ("Para que C sea 4.5 usar N: "+Solfor4);
  99.            }
  100.            if (Solfor7 != undefined) {
  101.               trace ("Para que C sea -7.2 usar N: "+Solfor7);
  102.            }
  103.            ListasegunGeneracion = ListasegunGeneracion.substring(2);
  104.            stop ();
  105.         } else {
  106.            // Analizar otro N.
  107.            if (CambiarMenoroMayor == "Sí") {
  108.               MenoroMayor = MenoroMayor*-1;
  109.               CambiarMenoroMayor = "No";
  110.            }
  111.            Mayordistancia = 0;
  112.            Puntero = ListParts;
  113.            Lista = "";
  114.            gotoAndPlay (2);
  115.         }
  116.      } else {
  117.         Puntero = Puntero+1;
  118.         // Correr hacia el final a las partes de la lista.
  119.         Saver = eval("ListPart"+Puntero);
  120.         set ("ListPart"+Puntero, N);
  121.         Lista = Lista+", "+N;
  122.         N = Saver;
  123.         gotoAndPlay (6);
  124.      }
Básicamente es como si se fuese a crear una lista de números del 0 al 33 pero en un orden especial. El número se agrega a la lista (ListasegunGeneracion) mediante la función del frame 1. Si el 1er número se agregara de distinta manera, eso que hace la función tendría que copiarlo para ese caso particular, cambiando sólo 1 cosa. Eso es repetición de código, todo igual excepto 1 cosa, por eso no quería hacer eso.

Esto:
Código
  1.   actions for fotograma 1
  2.      function ChequearCandidato () {
  3.         C = String(N).charat(N);
  4.         trace (N+" resulta "+C);
  5.         if (C == 0) {
  6.            if (Solfor0 == undefined) {
  7.               Solfor0 = N;
  8.            }
  9.         } else if (C == -9) {
  10.            if (Solfor9 == undefined) {
  11.               Solfor9 = N;
  12.            }
  13.         } else if (C == 4.5) {
  14.            if (Solfor4 == undefined) {
  15.               Solfor4 = N;
  16.            }
  17.         } else if (C == -7.2) {
  18.            if (Solfor7 == undefined) {
  19.               Solfor7 = N;
  20.            }
  21.         }
  22.         ListasegunGeneracion = ListasegunGeneracion+", "+N;
  23.      }
  24.      MinN = 0;
  25.      MaxN = 33;
  26.      Rango = MaxN-MinN+1;
  27.      MenoroMayor = -1;
  28.      ListPart1 = MinN;
  29.      ListPart2 = MaxN;
  30.      ListParts = 2;
  31.      N = MinN-MaxN;
  32.      ListasegunGeneracion = "";
  33.      do {
  34.         N = N+MaxN;
  35.         ChequearCandidato();
  36.      } while (N != MaxN);

Con tu método tendría que hacerlo así:
Código
  1.   actions for fotograma 1
  2.      function ChequearCandidato () {
  3.         C = String(N).charat(N);
  4.         trace (N+" resulta "+C);
  5.         if (C == 0) {
  6.            if (Solfor0 == undefined) {
  7.               Solfor0 = N;
  8.            }
  9.         } else if (C == -9) {
  10.            if (Solfor9 == undefined) {
  11.               Solfor9 = N;
  12.            }
  13.         } else if (C == 4.5) {
  14.            if (Solfor4 == undefined) {
  15.               Solfor4 = N;
  16.            }
  17.         } else if (C == -7.2) {
  18.            if (Solfor7 == undefined) {
  19.               Solfor7 = N;
  20.            }
  21.         }
  22.         ListasegunGeneracion = ListasegunGeneracion+", "+N;
  23.      }
  24.      MinN = 0;
  25.      MaxN = 33;
  26.      Rango = MaxN-MinN+1;
  27.      MenoroMayor = -1;
  28.      ListPart1 = MinN;
  29.      ListPart2 = MaxN;
  30.      ListParts = 2;
  31.         C = String(MinN).charat(MinN);
  32.         trace (MinN+" resulta "+C);
  33.         if (C == 0) {
  34.            if (Solfor0 == undefined) {
  35.               Solfor0 = MinN;
  36.            }
  37.         } else if (C == -9) {
  38.            if (Solfor9 == undefined) {
  39.               Solfor9 = MinN;
  40.            }
  41.         } else if (C == 4.5) {
  42.            if (Solfor4 == undefined) {
  43.               Solfor4 = MinN;
  44.            }
  45.         } else if (C == -7.2) {
  46.            if (Solfor7 == undefined) {
  47.               Solfor7 = MinN;
  48.            }
  49.         }
  50.      ListasegunGeneracion = MinN;
  51.      N = MaxN;
  52.      ChequearCandidato();

También podría quitar esto de la función:
ListasegunGeneracion = ListasegunGeneracion+", "+N
Y ponerlo fuera de ella en todos los casos menos en el 1ero, como has dicho, no estoy seguro de cómo quedaría, algo así:
Código
  1. Escena 1
  2.   actions for fotograma 1
  3.      function ChequearCandidato () {
  4.         C = String(N).charat(N);
  5.         trace (N+" resulta "+C);
  6.         if (C == 0) {
  7.            if (Solfor0 == undefined) {
  8.               Solfor0 = N;
  9.            }
  10.         } else if (C == -9) {
  11.            if (Solfor9 == undefined) {
  12.               Solfor9 = N;
  13.            }
  14.         } else if (C == 4.5) {
  15.            if (Solfor4 == undefined) {
  16.               Solfor4 = N;
  17.            }
  18.         } else if (C == -7.2) {
  19.            if (Solfor7 == undefined) {
  20.               Solfor7 = N;
  21.            }
  22.         }
  23.      }
  24.      MinN = 0;
  25.      MaxN = 33;
  26.      Rango = MaxN-MinN+1;
  27.      MenoroMayor = -1;
  28.      ListPart1 = MinN;
  29.      ListPart2 = MaxN;
  30.      ListParts = 2;
  31.      N = MinN-MaxN;
  32.      do {
  33.         N = N+MaxN;
  34.         ChequearCandidato();
  35.      } while (N != MaxN);
  36.      ListasegunGeneracion = MinN+", "+MaxN;
  37.      Mayordistancia = 0;
  38.      Puntero = ListParts;
  39.      Lista = "";
  40.   actions for fotograma 2
  41.      Distancia = eval("ListPart"+Puntero)-eval("ListPart"+(Puntero-1));
  42.      if (MenoroMayor == -1) {
  43.         if (Distancia == Mayordistancia) {
  44.            NElegido = Puntero;
  45.            CambiarMenoroMayor = "Sí";
  46.         } else if (Distancia>Mayordistancia) {
  47.            NElegido = Puntero;
  48.            Mayordistancia = Distancia;
  49.            CambiarMenoroMayor = "No";
  50.         }
  51.      } else if (Distancia == Mayordistancia) {
  52.         CambiarMenoroMayor = "Sí";
  53.      } else if (Distancia>Mayordistancia) {
  54.         NElegido = Puntero;
  55.         Mayordistancia = Distancia;
  56.         CambiarMenoroMayor = "No";
  57.      }
  58.      Puntero = Puntero-1;
  59.   actions for fotograma 3
  60.      if (Puntero>1) {
  61.         gotoAndPlay (2);
  62.      } else {
  63.         if (MenoroMayor == -1) {
  64.            N = Math.floor((eval("ListPart"+NElegido)+eval("ListPart"+(NElegido-1)))/2);
  65.         } else {
  66.            N = Math.ceil((eval("ListPart"+NElegido)+eval("ListPart"+(NElegido-1)))/2);
  67.         }
  68.         ChequearCandidato();
  69.         ListasegunGeneracion = ListasegunGeneracion+", "+N
  70.         Lista = "";
  71.      }
  72. // El resto no cambia, sólo se quita el substring que me dijo EdePC.
  73.  
Sí, es mejor, pero sirve porque la función sólo se ejecuta en 2 frames: En el 1 cuando la lista se genera distinto, y en el frame 3 donde se genera "normal". Si la función se ejecutara más veces esa línea de código que estaba dentro habría que repetirla fuera varias veces, pensé que ocurriría eso, por eso no me parecía buena idea.

Bueno, no era lo que esperaba pero le doy solucionado al tema porque efectivamente lo solucionó. Pero sigo respondiendo otro día.
« Última modificación: 27 Noviembre 2023, 04:38 am por Tachikomaia » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines