¿Cómo captar los pares de una combinación de varios?

Iniciado por Tachikomaia, 18 Octubre 2018, 07:03 AM

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

Tachikomaia

O algo así.

El juego Legend of Mana de Play tiene un sistema de modificación de armas/armaduras en el cual puedes agregar cosas a ellas infinitamente, pero algunas cosas perjudican al equipo y algunos resultados sólo ocurren cuando se cumplen ciertos requisitos. Hay guías de esto, pero quiero hacer una investigación por mi mismo, la cual implica probar diferentes combinaciones en el juego.

Supongamos que sólo hay X cantidad de ítems y cada uno se llama como una letra, distinta. X es la cantidad de letras. Qué pruebas hacer y en qué orden es todo un tema, yo diría que aparte, pero si quieren lo hablamos. La cuestión es que quiero usar un método más o menos óptimo, o sea, esta serie de pruebas:
A
B+C
D+E+F
G+H+I+J
...etc, parece más óptimo que esta:
A
A+A
A+B
A+C
...parece, pero bue, digamos que sí es.

Yo uso una serie más o menos así:
A
B
C+D
E
F+G
H+I+J

Cuando haya probado todos los elementos (aún no las combinaciones), quiero que las próximas combinaciones sean de elementos que aún no se hayan combinado. Por ejemplo en este caso, I+H debería probarse posteriormente a I+F, porque en cierto modo ya fue probado en H+I+J (no es que a priori pueda concluirse el resultado, pero por una cuestión de probabilidad y lógica tiene sentido probar algo más diferente).

A medida que avance, cada vez me será más complicado ver qué pares de elementos probé y cuales no, por eso quisiera algo que si yo le escribo por ejemplo A+B+C me devuelva
AB
AC
BC

Ahora que pienso es algo de permutaciones o algo así, pensé que era un problema más extraño... pero en lo posible no quiero programar tanto, hice una tabla en Excel donde marco con un número las veces que ciertos elementos se combinaron, y le puse un sumador así que busco los que tienen 0 y así sucesivamente. Me gustaría que de alguna forma esos números se escribieran solos, o sea, supongamos que la tabla sólo tuviera 3 elementos:
_____A__B__C
_____0__0__0
A_0
B_0
C_0
Los 0 son las sumas. En las filas, las veces que ese elemento se combinó con otro y estuvo antes. En las columnas, lo mismo pero si estuvo después.

En un texto aparte voy anotando las combinaciones y los resultados:
A: Poder de ataque+1, esencia de fuego+1, etc.
B: Poder de ataque+1, técnica+1, etc.
C+A: Poder de ataque+2, esencia de fuego+1. etc.
etc

Luego marco en la tabla las cosas que se combinaron:
_____A__B__C
_____0__0__0
A_0
B_0
C_1__1

Yo quisiera que de alguna forma, si es posible, escriba el texto, y luego esos números aparezcan.
Por ejemplo escriba C+A y se le sume 1 a lo que haya en la celda correspondiente.

El texto puede estar en celdas separadas, es decir, cada elemento en una celda, lo puedo ir poniendo en otra hoja.

Si en Excel es muy complicado o imposible, bueno, lo pensaré en algo más "técnico", de hecho está bueno si pudiera hacer que las selecciones de qué elementos combinar se hicieran automáticamente, no tendría que andar viendo cuales tienen menos uso ni anotando tanto en la tabla...


Nos veremos.

Tachikomaia

Había olvidado varios detalles de este problema, pero luego de mucho pude hacer una buena base para la investigación:
Escena 1
   actions for fotograma 1
      // Ítems.
      Item1 = "WispG";
      Item2 = "ShadeG";
      Item3 = "DryadG";
      Item4 = "AuraG";
      Item5 = "SalaG";
      Item6 = "GnomeG";
      Item7 = "JinnG";
      Item8 = "UndineG";
      Item9 = "WispS";
      Item10 = "ShadeS";
      Item11 = "DryadS";
      Item12 = "AuraS";
      Item13 = "SalaS";
      Item14 = "GnomeS";
      Item15 = "JinnS";
      Item16 = "UndineS";
      Item17 = "FireC";
      Item18 = "EarthC";
      Item19 = "WindC";
      Item20 = "WaterC";
      Item21 = "SunC";
      Item22 = "MoonC";
      Item23 = "GlowC";
      Item24 = "ChaosC";
      Item25 = "RoundS";
      Item26 = "OblongS";
      Item27 = "CroakedS";
      Item28 = "BigS";
      Item29 = "SmallS";
      Item30 = "LongS";
      Item31 = "FlatS";
      Item32 = "SpinyS";
      Item33 = "Bellgrapes";
      Item34 = "DiceB";
      Item35 = "LShoes";
      Item36 = "PShoes";
      Item37 = "Squalphin";
      Item38 = "Citrisquid";
      Item39 = "Springanana";
      Item40 = "PeachP";
      Item41 = "Apricat";
      Item42 = "Whalamata";
      Item43 = "POclock";
      Item44 = "FishyF";
      Item45 = "Boarmelon";
      Item46 = "Rhinoloupe";
      Item47 = "Orcaplant";
      Item48 = "Garlicrown";
      Item49 = "HoneyO";
      Item50 = "SMoai";
      Item51 = "SCarrot";
      Item52 = "Conchurnip";
      Item53 = "CornF";
      Item54 = "Cabadilllo";
      Item55 = "Needletuce";
      Item56 = "CherryB";
      Item57 = "MPotato";
      Item58 = "Lilipods";
      Item59 = "Bumpkin";
      Item60 = "HearhM";
      Item61 = "SpadeB";
      Item62 = "Mushroom";
      Item63 = "AnimalM";
      Item64 = "BugM";
      Item65 = "LizardM";
      Item66 = "FishM";
      Item67 = "BirdM";
      Item68 = "MorphM";
      Item69 = "DemonM";
      Item70 = "DragonS";
      Item71 = "OddM";
      Item72 = "MagicM";
      Item73 = "RottenM";
      Item74 = "SharpC";
      Item75 = "PoisonC";
      Item76 = "Scisors";
      Item77 = "HealingC";
      Item78 = "ZombieC";
      Item79 = "VampireF";
      Item80 = "LittleE";
      Item81 = "SleeptyE";
      Item82 = "SillyE";
      Item83 = "DangerousE";
      Item84 = "AngryE";
      Item85 = "BlankE";
      Item86 = "CreepyE";
      Item87 = "WickedE";
      Item88 = "AngelF";
      Item89 = "RavenF";
      Item90 = "CFeather";
      Item91 = "MothW";
      Item92 = "FlamingQ";
      Item93 = "WhiteF";
      Item94 = "AromaO";
      Item95 = "DBlood";
      Item96 = "Acid";
      Item97 = "HolyW";
      Item98 = "Ether";
      Item99 = "Mercury";
      Item100 = "StinkyB";
      Item101 = "GhostH";
      Item102 = "DBreath";
      Item103 = "VirginS";
      Item104 = "Electr";
      Item105 = "Moss";
      Item106 = "EarW";
      Item107 = "BBat";
      Item108 = "Sulpher";
      Item109 = "PoisonP";
      Item110 = "SleepP";
      Item111 = "KnockD";
      Item112 = "Rust";
      Item113 = "GraveD";
      Item114 = "Ash";
      Item115 = "Hairball";
      Item116 = "Needle";
      Item117 = "Mirror";
      Item118 = "WadW";
      Item119 = "MessyS";
      Item120 = "GreenballB";
      Item121 = "TakoB";
      // Parte 1 del experimento de largo 1.
      L1P1 = 0;
      // Último experimento de largo 1 que se hará.
      LastL1 = "TakoB ";
      // Último ítem usado.
      RecentItem = 1;
      // Relativo al largo de los experimentos...
      // ...del método clásico.
      ClasicMinL = 1;
      ClasicActualL = 1;
      ClasicMaxL = 1;
      ClasicMaxLReached = 1;
      // Largo del método creativo.
      CreativeL = 1;
      // Experimentos antes de hacer uno del método creativo.
      TimeforCreative = 1;
      // Valor de TimeforCreative cuando debe recargarse.
      ChargedTimeforCreative = 1;
      // Mayor largo alcanzado por cualquier método.
      AnyMaxL = 1;
      Info = "";
      function Concatenarytrace () {
         // Concatena las partes de los experimentos.
         Print = "";
         Cursor = 0;
         do {
            Cursor = Cursor+1;
            Print = Print+eval("Item"+eval("L"+ClasicActualL+"P"+Cursor))+" ";
         } while (Cursor<ClasicActualL);
         trace (Print);
         Info = "Func dice exp: "+Print+"\n"+Info;
      }
   actions for fotograma 2
      // Cursor indicará la parte última de un experimento.
      Cursor = ClasicActualL;
      Info = "F2: Cursor está en la última P de un exp, "+ClasicActualL+"\n"+Info;
   actions for fotograma 3
      if (eval("L"+ClasicActualL+"P"+Cursor)<6) {
         // Si el char es aumentable, aumenta.
         set ("L"+ClasicActualL+"P"+Cursor, eval("L"+ClasicActualL+"P"+Cursor)+1);
         Concatenarytrace();
         Info = "F3: Exp del método clásico creado fácil: "+Print+"\n"+Info;
         gotoAndPlay (6);
      }
   actions for fotograma 4
      // El char no es aumentable, ergo se resetea.
      set ("L"+ClasicActualL+"P"+Cursor, 1);
      if (1<Cursor) {
         // Si Cursor puede bajar, baja.
         Cursor = Cursor-1;
      } else {
         // Sino, se muestra el reseteado.
         Concatenarytrace();
         gotoAndPlay (6);
      }
   actions for fotograma 5
      if (eval("L"+ClasicActualL+"P"+Cursor)<6) {
         // Si el char es aumentable, aumenta.
         set ("L"+ClasicActualL+"P"+Cursor, eval("L"+ClasicActualL+"P"+Cursor)+1);
         Concatenarytrace();
         gotoAndPlay (6);
      } else {
         // Sino, se resetea y reinicia un proceso.
         gotoAndPlay (4);
      }
   actions for fotograma 6
      // Esto es aftertrace de clasic.
      if (Print == eval("LastL"+ClasicActualL)) {
         // Si el experimento mostrado es igual al grabado como último...
         // ...no se hacen más experimentos con ese largo.
         Info = "F6: Exps de largo "+ClasicMinL+" completados.\n"+Info;
         ClasicMinL = ClasicMinL+1;
      }
      if (CreativeL<=ClasicActualL && ClasicMaxL-1<=ClasicActualL) {
         // Si el largo del último experimento del método creativo...
         // ...es menor o igual al largo de este experimento clásico...
         // ...y ese es igual o mayor al máximo-1 que puede ser...
         // ..., Recentitem cambia.
         RecentItem = eval("L"+ClasicActualL+"P"+ClasicActualL);
         Info = "F6: RecentItem cambiado a "+RecentItem+"\n"+Info;
      }
      if (ClasicActualL<ClasicMaxL) {
         // Si el largo es aumentable, aumenta.
         ClasicActualL = ClasicActualL+1;
         Info = "F6: El siguiente exp de clasic será de Largo "+ClasicActualL+"\n"+Info;
      } else {
         // Sino, quedará al mínimo pero el máximo aumenta.
         ClasicMaxLReached = ClasicMaxL;
         Info = "F6: Clasic alcanzó su máximo L: "+ClasicMaxL+"\n"+Info;
         if (ClasicMaxL<7) {
            // Ese if es sólo para pruebas del code.
            ClasicMaxL = ClasicMaxL+1;
            Info = "F6: Clasic aumentó su máximo L a "+ClasicMaxL+"\n"+Info;
            if (CreativeL<ClasicMaxL) {
               // Si el método creativo no creó un experimento...
               // ...del largo alcanzado por el método clásico...
               // ..., crearlo (no se usará aún) y marcar que será...
               // ...el último experimento de ese largo.
               Info = "F6: Clasic llegó a un L mayor que creative: "+ClasicMaxL+" > "+CreativeL+"\n"+Info;
               set ("LastL"+ClasicMaxL, "");
               Cursor = 1;
               // Cálculo del ítem más recientemente usado.
               NextRecentItem = eval("L"+ClasicActualL+"P"+ClasicActualL);
               do {
                  NextRecentItem = NextRecentItem+1;
                  if (6<NextRecentItem) {
                     // Si resulta un ítem inexistente, arreglarlo.
                     NextRecentItem = NextRecentItem-((Math.floor(NextRecentItem/6))*6);
                  }
                  set ("L"+ClasicMaxL+"P"+Cursor, NextRecentItem);
                  set ("LastL"+ClasicMaxL, eval("LastL"+ClasicMaxL)+eval("Item"+NextRecentItem)+" ");
                  Cursor = Cursor+1;
               } while (Cursor<ClasicMaxL);
               set ("L"+ClasicMaxL+"P"+Cursor, NextRecentItem);
               set ("LastL"+ClasicMaxL, eval("LastL"+ClasicMaxL)+eval("Item"+NextRecentItem)+" ");
            }
         }
         ClasicActualL = ClasicMinL;
         Info = "F6: El siguiente exp de clasic será de Largo "+ClasicMinL+"\n"+Info;
         Info = "F6: Está listo el exp de máx L: "+eval("LastL"+ClasicMaxL)+"\n"+Info;
      }
   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 ();
   actions for Símbolo 1
      on (release, keyPress "<Left>") {
         ChargedTimeforCreative = 1;
         TimeforCreative = ChargedTimeforCreative;
         gotoAndPlay (2);
      }
   actions for Símbolo 2
      on (release, keyPress "<Right>") {
         ChargedTimeforCreative = ChargedTimeforCreative+1;
         TimeforCreative = ChargedTimeforCreative;
         gotoAndPlay (2);
      }
Aunque son más de 100 ítems, lo limité a 6 para ver mejor que el "reset" (ver abajo) funcione bien. Parecido en cuanto al largo, está limitado a 7. En el frame 8 hay un par de botones, nombrados en el código al final como Símbolo 1 y 2. El programa pide que en el juego se pruebe el ítem 1. Luego el 2 y 3. Luego pregunta si eso fue mejor que lo anterior (para eso los botones). O sea, intercala 2 métodos. A uno le llamo Clasic y es:
1
2
34
3
35
612
etc
Al otro le llamo Creative y sería así:
1
23
356
1234
etc
Cuando se produce un largo no alcanzado, se compone de los siguientes ítems al más elevado. Cuando es 6, cambia a 1. Los métodos, al intercalarse forman esto:
WispG
Creativo:   ShadeG DryadG
ShadeG
Creativo:   AuraG SalaG GnomeG
ShadeG AuraG
Creativo:   WispG ShadeG DryadG AuraG
DryadG
Creativo:   SalaG GnomeG WispG ShadeG DryadG
ShadeG SalaG
Creativo:   AuraG SalaG GnomeG WispG ShadeG DryadG
AuraG GnomeG WispG
Creativo:   AuraG SalaG GnomeG WispG ShadeG DryadG AuraG
AuraG
ShadeG GnomeG
AuraG GnomeG ShadeG
WispG ShadeG DryadG SalaG
SalaG
DryadG WispG
AuraG GnomeG DryadG
WispG ShadeG DryadG GnomeG
SalaG GnomeG WispG ShadeG AuraG
GnomeG
DryadG ShadeG
AuraG GnomeG AuraG
WispG ShadeG AuraG WispG
SalaG GnomeG WispG ShadeG SalaG
AuraG SalaG GnomeG WispG ShadeG AuraG
WispG
El programa no muestra números sino ítems, pero es lo mismo. Por algún motivo esto no se está aplicando:
      if (Print == eval("LastL"+ClasicActualL)) {
         // Si el experimento mostrado es igual al grabado como último...
         // ...no se hacen más experimentos con ese largo.
         Info = "F6: Exps de largo "+ClasicMinL+" completados.\n"+Info;
         ClasicMinL = ClasicMinL+1;
      }
Por eso repitió "WispG". Sinceramente, no sé cuántos errores puede haber, y el método no es perfecto (por ejemplo en
"Creativo:   AuraG SalaG GnomeG WispG ShadeG DryadG
AuraG GnomeG WispG
Creativo:   AuraG SalaG GnomeG WispG ShadeG DryadG AuraG"
El submétodo creativo produce 2 resultados casi iguales...
...aunque creo que eso se arreglará cuando le ponga un contador de resets y los contiguos se elijan basados en él. Sería por ejemplo:
"Creativo:   AuraG SalaG GnomeG WispG ShadeG DryadG
AuraG GnomeG WispG
Creativo:   AuraG GnomeG ShadeG AuraG GnomeG ShadeG AuraG"

Eeen fin, lo importante es que se diría todo experimento, en un orden interesante, variado. De hecho, la pregunta de si el submétodo creativo fue efectivo hace que la lista pueda variar. Si la respuesta es sí, el submétodo se ejecutará en su lugar correspondiente, sino se salteará 1 vez, y en la próxima si se responde de nuevo que no entonces serán 2 veces y así sucesivamente. El método dice experimentos de más largo más seguidos si eso fue efectivo, y sino los dice menos seguidos.

En realidad esto no responde el tema, y los métodos pueden mejorar, seguiré con ello, pero bueno, la base está...