Título: ¿Cómo programar mejor? Publicado por: Tachikomaia en 16 Noviembre 2018, 07:04 am Quiero que un programa muestre todas las posibles combinaciones de 6 ítems pudiendo repetirse infinitamente. Ej:
1 2 3 4 5 6 1 1 1 2 1 3 1 4 etc Pero quiero que las muestre en cierto orden. Supongamos que fuese así: Nota: En vez de números se muestran ciertas palabras pero es que los números son convertidos en ellas. WispG ShadeG ShadeG DryadG DryadG ShadeG AuraG AuraG SalaG GnomeG AuraG ShadeG SalaG AuraG GnomeG WispG WispG ShadeG DryadG AuraG SalaG ShadeG GnomeG AuraG GnomeG ShadeG WispG ShadeG DryadG SalaG SalaG GnomeG WispG ShadeG DryadG GnomeG DryadG WispG AuraG GnomeG DryadG WispG ShadeG DryadG GnomeG SalaG GnomeG WispG ShadeG AuraG AuraG SalaG GnomeG WispG ShadeG DryadG DryadG ShadeG AuraG GnomeG AuraG WispG ShadeG AuraG WispG SalaG GnomeG WispG ShadeG SalaG AuraG SalaG GnomeG WispG ShadeG AuraG AuraG SalaG GnomeG WispG ShadeG DryadG AuraG etc En realidad sería más bien así: WispG ShadeG DryadG AuraG DryadG DryadG SalaG GnomeG WispG ShadeG es decir, cada vez que se crea un nuevo largo se inicia con el ítem (o número) más reciente +1. Eso lo pude hacer: Nota: Ignoren de él todo lo relativo a "Creative". Código: Escena 1 Entendidas las listas anteriores podemos pasar a la que me interesa. Es como la anterior pero en X circunstancias (no se preocupen por X) se produce otro método de selección: Creativo. Así: WispG Creativo: ShadeG DryadG ShadeG ShadeG AuraG Creativo: SalaG GnomeG WispG DryadG ShadeG SalaG SalaG GnomeG ShadeG Creativo: DryadG AuraG SalaG GnomeG AuraG ShadeG GnomeG SalaG GnomeG DryadG DryadG AuraG GnomeG WispG Creativo: ShadeG DryadG AuraG SalaG GnomeG SalaG DryadG WispG SalaG GnomeG AuraG DryadG AuraG GnomeG ShadeG ShadeG DryadG AuraG GnomeG WispG Creativo: ShadeG DryadG AuraG SalaG GnomeG WispG GnomeG DryadG ShadeG SalaG GnomeG SalaG DryadG AuraG GnomeG DryadG ShadeG DryadG AuraG GnomeG ShadeG ShadeG DryadG AuraG SalaG GnomeG ShadeG Creativo: DryadG AuraG SalaG GnomeG WispG ShadeG DryadG DryadG DryadG SalaG GnomeG GnomeG DryadG AuraG GnomeG AuraG ShadeG DryadG AuraG GnomeG DryadG ShadeG DryadG AuraG SalaG GnomeG DryadG DryadG AuraG SalaG GnomeG WispG ShadeG AuraG GnomeG WispG WispG etc Eso se logra quitando el goto del final y agregando esto: actions for fotograma 7 TimeforCreative = TimeforCreative-1; if (TimeforCreative<=0) { // Elección creativa. if (CreativeL<7) { // Ese if es sólo para pruebas del code. CreativeL = CreativeL+1; if (CreativeL<ClasicMaxLReached) { // Si el método creativo no creó un... // ...experimento de largo mayor al... // ...del método clásico, aumentarlo. CreativeL = ClasicMaxLReached+1; } Info = "F7: Elección creativa de largo "+CreativeL+"\n"+Info; set ("LastL"+CreativeL, ""); Cursor = 1; Print = ""; do { RecentItem = RecentItem+1; if (6<RecentItem) { // Si resulta un ítem inexistente, arreglarlo. RecentItem = RecentItem-((Math.floor(RecentItem/6))*6); } set ("L"+CreativeL+"P"+Cursor, RecentItem); set ("LastL"+CreativeL, eval("LastL"+CreativeL)+eval("Item"+RecentItem)+" "); Cursor = Cursor+1; } while (Cursor<CreativeL); Print = eval("LastL"+CreativeL); set ("LastL"+CreativeL, eval("LastL"+CreativeL)+eval("Item"+RecentItem)+" "); Info = "F7: Last creado: "+eval("LastL"+CreativeL)+"\n"+Info; RecentItem = RecentItem+1; if (6<RecentItem) { // Si resulta un ítem inexistente, arreglarlo. RecentItem = RecentItem-((Math.floor(RecentItem/6))*6); } set ("L"+CreativeL+"P"+Cursor, RecentItem); Print = Print+eval("Item"+RecentItem)+" "; trace ("Creativo:\t"+Print); Info = "F7: Método creativo creó exp "+Print+"\n"+Info; Info = "F7: RecentItem es "+RecentItem+".\n"+Info; } else { gotoAndPlay (2); Info = "F7: Método creativo alcanzó el máximo.\n"+Info; } } else { Info = "F7: Para la elección creativa falta "+TimeforCreative+"\n"+Info; gotoAndPlay (2); } actions for fotograma 8 stop (); En el F8 se determina si hay Creative o no, pero no den bola a eso. Una vez determinado vuelve al frame 2. En este caso creo que no hay errores en cuanto a usar ítems diferentes cuando inicia un nuevo largo. De hecho eso parece suceder siempre con Creative e imposible de otro modo. Lo señalado en rojo sí es un error que de momento no sé corregir. El programa debería mostrar más combinaciones de 2, pero por algún motivo cree que las mostró todas. Más info: F2: Cursor está en la última P de un exp, 1 Func dice exp: WispG F3: Exp del método clásico creado fácil: WispG F6: RecentItem cambiado a 1 F6: Clasic alcanzó su máximo L: 1 F6: Clasic aumentó su máximo L a 2 F6: Clasic llegó a un L mayor que creative: 2 > 1 F6: El siguiente exp de clasic será de Largo 1 F6: Está listo el exp de máx L: ShadeG ShadeG F7: Elección creativa de largo 2 F7: Last creado: ShadeG ShadeG F7: Método creativo creó exp ShadeG DryadG F7: RecentItem es 3. F2: Cursor está en la última P de un exp, 1 Func dice exp: ShadeG F3: Exp del método clásico creado fácil: ShadeG F6: El siguiente exp de clasic será de Largo 2 F7: Para la elección creativa falta 1 F2: Cursor está en la última P de un exp, 2 Func dice exp: ShadeG AuraG F3: Exp del método clásico creado fácil: ShadeG AuraG F6: RecentItem cambiado a 4 F6: Clasic alcanzó su máximo L: 2 F6: Clasic aumentó su máximo L a 3 F6: Clasic llegó a un L mayor que creative: 3 > 2 F6: El siguiente exp de clasic será de Largo 1 F6: Está listo el exp de máx L: SalaG GnomeG GnomeG F7: Elección creativa de largo 3 F7: Last creado: SalaG GnomeG GnomeG F7: Método creativo creó exp SalaG GnomeG WispG F7: RecentItem es 1. F2: Cursor está en la última P de un exp, 1 Func dice exp: DryadG F3: Exp del método clásico creado fácil: DryadG F6: El siguiente exp de clasic será de Largo 2 F7: Para la elección creativa falta 2 F2: Cursor está en la última P de un exp, 2 Func dice exp: ShadeG SalaG F3: Exp del método clásico creado fácil: ShadeG SalaG F6: El siguiente exp de clasic será de Largo 3 F7: Para la elección creativa falta 1 F2: Cursor está en la última P de un exp, 3 Func dice exp: SalaG GnomeG ShadeG F3: Exp del método clásico creado fácil: SalaG GnomeG ShadeG F6: RecentItem cambiado a 2 F6: Clasic alcanzó su máximo L: 3 F6: Clasic aumentó su máximo L a 4 F6: Clasic llegó a un L mayor que creative: 4 > 3 F6: El siguiente exp de clasic será de Largo 1 F6: Está listo el exp de máx L: DryadG AuraG SalaG SalaG F7: Elección creativa de largo 4 F7: Last creado: DryadG AuraG SalaG SalaG F7: Método creativo creó exp DryadG AuraG SalaG GnomeG F7: RecentItem es 6. F2: Cursor está en la última P de un exp, 1 Func dice exp: AuraG F3: Exp del método clásico creado fácil: AuraG F6: El siguiente exp de clasic será de Largo 2 F7: Para la elección creativa falta 3 F2: Cursor está en la última P de un exp, 2 Func dice exp: ShadeG GnomeG F3: Exp del método clásico creado fácil: ShadeG GnomeG F6: El siguiente exp de clasic será de Largo 3 F7: Para la elección creativa falta 2 F2: Cursor está en la última P de un exp, 3 Func dice exp: SalaG GnomeG DryadG F3: Exp del método clásico creado fácil: SalaG GnomeG DryadG F6: El siguiente exp de clasic será de Largo 4 F7: Para la elección creativa falta 1 F2: Cursor está en la última P de un exp, 4 Func dice exp: DryadG AuraG GnomeG WispG F6: RecentItem cambiado a 1 F6: Clasic alcanzó su máximo L: 4 F6: Clasic aumentó su máximo L a 5 F6: Clasic llegó a un L mayor que creative: 5 > 4 F6: El siguiente exp de clasic será de Largo 1 F6: Está listo el exp de máx L: ShadeG DryadG AuraG SalaG SalaG F7: Elección creativa de largo 5 F7: Last creado: ShadeG DryadG AuraG SalaG SalaG F7: Método creativo creó exp ShadeG DryadG AuraG SalaG GnomeG F7: RecentItem es 6. F2: Cursor está en la última P de un exp, 1 Func dice exp: SalaG F3: Exp del método clásico creado fácil: SalaG F6: El siguiente exp de clasic será de Largo 2 F7: Para la elección creativa falta 4 F2: Cursor está en la última P de un exp, 2 Func dice exp: DryadG WispG F6: El siguiente exp de clasic será de Largo 3 F7: Para la elección creativa falta 3 F2: Cursor está en la última P de un exp, 3 Func dice exp: SalaG GnomeG AuraG F3: Exp del método clásico creado fácil: SalaG GnomeG AuraG F6: El siguiente exp de clasic será de Largo 4 F7: Para la elección creativa falta 2 F2: Cursor está en la última P de un exp, 4 Func dice exp: DryadG AuraG GnomeG ShadeG F3: Exp del método clásico creado fácil: DryadG AuraG GnomeG ShadeG F6: El siguiente exp de clasic será de Largo 5 F7: Para la elección creativa falta 1 F2: Cursor está en la última P de un exp, 5 Func dice exp: ShadeG DryadG AuraG GnomeG WispG F6: RecentItem cambiado a 1 F6: Clasic alcanzó su máximo L: 5 F6: Clasic aumentó su máximo L a 6 F6: Clasic llegó a un L mayor que creative: 6 > 5 F6: El siguiente exp de clasic será de Largo 1 F6: Está listo el exp de máx L: ShadeG DryadG AuraG SalaG GnomeG GnomeG F7: Elección creativa de largo 6 F7: Last creado: ShadeG DryadG AuraG SalaG GnomeG GnomeG F7: Método creativo creó exp ShadeG DryadG AuraG SalaG GnomeG WispG F7: RecentItem es 1. F2: Cursor está en la última P de un exp, 1 Func dice exp: GnomeG F3: Exp del método clásico creado fácil: GnomeG F6: Exps de largo 1 completados. F6: El siguiente exp de clasic será de Largo 2 F7: Para la elección creativa falta 5 F2: Cursor está en la última P de un exp, 2 Func dice exp: DryadG ShadeG F3: Exp del método clásico creado fácil: DryadG ShadeG F6: El siguiente exp de clasic será de Largo 3 F7: Para la elección creativa falta 4 F2: Cursor está en la última P de un exp, 3 Func dice exp: SalaG GnomeG SalaG F3: Exp del método clásico creado fácil: SalaG GnomeG SalaG F6: El siguiente exp de clasic será de Largo 4 F7: Para la elección creativa falta 3 F2: Cursor está en la última P de un exp, 4 Func dice exp: DryadG AuraG GnomeG DryadG F3: Exp del método clásico creado fácil: DryadG AuraG GnomeG DryadG F6: El siguiente exp de clasic será de Largo 5 F7: Para la elección creativa falta 2 F2: Cursor está en la última P de un exp, 5 Func dice exp: ShadeG DryadG AuraG GnomeG ShadeG F3: Exp del método clásico creado fácil: ShadeG DryadG AuraG GnomeG ShadeG F6: El siguiente exp de clasic será de Largo 6 F7: Para la elección creativa falta 1 F2: Cursor está en la última P de un exp, 6 Func dice exp: ShadeG DryadG AuraG SalaG GnomeG ShadeG F3: Exp del método clásico creado fácil: ShadeG DryadG AuraG SalaG GnomeG ShadeG F6: RecentItem cambiado a 2 F6: Clasic alcanzó su máximo L: 6 F6: Clasic aumentó su máximo L a 7 F6: Clasic llegó a un L mayor que creative: 7 > 6 F6: El siguiente exp de clasic será de Largo 2 F6: Está listo el exp de máx L: DryadG AuraG SalaG GnomeG WispG ShadeG ShadeG F7: Elección creativa de largo 7 F7: Last creado: DryadG AuraG SalaG GnomeG WispG ShadeG ShadeG F7: Método creativo creó exp DryadG AuraG SalaG GnomeG WispG ShadeG DryadG F7: RecentItem es 3. F2: Cursor está en la última P de un exp, 2 Func dice exp: DryadG DryadG F3: Exp del método clásico creado fácil: DryadG DryadG F6: El siguiente exp de clasic será de Largo 3 F7: Para la elección creativa falta 6 F2: Cursor está en la última P de un exp, 3 Func dice exp: SalaG GnomeG GnomeG F3: Exp del método clásico creado fácil: SalaG GnomeG GnomeG F6: Exps de largo 2 completados. Ya lo veo más o menos. Luego de establecer el último exp de largo 3, SalaG GnomeG GnomeG, el exp que se produce es ese sumándole 1 a la última parte, lo que daría GnomeG WispG WispG, pero da SalaG GnomeG WispG porque programé mal la suma... o mejor dicho no me di cuenta que fuese necesario eso. Ahora entonces lo que está en los 1eros frames lo tengo que aplicar más adelante también. Deberé crear otra función o algo. Lioso ¿no? ¿será que programar funciones desde el inicio es mejor? Pero entiendo más si veo un flujo del código, sin tener que ir a otro lado a ver qué hace cada función. Ah, y acabo de darme cuenta que en los frames 4 y 5 no he puesto "Info". Es que las puse buscando un error que supuse no estaba ahí. Un error difícil de hallar: En un if del F6 había escrito "Crative" en vez de Creative >___< Título: Re: ¿Cómo programar mejor? Publicado por: Serapis en 16 Noviembre 2018, 14:39 pm Lo que reclamas básicamente es un problema de combinatoria...
En este hilo se trata ampliamente sobre cómo generar todas las permutaciones dados cierta cantidad de elementos, con diferentes algoritmos de forma optimizada: https://foro.elhacker.net/abril_negro/abril_negro_spok_simple_production_of_keys-t468239.0.html Citar Pero quiero que las muestre en cierto orden. Esto es lo que complica, mostrarlas en cierto orden específico... Citar Supongamos que fuese así: ... mmm. No... explícate con palabras, no esperes que nadie perda su tiempo mirando un chorro de líneas para intentar deducir-dilucidar que orden es ése. Si no eres alienígena y comprendes el español exprésate con palabras, luego si quieres pones un ejemplo, pero que sea claro... usa números, letras, no palabras... que se pueda entender de un vistazo. Nadie va a perder una hora de su tiempo (yo por lo menos, no) para intentar entender algo que bien explicado bastan dos frases para describirlo y 20 segundos para leerlo. Título: Re: ¿Cómo programar mejor? Publicado por: antopixel en 16 Noviembre 2018, 16:24 pm Es simple como dice el compañero, intenta aplicar a tu Script la permutacion o combinacion.
Recuerda: Combinacion = No importa el orden de los elementos, no admite repeticion. Permutacion = Importa el orden, no admite repeticion. Título: Re: ¿Cómo programar mejor? Publicado por: Tachikomaia en 17 Noviembre 2018, 03:58 am mmm. No... explícate con palabras, no esperes que nadie perda su tiempo mirando un chorro de líneas para intentar deducir-dilucidar que orden es ése. Bueno, más correcto hubiera sido decir que la lista que quiero generar está compuesta de 2 sublistas que se influyen entre sí, pero me pareció mejor explicar 1ero una de ellas, lo cual es una simplificación de la lista en sí.Y la mejor forma de explicarla que se me ocurre es con el ejemplo, o sea, lo demás es complicado (y conste que aún estoy hablando de la simplificada). 1 2 3, 4 3 3, 5 6, 1, 2 etc ¿En otras palabras? El máximo largo inicia siendo 1. La 1era combinación está compuesta de 1 número, es decir tiene largo 1. Se alcanzó el máximo largo, ergo aumenta 1 y el largo inicial vuelve a ser 1. La 2nda combinación estará compuesta de largo 1, y el número será el mismo que hubo con ese largo, pero se le sumará 1. La 3era tendrá un largo+1 y comenzará con el número más alto+1. Los números se resetean a partir de 7 y en tal caso se considera que son más altos. Es como un circulo. ... En definitiva en cada línea aumenta el largo, pero si llega al máximo se resetea pero el máximo aumenta. Cuando se alcanza un largo que no se había alcanzado, se eligen números posteriores a los más altos hasta ahora. Puse los ítems en vez de los números porque es lo que genera el código, me resultaba más fácil así. Yo también me canso de todo esto. Citar usa números, letras, no palabras... que se pueda entender de un vistazo. Vale, se entiende más como dices, pero cuando ponen ejemplos de combinatoria suelen nombrar colores y no creo que te quejes de eso. No debería ser tanto problema que en vez de colores sean unas palabras. Y dije que eran 6, así que no es que hubiera alguna que apareciera nuevo por ahí, ni son tantas como para que sea tan complicado.Citar bien explicado bastan dos frases para describirlo Bueno xD si llegas a entenderlo hazme el favor de describirlo como dices xDNo creo que se pueda. La lista que busco es así: 1 Creativo: 2 3 2 2 4 5 6 1 3 2 5 5 6 2 Creativo: 3 4 5 6 etc O sea, es como la lista anterior pero hay líneas en que hay otro modo de elección, uno en que se usa un largo antes no usado. ¿Qué líneas? Eso es variable y no viene a cuento. Creo que es más sencillo de lo que pensé, pero por las dudas... Me refiero a que los nuevos largos siempre ocurren en la línea "Creativo" (salvo el 3, pero si ajustando eso se simplifica todo lo demás no hay problema), o sea que con esto la parte (del programa) que genera líneas normales no necesita saber qué hacer en caso de alcanzar un largo nunca antes alcanzado, porque eso siempre lo haría el proceso alternativo, la línea "Creativo". ¿En qué más puedo ayudarte? El tema también podría plantearlo de otro modo: ¿Cómo hacer una inteligente búsqueda de una solución a un problema? Si dices que depende mucho del problema, te lo digo, pero te estoy preguntando por algo general, considero que puede haber una búsqueda que dependiendo del tipo de problema haga un proceso u otro. Si me vas a responder mediante un proceso para 1 tipo de problema, me sirve pero no es lo mismo. Bueno, el problema es, en el Legend of Mana de Play 1, modificar un CotKnife de modo que quede lo mejor posible o más o menos así (en caso de no existir realmente "lo mejor"), sin usar guías, etc. CotKnife en realidad es sólo un ejemplo, pero si te digo "un arma" tarde o temprano me dirías "depende de cual", así que ya he dicho. La modificación de armas consiste en que se le agregan cosas. ¡He ahí la combinatoria de cualquier número de elementos, donde importa el orden y pueden repetirse! Yo podría probar... Item1+Item2 Item1+Item3 etc Pero eso es aburrido y poco óptimo (o poco inteligente) ¿verdad? Lo inteligente en este caso sería siempre probar distintos ítems y distintos largos, al menos si aumentar el largo parece mejorar el resultado. El problema es que hacer eso manualmente llega un punto en que es complicado porque hay que ponerse a pensar "qué combinación toca ahora". Especialmente si se quiere evitar que ciertos ítems sean contiguos (si ya se probaron), como pretendí al inicio (ya no) cuando quise hacerlo manualmente. En fin, es el problema del tema, pero la última pregunta que te hice es más amplia. Recuerda: Siempre tengo líos con eso, y eso que antes de preguntar googlé. En mi caso se admite repetición e importa el orden.Combinacion = No importa el orden de los elementos, no admite repeticion. Permutacion = Importa el orden, no admite repeticion. Título: Re: ¿Cómo programar mejor? Publicado por: Tachikomaia en 20 Noviembre 2018, 01:19 am NEBIRE, entré al link y tuve más o menos el mismo problema que tú aquí, no entiendo bien de qué están hablando y el link para descargar tiene varios archivos, en formatos extraños para mí. ¿Podemos simplificar?
Para Nebire o cualquier otro: ¿Entiendes esto? Código: Escena 1 El output: 0 1 2 3 4 5 6 7 8 9 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 000 001 002 003 y sigue. Como ves, es un código que muestra todas las posibles mezclas de los números del 0 al 1. Te comentaré todo el código. Código: Escena 1 Chars es la cantidad de caracteres. Código: function Concatenarytrace () { Print al final de la función será un número que se mostrará en pantalla, más especificamente es la concatenación de Char0, Char1 y todo el que haya sido creado, marcado por Chars. Si Chars es 3 entonces concatenará desde Char0 al Char2. Para comprender Cursor ayuda imaginar la mezcla y que el cursor es una rayita debajo de una parte. También lo puedes considerar un contador, que determina qué Char se está concatenando. ¿eval entiences cómo funciona ahí? Si por ejemplo Cursor es 1 entonces hace Print+Char1. trace muestra Print en pantalla. Código: actions for fotograma 2 Código: actions for fotograma 3 Numero = [1, 2] Y tendrías una función en el lenguaje que sea "concatenar las partes del array", pero yo lo hago así: Char0 = 1 Char1 = 2 Y para concatenar uso la función esa que te mostré al inicio. Sí, es más complicado capaz, pero no uso arrays. Código: actions for fotograma 4 Si no hay más números, es hora de crear uno, como cuando al sumar 1 a 9 obtenemos 10, o sea 2 caracteres, uno más que antes. Pero en este caso obtendremos 00. Código: actions for fotograma 5 Lo de "reinicia un proceso" es muy vago, fue lo que me salió en el momento... Se refiere a que vuelve a la parte donde se resetea el char y se fija si es posible bajar el cursor. ¿Ok? Como ves, eso es una versión simplificada del problema inicial que plantee. Esto lo había hecho antes y lo otro está bastado bastante en esto. Bueno. si entendiste mi código, quisiera que me digas cómo harías para mejorarlo, hacerlo más legible, editalo, no sé. Si entendés eso te planteo otra cosa y así sucesivamente hasta llegar al problema original. Saludos! |