Это вторая из серии головоломок, которые я буду публиковать каждый понедельник в полночь по тихоокеанскому времени. Первая головоломка находится здесь .
Контекст:
Миллиардер-затворник создал игровое шоу для привлечения лучших и самых ярких программистов мира. По понедельникам в полночь он выбирает одного человека из числа претендентов на участие в неделе и предоставляет им игру. Вы счастливчик на этой неделе!
Игра на этой неделе:
Хост предоставляет API-доступ к стопке из 10 000 цифровых конвертов. Эти конверты отсортированы случайным образом и содержат внутри себя долларовую стоимость от 1 до 10000 долларов (никакие два конверта не имеют одинаковую долларовую стоимость).
В вашем распоряжении 4 команды:
Чтение (): чтение цифры доллара в конверте в верхней части стопки.
Возьмите (): добавьте долларовую цифру в конверте в свой кошелек для игрового шоу и вытяните конверт из стопки.
Pass (): выскочить из конверта на вершине стека.
Oracle (M): возвращает среднее значение следующих M конвертов в стеке, не считая того, которое вы можете в данный момент прочитать ().
Правила:
Если вы используете Pass () на конверте, деньги внутри будут потеряны навсегда.
Если вы используете Take () на конверте, содержащем $ X, с этого момента вы никогда не сможете использовать Take () на конверте, содержащем <$ X. Take () на одном из этих конвертов добавит $ 0 к вашему кошельку.
Если вы используете Oracle (M) на очереди T, конверты от T + 1 до T + M будут возвращены. Oracle () отключен до поворота T + M.
Напишите алгоритм, который заканчивает игру с максимальной суммой денег.
Если вы пишете свой алгоритм на Python, не стесняйтесь использовать этот контроллер, предоставленный @Maltysen: https://gist.github.com/livinginformation/70ae3f2a57ecba4387b5
Примечания 1: «Максимальный» в этом случае означает среднее значение в вашем кошельке после N> = 1000 пробежек. Я ожидаю, хотя я бы хотел оказаться ошибочным, что медианное значение для данного алгоритма будет сходиться при увеличении N до бесконечности. Не стесняйтесь пытаться максимизировать среднее значение вместо этого, но у меня есть ощущение, что среднее значение, скорее всего, будет отброшено небольшим N, чем медиана.
Примечание 2: поскольку все решения предыдущей части этой головоломки верны здесь, их повторное размещение не имеет большого значения. Только алгоритмические улучшения предыдущих головоломок будут рассмотрены для части II.
Изменить: условие приза было удалено, в свете этого поста на мета.
источник
M
значений, где вы можете выбиратьM
.Ответы:
Groovy
$ 713337$ 817829$ 818227Загрузочный код:
Алгоритм
Я сравниваю оставшиеся значения с возможными значениями. Этот скрипт не быстрый (занимает 1 минуту на 1000x симуляций) ... но он будет выполнять симуляции одновременно.
Я понятия не имею, почему мой алгоритм работает, но это было просто методом проб и ошибок: объединение математических операций и манипулирование константами. Я запустил его в 5000 раз для текущей оценки, чтобы уменьшить колебания оценки (это +/- $ 4000 в зависимости от количества итераций).
Даже без оракула в конце, он все равно должен (едва) побить решение @ orlp для предыдущей головоломки.
источник
C # - $ 803.603 сейчас -> $ 804,760 (с оракулом)
Загрузочный код
Код игры:
Кредит принадлежит Рето Коради ( /codegolf//a/54181/30910 )
Изменить: Базовое использование Oracle реализовано. Если следующий оракул превышает пороговое значение для использования, разверните текущий конверт до индекса Oracle Index. Это не часто, но это улучшение ;-)
источник
Python - $ 74112
Возьмите, только если текущее значение ниже следующего значения (т.е. вы можете взять оба).
Python - (все еще вычисляет среднее)
Этот ответ занимает ОЧЕНЬ ДОЛГО в расчете. Это достигает около 670.000 $ . Я помню каждый конверт, который видел. Каждый раз, когда мне нужно принять решение, я генерирую два списка оставшихся конвертов, которые я мог бы потенциально добавить в свой кошелек, если я возьму текущий конверт или оставлю его соответственно.
Я не оптимизировал код.
И init_game начинается так:
источник
C # - 780,176 $
Проверьте, находится ли следующее значение в пределах 5% от всех оставшихся значений. Будьте более расслаблены, когда мы доберемся до конца.
И мой класс игры, очень уродливый, класс игры даже не проверяет, разрешен ли оракул, но, поскольку я использую только Oracle (1), это не должно быть проблемой.
источник
Ява, $ 804,991
Оценка от 1001 раундов. Вероятно, слишком близко, чтобы звонить между этим ответом и ответом Стефана Шинкеля .
Это основано на моем ответе в предыдущей задаче, так как он использует те же вычисления на основе энтропии для оценки выплат. Основное отличие состоит в том, что теперь он просто берет конверты попарно (1 и 2, затем 3 и 4 и т. Д.) И просматривает возможные комбинации «бери-бери», «бери-пас», «проходи-бери» и т. Д. Он также вычисляет точная оценка, когда количество действительных конвертов действительно мало.
«Обертка», которую я написал, на самом деле не является настоящей оберткой, она просто дает конверты в парах, а не вызывает
Oracle(1)
функцию каждый второй раунд.В целом, я бы сказал, что, несмотря на повышенную сложность, этот бот действительно не лучше моего предыдущего.
игрок
контроллер
Адрес биткойна: 1BVBs9ZEP8YY4EpV868nxi2R23YfL7hdMq
источник
Python 3 - $ 615570
На самом деле не использует оракула ... Эх :)
Составляет список всех предыдущих конвертов и проверяет, меньше ли текущий конверт, чем количество предыдущих конвертов с шагом 10 конвертов.
источник
Python, 87,424
Вот простой и легкий алгоритм, счастливая семерка.
По сути, он конвертирует read () в строку и проверяет, есть ли в ней семерка. Если есть, он берет конверт. Если нет, то это проходит.
Это в среднем около 81 000, я не отслеживал.
источник