Вдохновлен Великой API Охота за пасхальными яйцами!
Резюме
Ваша задача - найти заранее заданное целое число в «пространстве Коллатца» (будет объяснено позже), используя наименьший возможный шаг.
Вступление
Эта проблема основана на известной гипотезе Коллатца, о которой, надеюсь, все здесь хотя бы слышали. Вот резюме, взятое из Печать номеров Super Collatz .
Последовательность Коллатца (также называемая проблемой 3x + 1) - это место, где вы начинаете с любого положительного целого числа, в этом примере мы будем использовать 10 и применим к нему следующий набор шагов:
if n is even: Divide it by 2 if n is odd: Multiply it by 3 and add 1 repeat until n = 1
Расстояние Коллатца C(m,n)
между двумя числами m
и n
, для целей этой задачи, представляет собой расстояние между двумя числами в графе Коллатца (Кредиты @tsh для рассказа об этой концепции), которое определяется следующим образом: (с использованием 21
и в 13
качестве примеров ):
Запишите последовательность Коллатца для m
(в данном случае 21
):
21, 64, 32, 16, 8, 4, 2, 1
Запишите последовательность Коллатца для n
(в данном случае 13
):
13, 40, 20, 10, 5, 16, 8, 4, 2, 1
Теперь посчитайте, сколько чисел появляется только в одной из последовательностей. Это определяется как расстояние Коллатца между m
и n
. В этом случае 8
, а именно
21, 64, 32, 13, 40, 20, 10, 5
Таким образом, у нас есть Collatz расстояние между 21
и 13
как C(21,13)=8
.
C(m,n)
иметь следующие хорошие свойства:
C(m,n)=C(n,m)
C(m,n)=0 iff. m=n
Надеюсь, определение C(m,n)
теперь ясно. Давайте начнем заниматься охотой на яйца в пространстве Collatz!
В начале игры контроллер решает положение пасхального яйца, которое выражается его одномерной координатой: целое число в интервале [p,q]
(другими словами, целое число между p
и q
оба конца включительно).
Положение яйца остается неизменным на протяжении всей игры. Мы будем обозначать эту координату как r
.
Теперь вы можете сделать начальное предположение 0 , и оно будет записано контроллером. Это твой 0-й раунд. Если вам так повезло, что вы поняли это правильно на первом месте (то есть 0 = r), игра заканчивается, и ваш счет равен 0
(Чем меньше счет, тем лучше). В противном случае, вы входите в 1-й раунд и делаете новое предположение 1 , это продолжается до тех пор, пока вы не сделаете это правильно, то есть a n = r, и ваш счет будет n
.
Для каждого раунда после 0-го контроллер дает вам одну из следующих отзывов, чтобы вы могли сделать более правильное предположение на основе предоставленной информации. Давайте предположим , что вы в настоящее время в n
м круге и , следовательно , ваше предположение является п
- "Ты нашел это!" если a n = r, в этом случае игра заканчивается, и вы забиваете
n
. - «Вы ближе :)», если C (a n , r) <C (a n-1 , r)
- «Вы кружите вокруг яйца», если C (a n , r) = C (a n-1 , r)
- «Вы находитесь дальше :(», если C (a n , r)> C (a n-1 , r)
Чтобы сохранить некоторые байты, я буду называть ответы как «Право», «Ближе», «То же самое», «Дальше» в порядке, указанном выше.
Вот пример игры с p=1,q=15
.
- 0 = 10
- a 1 = 11, ответ: «Ближе»
- а 2 = 13, ответ: «Дальше»
- а 3 = 4, ответ: «Дальше»
- а 4 = 3, ответ: "Ближе"
- 5 = 5, ответ: " То же"
- а 6 = 7, ответ: «Верно»
Оценка: 6
.
Вызов
Разработайте детерминированную стратегию, чтобы играть в игру p=51, q=562
с лучшим счетом.
Ответы должны подробно описать алгоритмы. Вы можете прикрепить любой код, который поможет выяснить алгоритм. Это не Codegolf, поэтому вам предлагается написать разборчивый код.
Ответы должны включать наихудший балл, который они могут получить во всех возможных случаях r
, и выигрывает тот, у кого наименьший наихудший балл. В случае ничьей выигрывают алгоритмы, которые имеют лучший средний балл для всех возможных r
s (которые также должны быть включены в ответы). Дальнейших тай-брейков больше нет, и в итоге у нас может быть несколько победителей.
Спекуляции
- Повторюсь,
r
лежит в промежутке[51,562]
. - Применяются лазейки по умолчанию .
Щедрость (добавляется после публикации первого ответа)
Я могу лично предложить вознаграждение за ответ, где все предположения сделаны в пределах диапазона, [51,562]
при этом все еще имея достаточно низкий худший результат.
источник
Ответы:
Рубин, 196
Это было намного сложнее, чем я изначально думал. Мне пришлось разобраться со многими непонятными случаями, и в результате я получил много уродливого кода. Но это было очень весело! :)
стратегия
Каждая последовательность Коллатца заканчивается последовательностью степеней 2 (например: [16, 8, 4, 2, 1]). Как только встречается степень 2, мы делим на 2, пока не достигнем 1. Давайте назовем первую степень 2 в последовательности, ближайшей к pow2 (так как это также ближайшая степень 2 к нашему числу, используя расстояние Коллатца). Для данного диапазона (51-562) все возможные ближайшие числа pow2 : [16, 64, 128, 256, 512, 1024]
Укороченная версия
Алгоритм выполняет:
Подробная версия
Для игры с целевым номером
r
стратегия следующая:r
минимально возможному числу шагов.Результаты
Выполнение алгоритма для всех чисел в диапазоне 51-562 занимает около секунды на обычном ПК, и общая оценка составляет 38665.
Код
Попробуйте онлайн!
источник
худший балл: 11, общий балл: 3986
Все догадки в диапазоне
[51,562]
.Мой алгоритм:
vals
, первоначально набор содержит все числа в диапазоне[51,562]
.На каждом этапе сделайте следующее:
guess
в диапазоне[51,562]
таким образом , что , когда значения вvals
( за исключениемguess
самого себя) разбивается на 3 наборов соответствующих возможных результатовCloser
,Same
иFarther
, размер максимум из этих 3 -х наборов минимальна.Если существует несколько возможных значений,
guess
удовлетворяющих вышесказанному, выберите наименьшее.guess
.vals
, чтобы они не могли дать такой результат.Моя эталонная реализация, написанная на C ++ и Bash, работает на моей машине примерно за 7,6 секунды и дает худшую оценку / сумму, как описано в заголовке.
Испытание всех возможных значений первого предположения займет около 1,5 часов на моей машине. Я могу рассмотреть возможность сделать это.
источник