API охота на пасхальные яйца!
На http://easter_egg_hunt.andrewfaraday.com есть API, который обеспечит специальную охоту за пасхальными яйцами, только для вас ...
Вы можете посмотреть документацию по API по указанному выше адресу или попробовать его здесь.
API:
Все вызовы этого API являются запросами GET, которые возвращают строку JSON.
Эти примеры в саду 5х5, только для иллюстрации. API фактически будет работать в саду 100x100 (от индексов 1 до 100)
/new_game
Внутренне API создает сад и прячет в нем яйцо.
В этом примере яйцо в 4, 4
+----------+
| |
| |
| |
| |
| E |
| |
| |
| |
| |
| |
+----------+
Вызов
/new_game
Возвращает
{game_id: 'abcde'}
/guess/:game_id/:x/:y
API смотрит в сад и говорит вам, насколько вы близки.
Если угадать 2 поперек и 8 вниз, сад выглядит так
+----------+
| |
| |
| |
| |
| E |
| |
| |
| g |
| |
| |
+----------+
Вызов
/guess/abcde/2/8
Возвращает
{x: 'higher', y: 'lower'}
Это означает: * Ваш x слишком низок (позиция яйца выше) * Ваш y слишком высок (позиция яйца ниже)
Правильный звонок:
/guess/abcde/4/4
Возвращает
{x: 'right', y: 'right', turns: 10}
Правила
Напишите программу для поиска пасхального яйца с API.
- Используйте любой язык.
- Попробуйте написать краткий, но читаемый код.
- Ваша программа ДОЛЖНА вызывать '/ new_game' каждый раз и использовать game_id, возвращаемый во всех вызовах 'предположить'. Не заглядывать в сад!
- Постарайтесь последовательно закончить игру с наименьшим количеством возможных вызовов.
- Это не код гольф.
Конкурсный ответ?
Чтобы иметь шанс на победу, вот что нам нужно знать:
- Какой код вы используете (в своем ответе или ссылку на github, если она больше, чем вы хотели бы добавить в ответ).
- Запустите ваш код 10 раз, запишите game_id и набирайте очки каждый раз.
-game_id- : -score-
например
abbbbbbb : 10
abbbbbdd : 5
(Примечание: game_ids необходимы для проверки результата)
Оценка будет рассчитана следующим образом:
- Самые высокие и самые низкие два результата будут игнорироваться.
- Оставшиеся 6 баллов будут сложены вместе.
- Это ваш счет.
- Самый низкий балл побеждает.
добавление
Tl, доктор: приложение немного дрянной.
API был написан за 90 минут и развернут на Raspberry Pi 2. Пожалуйста, будьте осторожны с моим сервером API. Если вы DDOS эту бедную вещь, вы могли бы испортить ее для всех.
Кроме того, он реализован с использованием протокола NOIP для имитации статического IP-адреса, но иногда это может выпасть на некоторое время. Вот что я получаю за использование веб-хостинга с нулевым бюджетом.
Просто для хихиканья, вот простой статистический анализ сыгранных игр ... http://easter_egg_hunt.andrewfaraday.com/stats
источник
Ответы:
АПЗ + WIN
Работает, начиная с центра и сходясь по местоположению, устанавливая верхний или нижний предел на последнее значение и добавляя или вычитая половину разницы до соответствующего предела до последнего предположения на каждой итерации.
Эта функция использует следующую функцию для выполнения вызовов API:
Результаты за 10 попыток были:
источник
Ruby (+ JSON, HTTParty) - оценка: 40 (6 + 7 + 7 + 7 + 7 + 6)
Это было весело. Я использовал бинарный поиск, чтобы найти яйцо и получил следующие результаты:
Вот код :
источник
Python 3 (+ запросы), 39 баллов
Оценка 39 (7 + 7 + 7 + 6 + 6 + 6 - 7-7-6-6)
Источник:
источник
PHP
Использование file_get_contents и json_decode .
Насколько я могу судить , оптимальная стратегия требует не более 7 ходов, в среднем 5,8 ходов по одной оси и в среднем 6,4786 ходов по двум осям.
Образец 10
Оценка: 6 + 6 + 6 + 6 + 6 + 7 = 37
Гольф, 245 байт
Пример вывода
источник
Haskell, общий балл
6640(Правка: пропущена часть об отбрасывании наивысших и наименьших результатов в зачетах)
Я просто использую бинарный поиск. Не уверен, есть ли способ получить лучше, чем 6,5 за попытку в среднем без мошенничества (полагаю, я мог бы просто продолжать набирать 10 подходов, пока не получу лучший результат, но где в этом удовольствие?).
Ах, кстати, очень веселый вызов. Идея достаточно проста, чтобы охватить всех, и я обычно не имею дело с веб-API в своей повседневной работе, и мне просто не терпелось найти оправдание
servant
, так что спасибо за это :) Наверное, не так здорово, если вы ' Мы надеемся на конкуренцию, но я думаю, что подобные задачи могут быть использованы для сбора примеров кода для начинающих и тому подобных вещей.Исполняемый скрипт (запускает одну игру и сообщает gameId и счет):
Результаты
источник
JavaScript, 35 баллов
Публикация незагрязненного кода не устраивает меня! : D
Подсчет очков: 5 + 6 + 6 + 6 + 6 + 6 = 35
Мне очень повезло, я набрал 3 балла в моем последнем тесте перед публикацией!
Попытайся
Используя несколько вышеописанную версию кода!
Показать фрагмент кода
источник
Ржавчина
Так получилось, что у Rust действительно хорошая библиотека десериализации,
serde
которая очень помогла в этой программе. Сам алгоритм представляет собой довольно простой бинарный поиск, за исключением того, что он запускался дважды - один разx
и один разy
.В макросе URL есть особый случай отсутствия строк форматирования, потому что это можно сделать практически бесплатно, а при отсутствии форматирования строка будет храниться в статическом хранилище.
Cargo.toml
main.rs
Резюме
5 + 6 + 7 + 7 + 7 + 7 = 39
источник
Python 2
Гольф-везрион - 276 байт
Более читаемая версия + комментарии
Результаты
Резюме
Скорее всего: D
6 + 6 + 6 + 7 + 7 + 7 = 39
источник