J'en ai un dur pour toi!
Ma copine a récemment rencontré une nouvelle émission sur MTV (USA). C'est un spectacle terrible, et tout le monde est trash, mais le "jeu" est assez intéressant. De Wikipédia:
Es-tu l'élu? suit 20 personnes qui vivent ensemble à Hawaï pour trouver leur partenaire idéal. Si les 10 hommes et 10 femmes sont en mesure de choisir correctement les dix matches parfaits en dix semaines, ils gagneront 1 million de dollars à répartir entre eux.
Maintenant pour la partie du jeu (également de Wikipedia):
Chaque épisode, le casting s'associera à ceux qui, selon eux, sont le match parfait pour participer à un défi. Les gagnants du défi auront un rendez-vous et auront la chance de tester leur match dans la cabine de vérité. Les acteurs choisiront l'un des couples gagnants pour se rendre au stand de vérité afin de déterminer s'ils correspondent parfaitement ou non. C'est le seul moyen de confirmer les correspondances. Chaque épisode se termine par une cérémonie d'appariement où les couples seront informés du nombre de correspondances parfaites qu'ils ont, mais pas des correspondances correctes.
TL; DR: Il s'agit d'un dérivé de Mastermind (M (10,10) pour être spécifique). Les règles du jeu sont les suivantes:
Vous commencez avec 2 séries de 10, appelons-les Ensemble A: {A, B, C, D, E, F, G, H, I, J} et Ensemble 2: {1,2,3,4,5, 6,7,8,9,10}
L'ordinateur crée une solution (non visible pour vous) sous la forme de {A1, B2, C3, D4, E5, F6, G7, H8, I9, J10}, où les membres de l'ensemble A sont mappés 1 à 1 pour définir 2. Un autre exemple de solution pourrait être {A2, B5, C10, D8, E1, F7, G6, H4, I9, J3}.
Avant votre premier tour, vous pouvez demander si une seule paire particulière de votre choix est correcte. Votre question serait sous la forme de {A1} (par exemple {C8}), et vous recevez soit 1 (signifiant correct) soit 0 (signifiant que votre supposition est incorrecte).
Votre premier tour réel. Vous faites votre première supposition sous la forme de {A1, B2, C3, D4, E5, F6, G7, H8, I9, J10}, ou toute permutation de votre choix. Votre estimation ne peut contenir de multiples d'aucun élément, c'est-à-dire qu'une estimation de {A1, A2, A3, A4, A5, B6, B7, B8, B9, B10} n'est PAS une estimation valide. Après chaque tour, l'ordinateur vous indique le nombre de correspondances correctes, mais PAS les correspondances correctes.
Répétez les étapes 3 et 4 jusqu'à ce que chaque match soit correct (c.-à-d. Une réponse de 10), ou jusqu'à ce que vos 10 mouvements soient en hausse (selon la première éventualité). Si vous le résolvez avant ou à votre 10e tour, vous gagnez 1 million de dollars. Sinon, vous perdez, et certaines personnes (ou lettres et chiffres) rentrent seules chez elles pour passer l'éternité avec leurs 10 chats.
Ce n'est PAS un concours de code le plus court. La personne qui peut résoudre un appariement aléatoire dans le moins moyen nombre d'essais sera le gagnant. Un jeu intelligent et une vitesse de calcul seront également pris en compte. Je suppose que le nombre moyen de tours sera presque certainement supérieur à 10, donc les chances de gagner le prix de 1 million de dollars (vraisemblablement payé par MTV, pas moi) sont minces. À quel point est-il impossible pour le casting de remporter le grand prix?
Remarque: Le mettre au format {A1, B2, ...} n'est pas nécessairement requis. J'ai simplement utilisé ce formulaire dans la question pour clarifier ce qu'est le puzzle. Si vous ne le mettez pas dans ce formulaire, veuillez simplement expliquer comment l'appeler.
Bonne chance!
la source
Réponses:
Python 2 (exécutez plus rapidement si vous utilisez Pypy)
On croit presque toujours deviner le bon appariement en 10 tours ou moins
Mon algorithme est tiré de ma réponse pour le cerveau comme mon hobby (voir dans Ideone ). L'idée est de trouver la supposition qui minimise le nombre de possibilités restantes dans le pire des cas. Mon algorithme ci-dessous le force simplement brutalement, mais pour gagner du temps, il suffit de choisir au hasard si le nombre de possibilités restantes est supérieur à
RANDOM_THRESHOLD
. Vous pouvez jouer avec ce paramètre pour accélérer les choses ou pour voir de meilleures performances.L'algorithme est assez lent, en moyenne 10 secondes pour une exécution s'il est exécuté à l'aide de Pypy (si vous utilisez un interpréteur CPython normal, c'est environ 30 secondes), je ne peux donc pas le tester sur toutes les permutations. Mais les performances sont assez bonnes, après environ 30 tests, je n'ai vu aucun cas où il ne pouvait pas trouver le bon appariement en 10 tours ou moins.
Quoi qu'il en soit, si cela est utilisé dans une émission réelle, il a beaucoup de temps avant le prochain tour (une semaine?), Donc cet algorithme peut être utilisé dans la vraie vie = D
Je pense donc qu'il est prudent de supposer qu'en moyenne, cela trouvera les bons appariements en 10 suppositions ou moins.
Essayez-le vous-même. Je pourrais améliorer la vitesse dans les prochains jours (EDIT: il semble difficile de continuer à s'améliorer, je vais donc laisser le code tel
size=7
quel . J'ai essayé de faire un choix aléatoire, mais même à , il échoue dans 3 des 5040 cas , j'ai donc décidé de garder la méthode la plus intelligente). Vous pouvez l'exécuter comme:Ou, si vous voulez simplement voir comment cela fonctionne, entrez un nombre plus petit (pour qu'il s'exécute plus rapidement)
Pour exécuter un test complet (avertissement: cela prendra très longtemps pour
size
> 7), mettez un nombre négatif.Test complet pour
size=7
(terminé en 2m 32s):Si
RANDOM_THRESHOLD
etCLEVER_THRESHOLD
sont tous deux définis sur une valeur très élevée (comme 50000), cela forcera l'algorithme à trouver la supposition optimale qui minimise le nombre de possibilités dans le pire des cas. C'est très lent, mais très puissant. Par exemple, l'exécuter sursize=6
affirme qu'il peut trouver les bons appariements en 5 tours maximum.Bien que la moyenne soit plus élevée par rapport à l'utilisation de l'approximation (qui est de 4,11 tours en moyenne), elle réussit toujours, d'autant plus qu'il reste un tour à revendre. Cela renforce encore notre hypothèse selon laquelle
size=10
, il devrait presque toujours trouver les bons appariements en 10 tours ou moins.Le résultat (complété en 3m 9s):
Le code.
la source
len(remove_perms ...)
partie). Et oui, je voulais dire en <= 10 tours =). Btw dans le code ci-dessus, la supposition vraiment optimale n'est jamais faite, car je le disCLEVER_THRESHOLD=0
, ce qui signifie qu'il n'essaiera que de deviner à partir de la liste des possibilités, bien que la supposition optimale puisse être en dehors de cet ensemble. Mais j'ai décidé de désactiver cela pour gagner du temps. J'ai ajouté un test complet poursize=7
, montrant qu'il réussit toujours.size=8
et j'ai constaté que la dernière version n'a que 40308 succès (au lieu de 40320) si ce paramètre est utilisé. Mais c'est toujours un taux de réussite de 99,97%! Je suppose que nous pouvons faire en sorte que l'organisateur de l'émission de télévision fasse faillite.CJam -19 tourne- La stratégie d'un idiot
Ce n'est pas une réponse sérieuse mais une démonstration. C'est une solution idiote où il ne prend pas en compte le nombre d'informations de paires correctes fournies à partir de la deuxième partie du tour. Avec des appariements complètement aléatoires, cela prend en moyenne 27 semaines. Cette réponse est insuffisant comme je l'ai dit, mais indique que les chances pour un groupe intellegent (beaucoup plus intellegent que ce programme) n'est probablement pas aussi mince que vous pourriez vous y attendre. Les algorithmes les plus intelligents que j'ai écrits, cependant, prennent beaucoup plus de temps pour que je puisse réellement obtenir des réponses d'eux.
Mise à jour: Le code ci-dessous a été mis à jour pour indiquer qu'il doit supprimer ceux qui ne fonctionnent pas si les seuls corrects sont ceux que nous savions déjà corrects. Il a également été édité pour afficher mon générateur aléatoire de «réponses correctes». Le résultat moyen n'est maintenant que de 19. C'est toujours une solution stupide mais elle est meilleure que la précédente légèrement.
la source
Version C ++ multithread rapide
Je sais que cela fait un moment que ce fil n'est pas actif, mais j'ai un ajout intéressant à partager: voici une implémentation C ++ de l'algorithme minimax pour Are You The One?, qui utilise le multithreading pour accélérer l'évaluation de chaque supposition possible.
Cette version est beaucoup plus rapide que la version Python (plus de 100 fois plus rapide lorsque la version originale de Python est définie au maximum
RANDOM_THRESHOLD
etCLEVER_THRESHOLD
). Il n'utilise pas de supposition aléatoire, mais évalue plutôt toutes les permutations et soumet comme supposition la permutation qui élimine le plus grand nombre de solutions possibles (compte tenu de la réponse la plus défavorable).Pour les petits jeux, appeler "ayto -n" exécutera le jeu sur tous les n! correspondances cachées possibles et vous donnera un bref résumé des résultats à la fin.
Puisqu'il est toujours difficile d'évaluer les 10! correspondances cachées possibles, si vous appelez "ayto 10", par exemple, le simulateur fait ses trois premières suppositions fixes, puis exécute minimax pour choisir sa supposition et suppose qu'il a reçu l'évaluation du pire des cas. Cela nous amène sur le "pire des cas" vers un vecteur caché qui est vraisemblablement dans la classe des vecteurs qui prend l'algorithme un nombre maximum de suppositions à identifier. Cette conjecture n'a pas été testée.
Jusqu'à n = 9 , aucune simulation n'a pris plus de n tours à résoudre.
Pour tester cela vous-même, un exemple de compilation serait le suivant:
Voici un petit exemple avec sortie:
Code
la source