У меня есть жесткий для вас!
Недавно моя девушка познакомилась с новым шоу на MTV (США). Это ужасное зрелище, и все на нем грязные, но «игра» довольно интересная. Из Википедии:
Ты ли Тот самый? следует за 20 людьми, которые живут вместе на Гавайях, чтобы найти свою идеальную пару. Если 10 мужчин и 10 женщин смогут правильно выбрать все десять идеальных матчей за десять недель, они получат 1 миллион долларов, чтобы разделить их.
Теперь для игровой части (также из Википедии):
В каждом эпизоде актеры будут сочетаться с теми, кто, по их мнению, идеально подходит для участия в соревнованиях. Победители конкурса отправятся на свидание, и у них будет возможность проверить свой матч в стенде правды. Участники съемочной группы выберут одну из победивших пар, чтобы отправиться в киоск правды, чтобы определить, идеально они подходят или нет. Это единственный способ подтвердить совпадения. Каждый эпизод заканчивается церемонией сопоставления, где парам сообщают, сколько у них совершенных совпадений, но не какие совпадения являются правильными.
TL; DR: это производная Mastermind (M (10,10), чтобы быть конкретным). Правила игры следующие:
Вы начинаете с 2 наборов по 10, назовем их Набором A: {A, B, C, D, E, F, G, H, I, J} и Набором 2: {1,2,3,4,5, 6,7,8,9,10}
Компьютер создает решение (не видимое для вас) в форме {A1, B2, C3, D4, E5, F6, G7, H8, I9, J10}, где члены в наборе A отображаются 1-в-1 установить 2. Другим примером решения может быть {A2, B5, C10, D8, E1, F7, G6, H4, I9, J3}.
Перед первым ходом вы должны спросить, верна ли одна конкретная пара по вашему выбору. Ваш вопрос будет в форме {A1} (например, {C8}), и вы получите либо 1 (что означает правильное), либо 0 (что означает, что ваше предположение неверно).
Ваш первый настоящий ход. Вы делаете свое первое предположение в виде {A1, B2, C3, D4, E5, F6, G7, H8, I9, J10} или любой перестановки по вашему выбору. Ваше предположение не может содержать кратные значения какого-либо элемента, т. Е. Предположение {A1, A2, A3, A4, A5, B6, B7, B8, B9, B10} НЕ является действительным предположением. После каждого хода компьютер сообщает вам количество правильных совпадений, но НЕ, какие совпадения являются правильными.
Повторяйте шаги 3 и 4 до тех пор, пока вы не получите правильное соответствие (т. Е. Ответ 10) или пока ваши 10 ходов не увеличатся (в зависимости от того, что произойдет раньше). Если вы решите это до или в свой 10-й ход, вы выиграете 1 миллион долларов. В противном случае вы проигрываете, и некоторые люди (или буквы и цифры) уходят домой одни, чтобы провести вечность со своими 10 кошками.
Это НЕ конкурс на самый короткий код. Человек, который может решить случайное сопоставление в наименьшем среднем количестве догадок, будет победителем. Умная игра и скорость вычислений также, вероятно, будут влиять. Я предполагаю, что среднее число ходов почти наверняка будет больше 10, так что шансы на то, что вы выиграете приз в 1 миллион долларов (предположительно, выплачивается MTV, а не мной), невелики. Так же , как невозможно это для броска , чтобы выиграть главный приз?
Примечание. Помещение в формат {A1, B2, ...} не обязательно. Я просто использовал эту форму в вопросе, чтобы понять, что это за головоломка. Если вы не указали это в этой форме, просто объясните, как это назвать.
Удачи!
источник
Ответы:
Python 2 (работает быстрее, если используется Pypy)
Считается, что почти всегда угадывают правильное соединение в 10 раундов или ниже
Мой алгоритм взят из моего ответа для вдохновителя как мое хобби (см. В Ideone ). Идея состоит в том, чтобы найти предположение, которое минимизирует количество оставшихся возможностей в худшем случае. Мой алгоритм ниже просто перебор, но чтобы сэкономить время, он просто выбирает случайное предположение, если количество оставшихся возможностей больше, чем
RANDOM_THRESHOLD
. Вы можете поиграть с этим параметром, чтобы ускорить процесс или увидеть лучшую производительность.Алгоритм довольно медленный, в среднем 10 с за один прогон, если он выполняется с использованием Pypy (если используется обычный интерпретатор CPython, это около 30 с), поэтому я не могу проверить его на всех перестановках. Но производительность довольно хорошая, после 30 тестов я не видел ни одного случая, когда бы он не мог найти правильное соединение в 10 раундах или ниже.
Во всяком случае, если это используется в реальной жизни шоу, у него есть много времени до следующего раунда (одна неделя?), Поэтому этот алгоритм может быть использован в реальной жизни = D
Поэтому я думаю, можно с уверенностью предположить, что в среднем это найдет правильные пары в 10 догадках или ниже.
Попробуй сам. Я мог бы улучшить скорость в следующие несколько дней (РЕДАКТИРОВАТЬ: дальнейшее улучшение кажется трудным, поэтому я просто оставлю код как есть. Я пробовал делать только случайный выбор, но даже при
size=7
трех неудачных попытках из 5040 , поэтому я решил сохранить более умный метод). Вы можете запустить его как:Или, если вы просто хотите посмотреть, как это работает, введите меньшее число (чтобы оно работало быстрее)
Чтобы запустить полный тест (предупреждение: это займет очень много времени
size
> 7), поставьте отрицательное число.Полный тест для
size=7
(завершено за 2 м 32 с):Если
RANDOM_THRESHOLD
иCLEVER_THRESHOLD
для обоих задано очень высокое значение (например, 50000), это заставит алгоритм найти оптимальное предположение, которое минимизирует количество возможностей в худшем случае. Это очень медленно, но очень мощно. Например, его запускsize=6
подтверждает, что он может найти правильные пары максимум за 5 раундов.Хотя среднее значение выше по сравнению с использованием аппроксимации (которая в среднем составляет 4,11 раунда), но оно всегда получается успешным, даже больше, когда остается один запасной раунд. Это еще больше укрепляет нашу гипотезу о том, что, когда
size=10
, он почти всегда должен найти правильные пары в 10 раундов или меньше.Результат (выполнено за 3м 9с):
Код.
источник
len(remove_perms ...)
часть). И да, я имел ввиду в <= 10 раундов =). Между прочим, в приведенном выше коде действительно оптимальное предположение никогда не делается, поскольку я добавилCLEVER_THRESHOLD=0
, что означает, что он будет пытаться только угадать из списка возможностей, хотя оптимальное предположение может быть за пределами этого набора. Но я решил отключить это, чтобы сэкономить время. Я добавил полный тест дляsize=7
, показывая, что это всегда успешно.size=8
и обнаружил, что последняя версия имеет только 40308 успехов (вместо 40320), если этот параметр используется. Но это все еще 99,97% успеха! Думаю, мы можем сделать так, чтобы организатор телешоу обанкротился.CJam -19 ходов - стратегия идиота
Это не серьезный ответ, а демонстрация. Это решение идиота, когда он не учитывает количество правильных парных данных, предоставленных во второй части хода. При полностью случайных парах это занимает в среднем 27 недель. Этот ответ, как я уже сказал, недостаточен, но указывает на то, что шансы для разумной группы (гораздо более умной, чем эта программа), вероятно, не так малы, как вы могли бы ожидать. Более интеллектуальные алгоритмы, которые я написал, однако требуют больше времени для запуска, чтобы я мог «фактически получить ответы от них».
Обновление: приведенный ниже код был обновлен, чтобы использовать состояние, при котором он должен удалить те, которые не работают, если единственными правильными являются те, которые, как мы уже знали, были правильными. Он также был отредактирован, чтобы показать мой генератор случайных «правильных ответов». Средний результат теперь только 19. Это все еще глупое решение, но оно лучше, чем предыдущий незначительно.
источник
Быстрая многопоточная версия C ++
Я знаю, что прошло много времени с тех пор, как этот поток был активным, но у меня есть замечательное дополнение: вот реализация C ++ минимаксного алгоритма для Are You The One? , который использует многопоточность, чтобы ускорить оценку каждого возможного предположения.
Эта версия намного быстрее, чем версия Python (более чем в 100 раз быстрее, если в исходной версии Python установлено максимальное значение
RANDOM_THRESHOLD
иCLEVER_THRESHOLD
). Он не использует случайное предположение, а скорее оценивает все перестановки и представляет в качестве своего предположения перестановку, которая исключает наибольшее количество возможных решений (учитывая реакцию в худшем случае).Для небольших игр вызов "ayto -n" запустит игру на всех n! возможные скрытые совпадения, и даст вам краткое резюме результатов в конце.
Поскольку все еще трудно оценить все 10! возможные скрытые совпадения, например, если вы называете «ayto 10», симулятор делает свои первые три предположения с фиксированными значениями, затем запускает минимакс, чтобы выбрать свое предположение, и предполагает, что ему была дана оценка наихудшего случая. Это ведет нас по «пути наихудшего случая» к скрытому вектору, который, предположительно, находится в классе векторов, который использует алгоритму максимальное количество догадок для идентификации. Эта гипотеза не была проверена.
До n = 9 не было моделирования, для решения которого потребовалось бы больше n ходов.
Чтобы проверить это самостоятельно, пример компиляции будет следующим:
Вот небольшой пример с выводом:
Код
источник