La respuesta parece estar relacionada con lo que llaman "árboles de decisión".
https://es.wikipedia.org/wiki/%C3%81rbol_de_decisi%C3%B3n#EjemploO algo similar.
Intento aplicarlo a una versión simplificada, en que el número sólo tiene 2 caracteres y pueden ser del 0 al 3.
El 1er número con el que se intenta acertar puede ser cualquiera (si el juego admitiese que contenga números repetidos entonces sí la eficiencia puede que varíe y por tanto este número importaría). Digamos 01.
A partir de ahí hay 4 posibles "ramas", según las 4 posibles pistas que se reciba:
/--> 0-0
/--> 0-1
01
\--> 0-2
\--> 1-0
También existe la posibilidad de 2-0 pero en tal caso se entiende que se llegó al resultado así que no es necesario ver qué se hace después, pues si este método es aplicado por una persona la respuesta es nada, ya ganó.
Ahora a partir de cada posible pista ponemos otro número. Por ejemplo:
/--> 0-0 --> 02
/--> 0-1 --> 02
01
\--> 0-2 --> 02
\--> 1-0 --> 02
Y el proceso se repite 1 vez más, porque según he visto en este caso simplificado hay un método que adivina el num en 3 "tiros".
Una vez hecho eso, se probaría dicho método para cada posible número y se contaría cuánto tardó en hallar los números, si es que los halló todos.
Luego, el método se variaría y se repetiría el paso anterior.
El programa terminaría cuando ya no sea posible variar el método, en cuyo caso diría cual fue el que halló los números en menos "tiros".
Esto daría el método que tiene el mejor promedio, es decir, si uds leen por ahí info de esto verán que se habla de métodos que no llegan a tardar X tiros, y otros que sí pero en promedio tardan menos. No sé realmente qué me sirve (en el modo difícil puede que el "mínimo máximo", porque si es posible saber que viene un caso de los que tardará podría cancelar el juego y de ese modo ganar más rápido (es un juego para ganar fichas), pero esto me parece poco probable (no creo que sea posible en general ganar tan rápido como para que convenga abandonar ciertas apuestas)), pero me parece que es eso, el mínimo promedio.
Bueno, el problema ahora es implementar eso.
El 1er número del método sería N1.
N1="01";
Nótese el problema de eso. No puedo poner 01. Tiene que ser "01". Pero si es texto es más difícil sustituir caracteres por otros (si fuese posible decir 01+1 y que quede 02, buenísimo, pero como es texto y no números hay que usar ifs y cosas...).
Otra opción sería poner 12 y que se interprete que el 0 representa al 1, el 1 al 2. etc. Y sí, voy a hacerlo así, porque es mucho más fácil aunque requiera una traducción humana (o más código al final).
Entonces N1=12
Luego vienen los otros números a los que no sé cómo llamarles porque debo referirme a ellos más adelante y no sé cual es la mejor forma. No se olvide que esto es una versión simplificada. Entiendo que no me esté explicando bien pero es que no sé, verán más adelante el problema.
Supongamos que les llamo así:
/--> 0-0 --> N2 -> (N3, N4, N5, N6)
/--> 0-1 --> N7 -> (N8, N9, N10, N11)
N1
\--> 0-2 --> N12 -> (N13, N14, N15, N16)
\--> 1-0 --> N17 -> (N18, N19, N20, N21)
Entiéndase que lo que está entre paréntesis son los números de las 4 posibles ramas que salen de esos puntos, no me pidan que dibuje las ramas...
Y supongamos que todas esas variables son 13.
Probamos cuánto tarda en adivinar el número 34 (X). Lo principal es algo así:
Si el 1er número de N1 es el 1er número de X
Si el 2ndo número de N1 es el 2ndo número de X
Acertó.
sino
Pista: 1-0
sino si el 1er número de N1 es el 2ndo número de X
Si el 2ndo número de N1 es el 1er número de X
Pista: 0-2
sino
Pista: 0-1
sino si el 2ndo número de N1 es el 1er número de X
Pista: 0-1
sino
Pista 0-0
Ahora dependiendo de qué pista sea chequearemos lo mismo pero cambiando N1 por el número que sea. Acá es donde viene lo difícil, hay que hacer referencia a ese número, yo no quiero hacer tantos ifs para eso. Además, como esto es una versión simplificada sólo hay que hacerlo 1 o 2 veces, pero en la versión normal serían digamos 7 tiros a decir y en la versión difícil unos 15. No tengo idea de cuántos, pero son bastantes.
Probablemente no se entienda lo que estoy diciendo pero bueno ¿alguna idea hasta ahí? ¿hay algo que me pueda simplificar la tarea? ¿quizá arrays? ¿nombrar las variables de otro modo?
----------------------------------------------------------------------------------------
Edit:
Olvidé unas cosas porque debía irme.
Hay basicamente 2 problemas.
1- Cuando se quiere ver cómo sigue el método, cual es la variable luego de la pista.
2- Cuando se quiere variar el método, qué variable se variará, y en caso de llegar al límite cual es la siguiente, etc.
Con los nombres que les puse, el 2 está solucionado. Porque, imaginen que en 7285, 7=V1, 2=V2, etc.
O sea, cada posición está marcada por una variable. El número se podría variar haciendo V5+1, cuando llegue a 9 pasa a 0 y se hace V4+1 y así sucesivamente. Bueno, el método es parecido, está hecho de unos números representados con variables, variamos desde la 21 hasta la 1.
Pero el 1 no sé cómo arreglarlo.
Otro modo de nombrar las variables sería algo así:
/--> N1 --> (N11, N12, N13, N14)
/--> N2 --> (N21, N22, N23, N24)
N
etc.
Entonces si obtengo la pista 1, para ver cual número probar luego busco la variable cuyo nombre es igual a la anterior pero agregando 1.
Esto resuelve el problema 2 pero el 1 se complica. Aún así me parece suficientemente viable... Lo probaré.