Nom du problème du compte à rebours - et solutions algorithmiques?

10

Pour les non-Britanniques dans le public, il y a un segment d'un jeu télévisé de jour où les candidats ont un ensemble de 6 numéros et un numéro cible généré de manière aléatoire. Ils doivent atteindre le nombre cible en utilisant n'importe lequel (mais pas nécessairement tous) des 6 nombres en utilisant uniquement des opérateurs arithmétiques. Tous les calculs doivent aboutir à des nombres entiers positifs.

Un exemple: Youtube: Compte à rebours - Le jeu de nombres le plus extraordinaire de tous les temps?

Une description détaillée est donnée sur Wikipédia: Compte à rebours (Game Show)

Par exemple:

  • Le contentant sélectionne 6 numéros - deux grands (les possibilités incluent 25, 50, 75, 100) et quatre petits (numéros 1 .. 10, chacun inclus deux fois dans la piscine).
  • Les chiffres sont cueillies 75, 50, 2, 3, 8, 7sont données avec un nombre cible de 812.
  • Une tentative est (75 + 50 - 8) * 7 - (3 * 2) = 813 (Cela marque 7 points pour une solution à moins de 5 de la cible)
  • Une réponse exacte serait (50 + 8) * 7 * 2 = 812 (cela aurait marqué 10 points correspondant exactement à l'objectif).

Évidemment, ce problème existait avant l'avènement de la télévision, mais l'article Wikipedia ne lui donne pas de nom. J'ai également vu ce jeu dans une école primaire à laquelle j'ai assisté, où le jeu s'appelait "Crypto" en tant que compétition inter-classes - mais le chercher ne révèle plus rien.

J'y ai participé plusieurs fois et mon père a écrit une feuille de calcul Excel qui a tenté de forcer le problème par force brute, je ne me souviens pas comment cela a fonctionné (seulement que cela n'a pas fonctionné, avec la limite de ligne 65535 d'Excel), mais il doit sûrement y avoir une solution algorithmique au problème. Peut-être existe-t-il une solution qui fonctionne comme le fait la cognition humaine (par exemple en parallèle pour trouver des nombres «assez proches», puis prendre des candidats et effectuer des opérations «plus petites»).

Dai
la source
1
J'ai résolu ce problème graphiquement - utilisez des nœuds pour représenter les résultats des calculs et des arêtes pour représenter les opérations qui peuvent être effectuées sur ces nombres, puis utilisez un algorithme de recherche de graphique pour trouver le chemin souhaité
ell
1
À la lecture des règles, il semblerait qu'il soit possible de ne pas parvenir à une solution parfaite - par exemple si les nombres sélectionnés sont (1, 1, 2, 2, 3, 3) et que le nombre cible est 999. Donc vraiment l'objectif de tout algorithme serait de trouver la solution la plus proche possible.
Rich Smith
1
@ell: Votre solution de recherche de graphiques est-elle essentiellement une recherche par force brute?
Martin
J'ai juste utilisé une première recherche approfondie dans mon implémentation, mais je ne vois pas pourquoi quelque chose comme Dijkstra ne pourrait pas être utilisé.
ell
1
Nous avons des spectacles similaires dans les États: nous collons environ 6 idiots sous-alphabétisés dans une maison pendant plusieurs semaines et les film parlant les uns aux autres et à crier à l'autre. C'est à peu près aussi proche que notre télévision arrive à quelque chose d'aussi intellectuel dans les émissions populaires.
RBarryYoung

Réponses:

4

Avertissement: Cette réponse ne répond pas complètement à la question. Mais c'est trop long pour un commentaire.

NP-dur? Je crois que ce problème pourrait être difficile à NP .

Considérons un cas particulier du problème Knapsack :

Étant donné un ensemble d'entiers positifs et un entier positif b , existe-t-il un sous-ensemble de l'ensemble tel que la somme de tous les entiers de ce sous-ensemble soit égale à b ?

Cela semble quelque peu similaire à notre problème de compte à rebours, et il semble être beaucoup plus simple. Cependant, Knapsack (et ce cas particulier de Knapsack) est NP-dur (et NP-complet, bien sûr).

Je n'ai pas réussi à l'utiliser pour prouver que Countdown est NP-hard. Je ne pouvais pas me débarrasser de la division. Considérez que nous avons mille 2 et b = 7. Ce ne sera jamais résolu avec Knapsack, mais toujours (?) Avec Countdown, au moins de toutes les façons dont j'ai essayé de transférer le problème.

Maintenant, si le compte à rebours était vraiment NP-difficile, nous pourrions en déduire qu'il n'y a, avec une probabilité très élevée, aucun algorithme beaucoup plus efficace que la force brute essayant toutes les possibilités. (Et si nous devions trouver un tel algorithme, nous deviendrons très célèbres.)

Non, je ne pense pas qu'il doit y avoir un algorithme efficace.

Heuristique. La vidéo Youtube liée dans la question a un bel exemple: le candidat a trouvé une réponse exacte 952 = ((100 + 6) * 3 * 75 - 50) / 25. C'est complètement contre mon intuition, je ne l'aurais jamais essayé ça façon la première fois: produire un très grand nombre, puis le diviser et donner le résultat.

D'autre part , nous , les humains se sentent que nous ne devons essayer (exemple arbitraire) 50 * 75 * 100/2/3/7 pour atteindre un nombre à trois chiffres. Mais les ordinateurs ne ressentent rien, ils calculent simplement.

Après tout, si nous avons implémenté une heuristique et que cette heuristique ne trouve pas de solution exacte, nous devrons toujours essayer toutes les autres solutions pour nous assurer qu'il n'y en a vraiment pas.

Ce que le candidat dans la vidéo Youtube fait, je pense, est de vérifier très rapidement un grand nombre de possibilités et de rejeter rapidement celles qui ne donneront pas (ou probablement ne donneront pas) une solution.

Conclusion. Lors de la mise en œuvre d'un algorithme, on pourrait prendre soin de supprimer des calculs égaux tels que a / b / c = a / (b * c), mais je pense que c'est assez difficile à faire et je ne sais pas si cela améliore considérablement l'exécution.

Les ordinateurs sont bien sûr plus rapides que les humains pour vérifier un grand nombre de possibilités. Et de nos jours, même les smartphones sont si rapides qu'ils peuvent résoudre ce problème, je pense, en une seconde en essayant simplement toutes les possibilités. (Je n'ai pas testé cela.) Il n'y a que six chiffres, ce serait différent s'il y en avait par exemple 60.

Martin
la source
La solution à l'exemple, si impressionnante soit-elle, n'est pas aussi compliquée qu'elle peut le paraître à première vue. Son processus de pensée, sans les choses plus évidentes qu'il a peut-être essayées, est probablement "Je peux atteindre 954 en utilisant (100 + 6) * 9, ce que je peux faire via (100 + 6) * 3 * 75/25. Il me reste un 50 et 50/25 est deux, donc je peux enlever le 50 (100 + 6) * 3 * 75 avant de diviser par 25 ".
Tim Down
1

Un algorithme n'est pas vraiment très difficile.

Étant donné deux nombres a et b, nous pouvons produire les résultats a + b, abs (a - b) (je ne sais pas si les nombres négatifs sont autorisés, auquel cas nous pouvons produire a - b et a + b), a * b, et éventuellement a / b ou b / a si le résultat est un entier. Les résultats possibles sont donc un ensemble de cinq chiffres maximum. Appelons cet ensemble S (a, b).

Prenez six nombres a, b, c, d, e et f.

Pour chaque sous-ensemble de deux nombres, trouvez les nombres qu'ils peuvent produire.

Ensuite, pour chaque sous-ensemble de trois nombres, trouvez les nombres qu'ils peuvent produire: S (a, b, c) = S (S (a, b), c) union S (S (a, c), b) union S ( S (b, c), a).

Puis la même chose pour chaque sous-ensemble de 4 ou 5 numéros, puis pour les 6 numéros.

gnasher729
la source