Ich habe es schwer für dich!
Meine Freundin ist kürzlich auf MTV (USA) auf eine neue Show gestoßen. Es ist eine schreckliche Show und jeder auf ihr ist trashig, aber das "Spiel" ist ziemlich interessant. Aus Wikipedia:
Bist du der eine? folgt 20 Leuten, die zusammen in Hawaii leben, um ihre perfekte Übereinstimmung zu finden. Wenn die 10 Männer und 10 Frauen in der Lage sind, alle zehn perfekten Übereinstimmungen in zehn Wochen richtig auszuwählen, erhalten sie eine Million US-Dollar, um sie unter ihnen aufzuteilen.
Nun zum Spielteil (auch aus Wikipedia):
Jede Episode, mit der die Besetzung zusammenarbeitet, ist der perfekte Partner, um sich einer Herausforderung zu stellen. Die Gewinner der Challenge treffen sich zu einem Date und haben die Möglichkeit, ihr Match in der Wahrheitslounge zu testen. Die Darsteller wählen eines der siegreichen Paare aus, um am Wahrheitsstand zu ermitteln, ob es sich um ein perfektes Paar handelt oder nicht. Dies ist die einzige Möglichkeit, Übereinstimmungen zu bestätigen. Jede Episode endet mit einer Matching-Zeremonie, bei der den Paaren mitgeteilt wird, wie viele perfekte Übereinstimmungen sie haben, aber nicht, welche Übereinstimmungen korrekt sind.
TL; DR: Dies ist ein Mastermind-Derivat (M (10,10) um genau zu sein). Die Spielregeln lauten wie folgt:
Sie beginnen mit 2 Zehnersätzen. Nennen wir sie Satz A: {A, B, C, D, E, F, G, H, I, J} und Satz 2: {1,2,3,4,5, 6,7,8,9,10}
Der Computer erstellt eine (für Sie nicht sichtbare) Lösung in Form von {A1, B2, C3, D4, E5, F6, G7, H8, I9, J10}, wobei die Mitglieder in Gruppe A 1-zu-1 zugeordnet werden Ein weiteres Beispiel für eine Lösung könnte {A2, B5, C10, D8, E1, F7, G6, H4, I9, J3} sein.
Vor deiner ersten Runde wirst du gefragt, ob ein einzelnes, bestimmtes Paar deiner Wahl richtig ist. Ihre Frage hat die Form {A1} (z. B. {C8}) und Sie erhalten entweder eine 1 (richtig) oder eine 0 (falsch).
Deine erste richtige Runde. Sie machen Ihre erste Vermutung in Form von {A1, B2, C3, D4, E5, F6, G7, H8, I9, J10} oder einer beliebigen Permutation Ihrer Wahl. Ihre Vermutung darf kein Vielfaches eines Elements enthalten, dh eine Vermutung von {A1, A2, A3, A4, A5, B6, B7, B8, B9, B10} ist KEINE gültige Vermutung. Nach jeder Runde teilt der Computer Ihnen die Anzahl der korrekten Übereinstimmungen mit, NICHT jedoch, welche Übereinstimmungen korrekt sind.
Wiederholen Sie die Schritte 3 und 4, bis alle Übereinstimmungen korrekt sind (dh eine Antwort von 10) oder bis Ihre 10 Züge verstrichen sind (je nachdem, welcher Zeitpunkt früher liegt). Wenn Sie es vor oder in Ihrem 10. Zug lösen, gewinnen Sie 1 Million Dollar. Andernfalls verlieren Sie und einige Leute (oder Buchstaben und Zahlen) gehen alleine nach Hause, um die Ewigkeit mit ihren 10 Katzen zu verbringen.
Dies ist KEIN kürzester Code-Wettbewerb. Die Person, die eine zufällige Übereinstimmung mit der geringsten durchschnittlichen Anzahl von Vermutungen lösen kann, wird der Gewinner sein. Cleveres Spiel und Rechengeschwindigkeit werden wahrscheinlich ebenfalls eine Rolle spielen. Ich gehe davon aus, dass die durchschnittliche Anzahl der Runden mit ziemlicher Sicherheit größer als 10 sein wird, sodass die Gewinnchancen für Sie (vermutlich von MTV, nicht von mir) gering sind. Genau wie unmöglich ist es für die Besetzung des großen Preis zu gewinnen?
Hinweis: Das Einfügen in das Format {A1, B2, ...} ist nicht unbedingt erforderlich. Ich habe diese Form in der Frage einfach verwendet, um zu verdeutlichen, was das Rätsel ist. Wenn Sie es nicht in dieses Formular einfügen, erklären Sie einfach, wie Sie es aufrufen.
Viel Glück!
quelle
Antworten:
Python 2 (schneller laufen, wenn Pypy verwendet wird)
Es wird davon ausgegangen, dass fast immer die richtige Paarung in 10 Runden oder weniger erraten wird
Mein Algorithmus wird von meiner Antwort für Mastermind als mein Hobby genommen (siehe in Ideone ). Die Idee ist, die Vermutung zu finden, die die Anzahl der im schlimmsten Fall verbleibenden Möglichkeiten minimiert. Mein unten stehender Algorithmus erzwingt es einfach, aber um Zeit zu sparen, wählt er einfach eine Zufallsrate, wenn die Anzahl der verbleibenden Möglichkeiten größer als ist
RANDOM_THRESHOLD
. Mit diesem Parameter können Sie herumspielen, um Dinge zu beschleunigen oder eine bessere Leistung zu erzielen.Der Algorithmus ist ziemlich langsam, im Durchschnitt 10s für einen Lauf, wenn er mit Pypy ausgeführt wird (wenn ein normaler CPython-Interpreter verwendet wird, sind es ungefähr 30s), daher kann ich ihn nicht auf allen Permutationen testen. Aber die Leistung ist ziemlich gut, nach ungefähr 30 Tests habe ich noch keinen Fall gesehen, bei dem es in 10 Runden oder weniger nicht gelingt, die richtige Paarung zu finden.
Wie auch immer, wenn dies in der realen Show verwendet wird, hat es genügend Zeit vor der nächsten Runde (eine Woche?), So dass dieser Algorithmus im realen Leben verwendet werden kann = D
Ich bin also der Meinung, dass man davon ausgehen kann, dass dies im Durchschnitt die richtigen Paarungen in 10 oder weniger Vermutungen ergibt.
Versuch es selber. Ich könnte die Geschwindigkeit in den nächsten Tagen verbessern (BEARBEITEN: Es scheint schwierig zu sein, sich weiter zu verbessern, also lasse ich den Code einfach so, wie er ist. Ich habe versucht, nur zufällige Auswahl zu machen, aber selbst bei
size=7
scheitert er in 3 der 5040 Fälle Also habe ich beschlossen, die clevere Methode beizubehalten. Sie können es ausführen als:Oder, wenn Sie nur sehen möchten, wie es funktioniert, geben Sie eine kleinere Zahl ein (damit es schneller läuft)
Geben Sie
size
eine negative Zahl ein, um einen vollständigen Test durchzuführen (Warnung: > 7 dauert sehr lange ).Voller Test für
size=7
(abgeschlossen in 2m 32s):Wenn
RANDOM_THRESHOLD
undCLEVER_THRESHOLD
auf einen sehr hohen Wert gesetzt sind (wie 50000), wird der Algorithmus gezwungen, die optimale Schätzung zu finden, die die Anzahl der Möglichkeiten im schlimmsten Fall minimiert. Das ist sehr langsam, aber sehr mächtig. Wenn Sie es beispielsweise mit ausführen, wird davonsize=6
ausgegangen, dass es in maximal 5 Runden die richtigen Paarungen finden kann.Der Durchschnitt ist zwar höher als bei Verwendung der Näherung (die im Durchschnitt 4,11 Runden beträgt), aber es gelingt immer, noch mehr, wenn noch eine Runde übrig ist. Dies stärkt unsere Hypothese, dass
size=10
fast immer in 10 Runden oder weniger die richtigen Paarungen gefunden werden sollten.Das Ergebnis (abgeschlossen in 3m 9s):
Der Code.
quelle
len(remove_perms ...)
Teil) zu minimieren . Und ja, ich meinte in <= 10 Runden =). Übrigens wird in dem obigen Code die wirklich optimale Vermutung niemals gemacht, da ich es so formuliereCLEVER_THRESHOLD=0
, was bedeutet, dass es nur versuchen wird, aus der Liste der Möglichkeiten zu erraten, obwohl die optimale Vermutung möglicherweise außerhalb dieser Menge liegt. Aber ich habe beschlossen, dies zu deaktivieren, um Zeit zu sparen. Ich habe einen vollständigen Test für hinzugefügtsize=7
, der zeigt, dass es immer erfolgreich ist.size=8
und festgestellt, dass die neueste Version nur 40308 Erfolge aufweist (anstelle von 40320), wenn diese Einstellung verwendet wird. Aber das sind immer noch 99,97% Erfolgsquote! Ich schätze, wir können dafür sorgen, dass der Veranstalter der Fernsehserie bankrott geht.CJam -19-Turns-Strategie eines Idioten
Dies ist keine ernsthafte Antwort, sondern eine Demonstration. Dies ist die Lösung eines Idioten, bei der er die Anzahl der korrekten Paarungsinformationen aus dem zweiten Teil der Runde nicht berücksichtigt. Bei völlig zufälligen Paarungen dauert dies durchschnittlich 27 Wochen. Diese Antwort ist, wie ich bereits sagte, unzureichend, weist jedoch darauf hin, dass die Chancen für eine intellegente Gruppe (viel intellegenter als dieses Programm) wahrscheinlich nicht so gering sind, wie Sie es vielleicht erwarten. Die intelligenteren Algorithmen, die ich geschrieben habe, benötigen jedoch viel mehr Zeit zum Ausführen, damit ich tatsächlich Antworten von ihnen erhalten kann.
Update: Der folgende Code wurde aktualisiert, um den Status zu verwenden, dass diejenigen entfernt werden sollten, die nicht funktionieren, wenn nur diejenigen korrekt sind, von denen wir bereits wussten, dass sie korrekt sind. Es wurde auch überarbeitet, um meinen Zufallsgenerator "Richtige Antwort" anzuzeigen. Das durchschnittliche Ergebnis ist jetzt nur 19. Es ist immer noch eine dumme Lösung, aber es ist besser als die vorherige geringfügig.
quelle
Schnelle Multithread-C ++ - Version
Ich weiß, es ist schon eine Weile her, dass dieser Thread aktiv war, aber ich habe eine coole Ergänzung zu teilen: Hier ist eine C ++ - Implementierung des Minimax-Algorithmus für Are You The One? , die Multithreading verwendet, um die Auswertung jeder möglichen Vermutung zu beschleunigen.
Diese Version ist viel schneller als die Python-Version (über 100x schneller, wenn die ursprüngliche Python-Version auf Maximum
RANDOM_THRESHOLD
und festgelegt istCLEVER_THRESHOLD
). Es wird kein zufälliges Erraten verwendet, sondern alle Permutationen ausgewertet und als Erraten die Permutation übergeben, die die größtmögliche Anzahl möglicher Lösungen eliminiert (bei der Antwort im ungünstigsten Fall).Bei kleineren Spielen wird das Spiel mit "ayto -n" auf allen n ausgeführt! mögliche versteckte Übereinstimmungen und geben Ihnen am Ende eine kurze Zusammenfassung der Ergebnisse.
Da ist es doch unlösbar alle 10 auszuwerten! Mögliche versteckte Übereinstimmungen: Wenn Sie zum Beispiel "ayto 10" aufrufen, führt der Simulator die ersten drei festen Vermutungen aus, führt dann minimax aus, um die Vermutung auszuwählen, und geht davon aus, dass er die schlechteste Bewertung erhalten hat. Dies führt uns auf einem "Worst-Case-Pfad" zu einem verborgenen Vektor, der sich vermutlich in der Klasse der Vektoren befindet, für die der Algorithmus eine maximale Anzahl von Raten zur Identifizierung benötigt. Diese Vermutung wurde nicht getestet.
Bis zu n = 9 gab es keine Simulation, für deren Lösung mehr als n Umdrehungen benötigt wurden.
Um dies selbst zu testen, wäre eine Beispielzusammenstellung wie folgt:
Hier ist ein kleines Beispiel mit Ausgabe:
Code
quelle