Aún no vi que el siguiente código halle alguna solución, por lo que quizá no funciona.
Vale decir, no obstante, que cuando hice las pruebas, en el frame 4 donde por ejemplo dice +"00" antes era +00 y por lo que acabo de ver, en el modo Explorador de películas se mostraba como +0, por lo que quizá el intérprete, compilador o lo que sea, lo interpretaba así también. Extraño. Pero le puse las comillas por las dudas.
Ayer dejé la compu prendida pero se apagó, y no sé cuánto tarda el código pero es mucho. Creo que debe probar 6^20 métodos variando a su vez los números secretos, o sea (6^20)*6 aunque descartando un método cuando no haya un número, lo cual ocurre en la mayoría de esos nuevos casos.
Definitivamente sería bueno agilizar ese código. ¿Ideas?
En cuanto a cómo funciona, escribí esto:
Código [Seleccionar]
Escena 1
actions for fotograma 1
MejorMetodo = "¿?";
MMIntentosRequeridos = 100;
MaxIntentosporSecreto = 3;
// Nodos.
// El nombre describe la situación.
// El contenido es sustituido por V(X).
N = 1;
N00 = 1;
N01 = 1;
N02 = 1;
N10 = 1;
N0000 = 1;
N0001 = 1;
N0002 = 1;
N0010 = 1;
N0100 = 1;
N0101 = 1;
N0102 = 1;
N0110 = 1;
N0200 = 1;
N0201 = 1;
N0202 = 1;
N0210 = 1;
N1000 = 1;
N1001 = 1;
N1002 = 1;
N1010 = 1;
// Valores. También usados por NúmeroSecreto.
V1 = 12;
V2 = 13;
V3 = 21;
V4 = 23;
V5 = 31;
V6 = 32;
// Referencias. Usado para variar fácilmente el contenido de los nodos.
R0 = "N";
R1 = "N00";
R2 = "N01";
R3 = "N02";
R4 = "N10";
R5 = "N0000";
R6 = "N0001";
R7 = "N0002";
R8 = "N0010";
R9 = "N0100";
R10 = "N0101";
R11 = "N0102";
R12 = "N0110";
R13 = "N0200";
R14 = "N0201";
R15 = "N0202";
R16 = "N0210";
R17 = "N1000";
R18 = "N1001";
R19 = "N1002";
R20 = "N1010";
actions for fotograma 2
NumeroSecreto = 1;
Intentos = 0;
MetodoProbandose = N+""+N00+N01+N02+N10+N0000+N0001+N0002+N0010+N0100+N0101+N0102+N0110+N0200+N0201+N0202+N0210+N1000+N1001+N1002+N1010;
actions for fotograma 3
Chequear = "N";
ChequearTraducido = eval("V"+eval(Chequear));
IntentosEnesteSecreto = 0;
NumeroSecretoTraducido = eval("V"+NumeroSecreto);
actions for fotograma 4
IntentosEnesteSecreto = IntentosEnesteSecreto+1;
if (NumeroSecretoTraducido == ChequearTraducido) {
// Secreto adivinado.
Intentos = Intentos+IntentosEnesteSecreto;
if (NumeroSecreto<6) {
// Probar el método con otro secreto.
NumeroSecreto = NumeroSecreto+1;
gotoAndPlay (3);
} else {
// El método adivinó todo secreto dentro del plazo.
if (Intentos<MMIntentosRequeridos) {
// El método es el mejor por ahora, guardarlo.
MMIntentosRequeridos = Intentos;
MejorMetodo = MetodoProbandose;
trace ("El mejor método por ahora es "+MejorMetodo);
}
// Modificar método.
gotoAndPlay (6);
}
} else if (NumeroSecretoTraducido.charAt(0) == ChequearTraducido.charAt(0)) {
Chequear = Chequear+"10";
} else if (NumeroSecretoTraducido.charAt(0) == ChequearTraducido.charAt(1)) {
if (NumeroSecretoTraducido.charAt(1) == ChequearTraducido.charAt(0)) {
Chequear = Chequear+"02";
} else {
Chequear = Chequear+"01";
}
} else if (NumeroSecretoTraducido.charAt(1) == ChequearTraducido.charAt(0)) {
Chequear = Chequear+"01";
} else {
Chequear = Chequear+"00";
}
actions for fotograma 5
if (IntentosEnesteSecreto<MaxIntentosporSecreto) {
// Probar siguientes nodos.
ChequearTraducido = eval("V"+eval(Chequear));
gotoAndPlay (4);
}
// sino modificar método.
actions for fotograma 6
// Modificar método.
Puntero = 0;
actions for fotograma 7
if (eval(eval("R"+Puntero))<6) {
set (eval("R"+Puntero), eval(eval("R"+Puntero))+1);
gotoAndPlay (2);
} else {
if (Puntero<20) {
set (eval("R"+Puntero), 1);
Puntero = Puntero+1;
} else {
// Ya se probaron todos los métodos. Mostrar el mejor.
trace (MejorMetodo);
stop ();
}
}
// Problema en casos más difíciles: Está abierto a dar números con subnúmeros repetidos. No debería.
actions for fotograma 8
gotoAndPlay (7);
Vale decir, no obstante, que cuando hice las pruebas, en el frame 4 donde por ejemplo dice +"00" antes era +00 y por lo que acabo de ver, en el modo Explorador de películas se mostraba como +0, por lo que quizá el intérprete, compilador o lo que sea, lo interpretaba así también. Extraño. Pero le puse las comillas por las dudas.
Ayer dejé la compu prendida pero se apagó, y no sé cuánto tarda el código pero es mucho. Creo que debe probar 6^20 métodos variando a su vez los números secretos, o sea (6^20)*6 aunque descartando un método cuando no haya un número, lo cual ocurre en la mayoría de esos nuevos casos.
Definitivamente sería bueno agilizar ese código. ¿Ideas?
En cuanto a cómo funciona, escribí esto:
CitarEl árbol es más o menos así:Código [Seleccionar]
/-N00 -> N0000, N0001, etc
/-N01
N
\-N02
\-N10
No está completo porque me aburre mucho completarlo, pero eso que ven son los nombres de las variables que marcan qué número se usará al inicio (N), al recibir la pista 0-0 (N00), al recibir la pista 00 y luego de nuevo 00 (N0000), etc.
Por ejemplo N puede ser 12. Inicialmente digamos que todas son 11 (recuerden que el juego sólo admite poner subnúmeros distintos, pero por ahora para no complicarme lo dejo así)..
¿Por qué esos nombres?
Porque así me resulta fácil referirme a la variable que necesito. Si me estoy refiriendo a la variable N y obtengo la pista 00, agrego 00 a lo que ya tenía (en este caso N) y sé que la siguiente variable a usar será N00.
El programa tomará uno de los números secretos posibles y usará el árbol para intentar adivinarlo.
Si lo adivina en 3 tiradas o menos, cambia el número secreto.
Si adivina todos los números así, entonces ese método se guarda si es mejor que los anteriores guardados.
Sea que el método resultó malo o bueno, ahora hay que variarlo, probar otro. Esto es un problema, porque debido al nombre que puse a las variables, no puedo decir "varía la V1, si está al máximo entonces la V2, etc",. hablamos por ejemplo de 0000, luego 0001, luego 0002, luego 0010, no es fácil o rápido indicar cual variar luego de cual.
La solución que hallé, es crear R1, R2, etc, que son referencias a las variables de nombres raros. Así:
R0 = "N"
R1 = "N00"
R2 = "N01"
etc
Entonces si eval(eval(R1)) no está al máximo eso aumenta, sino aumenta evalevalR2, etc.
Pero otra cosa más es necesaria para simplificar. Como los posibles códigos secretos dan saltos de por ejemplo 13 a 21, los he puesto en una lista y las variables N00, etc, no contienen 12 por ejemplo, sino referencias a una posición de la lista, donde sí está el 12, etc.
La variación del número secreto también hace eso.
Esto es el árbol inicial, es decir, el contenido de las variables, no sus nombres.Código [Seleccionar]
/-1 -> 1, 1, etc
/-1
1
\-1
\-1
Esto es la lista de la que toman valores cuando se necesita ver qué números indican esos nodos:
V1 = 12
V2 = 13
etc (los nombré al inicio del tema).
Bueno, espero que se entienda, pero sino, si conocen otro método y me lo dicen de modo que yo lo pueda entender buenísimo.