Mam dla ciebie trudny!
Moja dziewczyna niedawno spotkała się z nowym programem na MTV (USA). To okropny program i wszyscy na nim są tandetni, ale „gra” jest dość interesująca. Z Wikipedii:
Czy jesteś tym jedynym? śledzi 20 osób mieszkających razem na Hawajach, aby znaleźć idealne dopasowanie. Jeśli 10 mężczyzn i 10 kobiet będzie w stanie poprawnie wybrać wszystkie dziesięć idealnych dopasowań w ciągu dziesięciu tygodni, zyskają 1 milion dolarów na podzielenie się między nimi.
Teraz część gry (również z Wikipedii):
W każdym odcinku obsada połączy się z tym, kto uważa, że ich idealnym dopasowaniem jest rywalizacja w wyzwaniu. Zwycięzcy wyzwania wybiorą się na randkę i będą mieli okazję sprawdzić swój mecz na stoisku prawdy. Członkowie obsady wybiorą jedną ze zwycięskich par, aby udać się do stoiska z prawdą, aby ustalić, czy pasują idealnie, czy nie. To jedyny sposób na potwierdzenie dopasowania.Każdy odcinek kończy się ceremonią dopasowania, podczas której pary zostaną poinformowane, ile mają idealnych meczów, ale nie które mecze są prawidłowe.
TL; DR: Jest to pochodna Mastermind (konkretnie M (10,10)). Zasady gry są następujące:
Zaczynasz od 2 zestawów po 10, nazwijmy je Zestaw A: {A, B, C, D, E, F, G, H, I, J} i Zestaw 2: {1,2,3,4,5, 6,7,8,9,10}
Komputer tworzy rozwiązanie (niewidoczne dla Ciebie) w postaci {A1, B2, C3, D4, E5, F6, G7, H8, I9, J10}, w którym elementy w zestawie A są mapowane 1 na 1 ustawić 2. Kolejnym przykładem rozwiązania może być {A2, B5, C10, D8, E1, F7, G6, H4, I9, J3}.
Przed pierwszą turą możesz zapytać, czy wybrana konkretna para jest poprawna. Twoje pytanie będzie miało postać {A1} (np. {C8}), a otrzymasz 1 (co oznacza poprawność) lub 0 (co oznacza, że twoje przypuszczenie jest nieprawidłowe).
Twoja pierwsza prawdziwa tura. Pierwszy zgadujesz w postaci {A1, B2, C3, D4, E5, F6, G7, H8, I9, J10} lub dowolnej kombinacji. Twoja domysł nie może zawierać wielokrotności dowolnego elementu, tj. Domysł {A1, A2, A3, A4, A5, B6, B7, B8, B9, B10} NIE jest prawidłowym domysłem. Po każdej turze komputer podaje liczbę poprawnych dopasowań, ale NIE, które dopasowania są poprawne.
Powtarzaj kroki 3 i 4, aż uzyskasz poprawność każdego meczu (tj. Odpowiedź 10) lub dopóki twoje 10 ruchów nie wzrośnie (w zależności od tego, co nastąpi wcześniej). Jeśli rozwiążesz go przed lub w 10. turze, wygrywasz milion dolarów. W przeciwnym razie tracisz, a niektórzy ludzie (lub litery i cyfry) idą do domu samotnie, aby spędzić wieczność ze swoimi 10 kotami.
To NIE jest najkrótszy konkurs kodu. Osoba, która może rozwiązać losowo dopasowanie w najmniejszej średniej liczby prób będzie zwycięzcą. Prawdopodobnie uwzględni się także sprytna gra i szybkość obliczeń. Zakładam, że średnia liczba tur prawie na pewno będzie większa niż 10, więc szanse wygrania nagrody w wysokości 1 miliona dolarów (prawdopodobnie wypłaconej przez MTV, a nie mnie) są niewielkie. Tylko jak niemożliwe jest dla obsady, aby wygrać główną nagrodę?
Uwaga: Umieszczenie go w formacie {A1, B2, ...} nie jest koniecznie wymagane. Po prostu użyłem tej formy w pytaniu, aby całkowicie wyjaśnić, na czym polega łamigłówka. Jeśli nie umieścisz go w tym formularzu, wyjaśnij, jak to nazwać.
Powodzenia!
źródło
Odpowiedzi:
Python 2 (uruchom szybciej, jeśli uruchamiasz za pomocą Pypy)
Uważa się, że prawie zawsze odgadnie się prawidłowe parowanie w 10 rundach lub niżej
Mój algorytm wzięty jest z mojej odpowiedzi dla mistrza jako hobby (patrz Ideone ). Chodzi o to, aby znaleźć przypuszczenie, które zminimalizuje liczbę możliwości pozostawionych w najgorszym przypadku. Mój algorytm poniżej brutalnie go zmusza, ale aby zaoszczędzić czas, po prostu losowo zgaduję, czy liczba pozostałych możliwości jest większa niż
RANDOM_THRESHOLD
. Możesz pobawić się tym parametrem, aby przyspieszyć lub zobaczyć lepszą wydajność.Algorytm działa dość wolno, średnio 10 sekund na jeden cykl, jeśli jest uruchamiany przy użyciu Pypy (jeśli używa się normalnego interpretera CPython, to około 30 sekund), więc nie mogę go przetestować na całej permutacji. Ale wydajność jest całkiem dobra, po około 30 testach nie widziałem żadnego przypadku, w którym nie można znaleźć prawidłowej pary w 10 rundach lub niżej.
W każdym razie, jeśli używa się tego w prawdziwym życiu, ma dużo czasu przed następną rundą (tydzień?), Więc ten algorytm można wykorzystać w prawdziwym życiu = D
Myślę więc, że można bezpiecznie założyć, że średnio znajdzie to prawidłowe pary w 10 domysłach lub mniej.
Spróbuj sam. Mogę poprawić prędkość w ciągu najbliższych kilku dni (EDYCJA: wydaje się, że dalsza poprawa wydaje się trudna, więc po prostu zostawiam kod bez
size=7
zmian . Próbowałem tylko wybierać losowo, ale nawet przy nie udaje się to w 3 z 5040 przypadków , więc postanowiłem zachować lepszą metodę). Możesz uruchomić go jako:Lub, jeśli chcesz tylko zobaczyć, jak to działa, wprowadź mniejszą liczbę (aby działała szybciej)
Aby uruchomić pełny test (ostrzeżenie: zajmie to dużo czasu dla
size
> 7), wpisz liczbę ujemną.Pełny test
size=7
(ukończony w 2m 32s):Jeśli
RANDOM_THRESHOLD
iCLEVER_THRESHOLD
to zarówno zestaw do bardzo dużej wartości (np 50000), to będzie zmusić algorytm, aby znaleźć optymalne przypuszczenie, że minimalizuje liczbę możliwości w najgorszym wypadku. To jest bardzo wolne, ale bardzo potężne. Na przykład uruchomienie go nasize=6
upewnia się, że może znaleźć prawidłowe pary w maksymalnie 5 rundach.Chociaż średnia jest wyższa w porównaniu do zastosowania przybliżenia (czyli średnio 4,11 rund), ale zawsze się udaje, tym bardziej, że jedna runda jest wolna. To dodatkowo wzmacnia naszą hipotezę, że kiedy
size=10
prawie zawsze powinno znaleźć prawidłowe pary w 10 rundach lub mniej.Wynik (ukończony w 3m 9s):
Kod.
źródło
len(remove_perms ...)
część). I tak, miałem na myśli <= 10 rund =). Btw w powyższym kodzie nigdy nie jest podejmowane tak naprawdę optymalne zgadywanie, ponieważ dodałemCLEVER_THRESHOLD=0
, co oznacza, że spróbuje tylko zgadywać z listy możliwości, chociaż optymalne zgadywanie może być poza tym zestawem. Ale postanowiłem to wyłączyć, aby zaoszczędzić czas. Dodałem pełny testsize=7
, pokazując, że zawsze się to udaje.size=8
i okazało się, że najnowsza wersja ma tylko 40308 sukcesów (zamiast 40320), jeśli zostanie użyte to ustawienie. Ale to wciąż wskaźnik skuteczności na poziomie 99,97%! Chyba możemy doprowadzić do bankructwa organizatora programu telewizyjnego.CJam -19 turn- Strategia An Idiot
To nie jest poważna odpowiedź, ale demonstracja. Jest to rozwiązanie idioty, w którym nie bierze pod uwagę liczby poprawnych informacji o parowaniu dostarczonych z drugiej części tury. W przypadku całkowicie losowych par zajmuje to średnio 27 tygodni. Ta odpowiedź jest niewystarczająca, jak powiedziałem, ale wskazuje, że szanse dla inteligentnej grupy (znacznie bardziej inteligentnej niż ten program) prawdopodobnie nie są tak małe, jak można się spodziewać. Bardziej inteligentne algorytmy, które napisałem, wymagają jednak dużo więcej czasu na uruchomienie, dzięki czemu mogę właściwie uzyskać od nich odpowiedzi.
Aktualizacja: Poniższy kod został zaktualizowany, aby używać stanu, który powinien usunąć te, które nie działają, jeśli jedynymi poprawnymi są te, o których wiemy, że są poprawne. Został również edytowany, aby pokazać mój losowy generator „poprawnej odpowiedzi”. Średni wynik to teraz tylko 19. To wciąż głupie rozwiązanie, ale jest nieznacznie lepsze od poprzedniego.
źródło
Szybka wielowątkowa wersja C ++
Wiem, że minęło trochę czasu, odkąd ten wątek był aktywny, ale mam fajny dodatek do podzielenia się: Oto implementacja algorytmu C ++ algorytmu minimax dla Are You The One? , który wykorzystuje wielowątkowość, aby przyspieszyć ocenę każdego możliwego domysły.
Ta wersja jest znacznie szybsza niż wersja Python (ponad 100 razy szybsza, gdy oryginalna wersja Python jest ustawiona na maksimum
RANDOM_THRESHOLD
iCLEVER_THRESHOLD
). Nie używa żadnego losowego zgadywania, ale raczej ocenia wszystkie permutacje i podaje jako przypuszczenie permutację, która eliminuje największą liczbę możliwych rozwiązań (biorąc pod uwagę odpowiedź najgorszego przypadku).W przypadku mniejszych gier wywołanie „ayto -n” spowoduje uruchomienie gry na wszystkich n! możliwe ukryte dopasowania, a na końcu znajdziesz krótkie podsumowanie wyników.
Ponieważ wciąż trudno jest ocenić wszystkie 10! możliwe ukryte dopasowania, jeśli na przykład nazwiesz „ayto 10”, symulator ustala pierwsze trzy domysły, a następnie uruchamia minimax, aby wybrać przypuszczenie i zakłada, że otrzymał ocenę najgorszego przypadku. Prowadzi nas to „ścieżką najgorszego przypadku” do ukrytego wektora, który prawdopodobnie należy do klasy wektorów, w których algorytm określa maksymalną liczbę odgadnięć. Ta hipoteza nie została przetestowana.
Aż do n = 9 , nie było symulacji, której rozwiązanie wymagałoby więcej niż n zakrętów.
Aby to przetestować sam, przykładowa kompilacja wyglądałaby następująco:
Oto mały przykład z danymi wyjściowymi:
Kod
źródło