Autor
|
Tema: ¿Cómo los números se producirían más rápido en M.Flash 5? (Leído 3,446 veces)
|
Tachikomaia
Conectado
Mensajes: 1.411
Hackentifiko!
|
Si un while dura demasiado, aparece un mensaje diciendo eso, así que no quiero usar whiles largos como: N = -1 do N++ mostrar N while N < 100 pero cortos puede ser. Con los for supongo que ocurre lo mismo, igual no me gustan los for. Cuando una repetición es larga, se puede hacer: Frame 1: N = -1 Frame 2: N++ mostrar N Frame 3: Si N<100 goto 2 Es más lento que un while pero tiene otro defecto peor: Sólo se producen números en el frame 2. Para mejorar eso se puede hacer: Frame 1: N = -1 Frame 2: N++ mostrar N Frame 3: N++ mostrar N Si N<100 goto 2 Si muestra el 101 y no se quiere, se cambia la condición por N<99 o N<=100. Para evitar repetición de código, se puede hacer algo así: actions for fotograma 1 N = -1; function Variar () { N = N+1; trace (N); if (N == 100) { stop(); } else if (Fram == 3) { gotoAndPlay (2); } } actions for fotograma 2 Fram = 2; Variar(); actions for fotograma 3 Fram = 3; Variar();
Pero mi código quiero que guarde los Ns que cumplan ciertas condiciones y que se detenga sólo cuando cada una haya sido cumplida por algún N, hago esto: actions for fotograma 1 Soluciones = 0; N = -1; function Variar () { N = N+1; C = String(N).charat(N); trace (N+": "+C); if (C == 0) { if (Solfor0 == undefined) { Solfor0 = N; trace ("para que C sea 0 usar N: "+N); Soluciones = Soluciones+1; } } else if (C == -9) { if (Solfor9 == undefined) { Solfor9 = N; trace ("para que C sea -9 usar N: "+N); Soluciones = Soluciones+1; } } else if (C == 4.5) { if (Solfor4 == undefined) { Solfor4 = N; trace ("para que C sea 4.5 usar N: "+N); Soluciones = Soluciones+1; } } else if (C == -7.2) { if (Solfor7 == undefined) { Solfor7 = N; trace ("para que C sea -7.2 usar N: "+N); Soluciones = Soluciones+1; } } if (Soluciones<4) { if (Fram == 3) { gotoAndPlay (2); } } else { trace ("para que C sea 0 usar N: "+Solfor0); trace ("para que C sea -9 usar N: "+Solfor9); trace ("para que C sea 4.5 usar N: "+Solfor4); trace ("para que C sea -7.2 usar N: "+Solfor7); stop (); } } actions for fotograma 2 Fram = 2; Variar(); actions for fotograma 3 Fram = 3; Variar();
Por otro lado, tengo otro programa que intento que haga lo mismo pero en vez de probar los números 0, 1, 2, 3... quiero que sean 0, 1, 10, 2, 11, 100... y quiero que funcione más rápido si es posible, es decir, ya tengo un código que hace eso pero tiene el defecto de tener frames "al ped*" como mostré en el código 2, quiero aplicarle la "técnica" que mostré en el 4, o acelerarlo así de algún modo ¿cómo? Este es el código: actions for fotograma 1 Soluciones = 0; MinLongitud = 1; MaxLongitud = 1; N1 = -1; actions for fotograma 2 Longitud = MinLongitud; actions for fotograma 3 Nombre = "N"+Longitud; N = eval(Nombre)+1; if (String(N).length>Longitud) { // El valor ya fue producido. MinLongitud = MinLongitud+1; gotoAndPlay (2); } else { // Guardar el valor en la lista correspondiente. set (Nombre, N); C = String(N).charat(N); trace (N+" resulta "+C); if (C == 0) { if (Solfor0 == undefined) { Solfor0 = N; trace ("para que C sea 0 usar N: "+N); Soluciones = Soluciones+1; } } else if (C == -9) { if (Solfor9 == undefined) { Solfor9 = N; trace ("para que C sea -9 usar N: "+N); Soluciones = Soluciones+1; } } else if (C == 4.5) { if (Solfor4 == undefined) { Solfor4 = N; trace ("para que C sea 4.5 usar N: "+N); Soluciones = Soluciones+1; } } else if (C == -7.2) { if (Solfor7 == undefined) { Solfor7 = N; trace ("para que C sea -7.2 usar N: "+N); Soluciones = Soluciones+1; } } } actions for fotograma 4 // ¿El último valor producido es de la lista de los más largos? if (Longitud<MaxLongitud) { // No, producir uno de una lista de más largos: Longitud = Longitud+1; gotoAndPlay (3); } else { // Sí, se creará un valor para una nueva lista, de valores más largos. // La siguiente ecuación no funciona cuando MaxLongitud es 1, por eso hay un if y else. if (MaxLongitud>1) { set ("N"+(MaxLongitud+1), eval("N"+MaxLongitud)*10-1); } else { set ("N"+(MaxLongitud+1), 9); } MaxLongitud = MaxLongitud+1; gotoAndPlay (2); }
|
|
« Última modificación: 16 Enero 2024, 17:51 pm por Tachikomaia »
|
En línea
|
|
|
|
Serapis
|
Si un while dura demasiado, aparece un mensaje diciendo eso, así que no quiero usar whiles largos como: N = -1 do N++ mostrar N while N < 100 pero cortos puede ser. Con los for supongo que ocurre lo mismo, igual no me gustan los for. Al decir 'duran demasiado', no tengo claro si tratas de decir que la ejecución del interior 'hace demasiadas cosas' o que la condición (en el ejemplo un contador), es elevado.... Verás, si estás operando con cada día del año, que son 365, pués es correcto que el bucle deba tener 365 iteraciones... que te guste o no, no tiene sentido. El cóoooodigo que debe hacerse es justo el preciso que resuelva el problema que se trata de solucionar, no otro distinto que te resulte 'más bonito'... para cosas bonitas, está el arte (pintura, escultura, etc...). La programación es funcional, es lo que se le exige. Cuando una repetición es larga, se puede hacer: Frame 1: N = -1 Frame 2: N++ mostrar N Frame 3: Si N<100 goto 2 Es más lento que un while pero tiene otro defecto peor: Sólo se producen números en el frame 2. pero ahí, simplemente estás haciendo 2 incrementos seguidos, para eso proporcionas al contador que sume de dos en dos y ya. Claro que quizás sea solo a modo d eejemplo del cuerpo de un bucle, en ese caso, repetir 2 veces el cuerpo completo de un bucle uno tras otro, es hacer redundancia del código para nada. Los bucles son hoy día muy efectivos, pués el procesador cuenta con registros de índice y comprobaciones que lo hacen muy eficiente. Desde luego un salto incondicional tras una comparación más o menos compleja (que hacen las veces de condiciones), puede ser ligeramente más rápido, pero oscurece el código, especialmente cuando el código ha de tener muchas líneas de código... y con muchas no me refiero a unas cientas o pocos miles (que también notarán esa afección). Los bucles forman la primera salida hacia la programación estrucutrada... quien a día de hoy no los use (porque prefiera usar 'goto's), como programador no puede tener mucho futuro, porque allí donde vaya, nadie va a entender su código sin dedicarle unos meses y ninguna empresa estará dispuesto a que sus trabajadores pierdan tiempo tan estúpidamente solo por ahorrar 2 instrucciones con cada iteración de un bucle. A menudo optimizando el código superas en mucho la eficiencia como para preocuparte de una cosa tan insignificante. ...nota que a día de hoy, los procesadores operan en el rango de 1-5 mil millones de instrucciones por segundo, y entiende por tanto lo estupido de tratar de ahorrar 2 instrucciones en un bucle de 100, 1000 o 1.000.000 de iteraciones, cuando revisando el código seguramente se pueda mejorar en muchas partes quizás hasta un 10% más eficiente, a menudo incluso no es extraño un 1000%, especialmente en casos de usar lenguajes inadecuados. Por otro lado, tu gran problema (creo que ya te lo he dicho más de una vez, aunque quizás con otras palabras), es que estás muy limitado porque usas un lenguaje muy limitado. Nada peor para un programador que ajustarse a la medida de un lenguaje, porque implica que sus luces y sus sombras no vendrán marcadas por su intelecto, sino directamente limitadas por el lenguaje en el que 'se autoajusta'. Un lenguaje de programación, debe servir para ampliarte horizontes, no para limitártelos. Cuando un lenguaje te limita, es el momento adecuado para abandonarlo y saltar a otro más 'evolucionado', menos limitado, salvo que al momento presente no exista ninguno mejor al caso...
|
|
|
En línea
|
|
|
|
Tachikomaia
Conectado
Mensajes: 1.411
Hackentifiko!
|
Al decir 'duran demasiado', no tengo claro si tratas de decir que la ejecución del interior 'hace demasiadas cosas' o que la condición (en el ejemplo un contador), es elevado.... Me refiero a que toma mucho tiempo ejecutar el código. Si el código de cada frame debe ejecutarse en 0.2 segundos o lo que sea y le pones un código larguísimo, no se podrá ejecutar tan rápido y dará un mensaje de error, al menos así me ha pasado algo así e interpreto que es por eso. Además la pantalla se actualiza sólo cuando hay un cambio de frame. Verás, si estás operando con cada día del año, que son 365, pués es correcto que el bucle deba tener 365 iteraciones... Aquí debe hacerse en distintos frames. El cóoooodigo que debe hacerse es justo el preciso que resuelva el problema que se trata de solucionar, no otro distinto que te resulte 'más bonito'... No es una cuestión de belleza sino de que funcione lo más rápido posible con las herramientas que me gusta usar y puede ser con otras que desconozca. pero ahí, simplemente estás haciendo 2 incrementos seguidos No, es como un while: Frame 1: // Definición del número. N = -1 Frame 2: // Incrementar 1 al número. N++ mostrar N Frame 3: // Repetir el frame 2 hasta que N sea 100. Si N<100 goto 2 Primero N es -1. Pasa al frame 2, ahí aumenta el número y lo muestra: 0 Pasa al frame 3, vuelve al 2. En el frame 2, aumenta el número y lo muestra: 1 En el frame 3 vuelve al 2. Y así. No es eficiente porque en el frame 3 hay una pequeña pausa. ...Bueno, a mí me gusta programar eficientemente, pero con goto. Puede que sea un tanto contradictorio, pero no tanto. Es como que tú vas en helicóptero y yo... intento hacer una bicicleta lo mejor posible, aunque no vuele. Es que a pesar de todo no he visto un lenguaje que me parezca mejor, simplemente debo aprender a usar mejor este.
|
|
|
En línea
|
|
|
|
Tachikomaia
Conectado
Mensajes: 1.411
Hackentifiko!
|
Hice esto: actions for fotograma 1 // Este programa produce 1ero un número de longitud 1: 0. // Luego otro de long 1: 1. Y otro de long 2: 10. // Luego otro de 1: 2. Otro de 2: 11. Y uno de 3: 100. // Y así. Es como si produjera cada vez más listas, // que tienen números más largos que las anteriores, // pero sólo se guarda el último valor de cada una. // Los valores de la lista 1 tendrán longitud 1. Los de la 2, 2. // Y así. Cuando ya no es posible producir uno de una longitud, // no se producen más de esa. SolucionesHalladas = 0; MinLongitudDeLosN = 1; MaxLongitudDeLosN = 1; ValorDelUltimoNDeLaLista1 = -1; LongitudDelNaModificar = MinLongitudDeLosN; function ProcesoaRepetir () { NombreDelNaModificar = "ValorDelUltimoNDeLaLista"+LongitudDelNaModificar; // Obtener lo que sería el nuevo valor de la lista indicada por LongitudDelNaModificar: N = eval(NombreDelNaModificar)+1; // ¿El nuevo N ya fue producido por otra lista? // O: ¿Tiene N más longitud que los Ns de su propia lista? if (String(N).length>LongitudDelNaModificar) { // Sí, no producir más Ns de esa lista: MinLongitudDeLosN = MinLongitudDeLosN+1; // La función se reaplicará pero para producir un N de una longitud mayor: LongitudDelNaModificar = MinLongitudDeLosN; if (Fram == 3) { gotoAndPlay (2); } } else { // Guardar el valor en la lista correspondiente: set (NombreDelNaModificar, N); // Obtener característica usando N: CaracteristicaDeN = String(N).charat(N); trace (N+" resulta "+Caracteristica); // Si se obtiene una característica deseada, informar, // guardarla y incrementar las soluciones halladas. if (CaracteristicaDeN == 0) { if (Solfor0 == undefined) { Solfor0 = N; trace ("para que la característica sea 0 usar N: "+N); SolucionesHalladas = SolucionesHalladas+1; } } else if (CaracteristicaDeN == -9) { if (Solfor9 == undefined) { Solfor9 = N; trace ("para que la característica sea -9 usar N: "+N); SolucionesHalladas = SolucionesHalladas+1; } } else if (CaracteristicaDeN == 4.5) { if (Solfor4 == undefined) { Solfor4 = N; trace ("para que la característica sea 4.5 usar N: "+N); SolucionesHalladas = SolucionesHalladas+1; } } else if (CaracteristicaDeN == -7.2) { if (Solfor7 == undefined) { Solfor7 = N; trace ("para que la característica sea -7.2 usar N: "+N); SolucionesHalladas = SolucionesHalladas+1; } } gotoAndPlay (4); } } actions for fotograma 2 Fram = 2; ProcesoaRepetir(); actions for fotograma 3 Fram = 3; ProcesoaRepetir(); actions for fotograma 4 // ¿El último valor producido es de la lista de los más largos? if (LongitudDelNaModificar<MaxLongitudDeLosN) { // No, producir uno de una lista de más largos: LongitudDelNaModificar = LongitudDelNaModificar+1; } else { // Sí, se creará un valor para una nueva lista, de valores más largos: // La siguiente ecuación no funciona cuando MaxLongitudDeLosN es 1, por eso hay un if y else: if (MaxLongitudDeLosN>1) { set ("ValorDelUltimoNDeLaLista"+(MaxLongitudDeLosN+1), eval("ValorDelUltimoNDeLaLista"+MaxLongitudDeLosN)*10-1); } else { set ("ValorDelUltimoNDeLaLista"+(MaxLongitudDeLosN+1), 9); } MaxLongitudDeLosN = MaxLongitudDeLosN+1; // Producir un valor de la mínima longitud actual: LongitudDelNaModificar = MinLongitudDeLosN; } gotoAndPlay (2);
Funciona mucho más rápido pero no lo puedo parar (no sé por qué) y en cierto punto me aparece el mensaje: Intentaré entender por qué no lo puedo parar y mejorarlo pero si sigo así para cuestiones como esta puede que pida que me recomienden un programa/lenguaje. Por ahora no.
|
|
|
En línea
|
|
|
|
|
|