Título: Generar lista evitando ", " al inicio sin repetir code. Publicado por: Tachikomaia en 22 Noviembre 2023, 05:47 am Tengo un programa que en resumen hace esto:
Código: ListasegunGeneracion = ""; , 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. Título: Re: Generar lista evitando ", " al inicio sin repetir code. Publicado por: profinet 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> Título: Re: Generar lista evitando ", " al inicio sin repetir code. Publicado por: EdePC 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
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
NOTA: todos mis ejemplos están basados en ActionScript 2 y mínimo Flash 5, versiones anteriores serían extremadamente antiguas Título: Re: Generar lista evitando ", " al inicio sin repetir code. Publicado por: Tachikomaia 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. Título: Re: Generar lista evitando ", " al inicio sin repetir code. Publicado por: profinet 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) { 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) { - 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) { 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; - 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. Título: Re: Generar lista evitando ", " al inicio sin repetir code. Publicado por: Serapis en 24 Noviembre 2023, 23:32 pm Es sencillo..
Crea primero el primer elemento, por ejemplo: 'a' Luego el resto ',b,c,d...' Título: Re: Generar lista evitando ", " al inicio sin repetir code. Publicado por: Tachikomaia en 25 Noviembre 2023, 07:15 am EdePC:
Bien, me funcionó esto que me dijiste: Citar String.substr 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).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. 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.Título: Re: Generar lista evitando ", " al inicio sin repetir code. Publicado por: MCKSys Argentina 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 (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! Título: Re: Generar lista evitando ", " al inicio sin repetir code. Publicado por: EdePC 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). Título: Re: Generar lista evitando ", " al inicio sin repetir code. Publicado por: Tachikomaia 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' 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):Luego el resto ',b,c,d...' Código 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
Con tu método tendría que hacerlo así: Código
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 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. |