В видеоиграх Pokemon, игрок отправляется в мир, чтобы заставить диких животных собирать крошечные шарики и обучать их сражаться. Конечно, все знают, что никто не играет в покемонов за сражение. Настоящая ничья в серии - это ловля покемонов! Ваша задача - симулировать покебол во время попытки захвата. Эта задача будет использовать формулу захвата V поколения, которая выглядит следующим образом:
HP_max
равно максимальному HP целевого покемона. HP_current
равно текущему HP целевого покемона. rate
является коэффициентом вылова покемона, bonus_ball
является множителем брошенного покебола и bonus_status
составляет 2,5, если целевой покемон спит или заморожен, 1,5, если целевой покемон парализован, отравлен или сожжен, и 1 в противном случае.
После обнаружения a
вы должны выполнить до трех «проверок встряхивания». Вероятность успешной проверки встряхивания равна 65536 / (255 / a)^(1/4)
. Если какая-либо из этих проверок не проходит, покемон избегает своего мяча. Если все три проверки успешны, покемон пойман!
Примечание: всякий раз, когда выполняется любое деление, результат округляется до кратного 1/4096. Это, как правило, незначительная деталь, но она должна учитываться в вашей программе.
Ваша задача состоит в том, чтобы написать программу, которая выполняет проверки встряхивания и печатает, чтобы вывести статус проверок. На stdin ваша программа получит (по крайней мере, подробности ниже) максимальный HP покемона, коэффициент вылова целевого покемона и имя покебола. Максимальный HP и коэффициент вылова гарантированно будут целыми числами, а имя покебола всегда является строкой. Эти входные данные могут поступать в любом порядке и с любым разделительным символом (ами) удобны для вас, при условии, что они последовательны. Предположим, что ввод правильный, обработка ошибок не требуется.
Названия покеболов, которые вы должны поддерживать, и их множители вылова перечислены здесь:
Poke | 1
Great | 1.5
Ultra | 2
Master | 255
Вы можете предположить, что цель спит и на 1 HP. Ожидаемый формат для вывода:
(First check failed)
(no output)
(Second check failed)
*shake*
(Third check failed)
*shake*
*shake*
*shake*
(All checks pass)
*shake*
*shake*
*shake*
Click!
(Это не опечатка, ваша программа никогда не должна выводить только два встряски.)
Это код-гольф , поэтому ваш счет - это количество байтов исходного кода вашей программы. Самый низкий балл побеждает.
Бонусы!
Я сказал, что вы можете предположить, что покемон находится на 1 HP и спит. В качестве альтернативы, вы можете разрешить пользователю вводить текущие HP покемона и bonus_status
. Текущий HP покемона всегда будет целым числом, равным или меньшим, чем его максимальный HP, и bonus_status
всегда будет 2,5, 1,5 или 1. Если вы это сделаете, у вас должны быть эти значения в конце ввода, и по умолчанию 1 и 2.5, если они не поставляются. Вы можете вычесть 15 баллов из своего балла за реализацию одного из них или 25 баллов за оба.
Кроме того, вы можете реализовать критические записи. Если происходит критический захват, выполняется только один тест встряхивания. В случае неудачи программа завершает работу без вывода сообщений. Если передано, это выводит:
*shake*
Click!
Критические захваты становятся более распространенными, поскольку игрок собирает больше покемонов, но для простоты мы можем предположить, что они уже «поймали их всех». Если случайно сгенерированное число от 0 до 2047 меньше a
(результат первого вычисления), умноженного на 2,5, это критический захват. Поддержка критических захватов позволяет убрать 25 очков из вашего счета.
Есть ряд других покеболов, которые вы можете поддержать. Их имена и коэффициенты вылова перечислены здесь:
Safari | 1.5
Sport | 1.5
Lure | 3
Net | 3
Dusk | 3.5
Dive | 3.5
Moon | 4
Fast | 4
Quick | 5
Love | 8
Для каждого из этих шаров, для которых вы добавляете поддержку, вы можете вычесть (5 + длина названия шара) из вашего счета.
Наконец, для ударов, достижение всех этих бонусов (текущий HP и bonus_status от stdin, критических захватов и всех 10 дополнительных шаров) принесет вам дополнительную награду в 7 очков, удаленную с вашего счета, для получения всего 150 бонусов.
Пример ввода / вывода
Просто чтобы убедиться, что мы все на одной странице.
$ ./balls <<< "19,Ultra,255"
*shake*
*shake*
*shake*
Click!
Удачи и счастливого гольфа!
65536 / (255 / a)^(1/4)
можете получить, но мои смелости говорят, что она больше 1. Вы проверяете случайное число в диапазоне от 0 до 65536? Успешна ли проверка, если случайное число больше или меньше?65536 / (255 / a)^(1/4)
больше 1, проверка автоматически завершается успешно. Я не уверен, что вы подразумеваете под вторым вопросом.rnd < p
означает, что проверка прошла успешноrnd
в диапазоне от 0 до 1.65536 / (255 / a)^(1/4)
, тогда, если случайное число меньше, тест на встряхиваниеОтветы:
J 301-150 = 151
В спорте все бонусы реализованы, хотя, наверное, лучше не делать этого :). Я коротко объяснил вещи ниже, но это слишком долго, чтобы объяснить подробно, если кто-то явно не просит. Он реализует все шары, критические захваты и дополнительные входные данные.
Здесь игра в гольф
источник
PYTHON 249 байт - 75 для бонусов = 174
Моя первая попытка игры в гольф.
Бонус за включение выбранных шаров: Safari, Sport, Lure, Net, Dusk, Dive, Fast, Quick
Дай мне 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 бонусных очков
[править] Округление до 12 дробных битов каждый раз, когда используется разделение, не используя его
[edit2] оптимизировать словарь покебол
источник
Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.
)r < 65536/(255/a)^(0.25) <=> r*255^(0.25)/a^(0.25) < 65536 <=> r*255^(0.25) < 65536*a^(0.25)
исключить все подразделения?floor(x*4096)*4096
же, как если бы вы округлились, например, до десятичных знаков.Perl 1 (374 - 150 = 224 + недостающие байты)
Список аргументов:
Да, я знаю, что это полностью нарушает правила, но мне все равно. Если вы не заметили, это первый алгоритм захвата поколения покемонов со всеми его особенностями (в определенных условиях большие шары лучше, чем ультраболы). Это реализует все функции, в том числе те, которые не включены (и я все равно решил включить баллы за них). Критические захваты игнорируются (но они реализованы - только потому, что они не влияют на скорость захвата), более новые шары Poké Balls загружают данные других Poké Balls.
Обратите внимание, что хотя этот ответ короткий, он нарушает все правила, поэтому считайте его забавным, но не принимайте его. Сначала я собирался реализовать алгоритм Gen5 в Perl 5, но я решил - почему бы не повеселиться. И да, я на самом деле скомпилировал Perl 1, и этот код работает. Если вы запустите его в более новой версии Perl, вы можете получить предупреждения об устаревшем использовании
do
, но давайте будем честными - это единственный способ запустить функции в Perl 1. Perl 1 также имеет некоторые причуды самостоятельно (например, я не могу переместить строку, начиная с/M/
предыдущей строки - почему? - я не знаю).Кроме того, в Perl 1 нет случайных чисел, поэтому надеюсь, что вы не убьете меня по модулю
$$
. Это самое близкое к случайному числу, которое я мог найти.Редактировать: Похоже, что старый
do call()
синтаксис был удален в Perl 5.19.8. Убедитесь, что вы используете более старую версию Perl для запуска этого скрипта, так как кажется, что Perl 5.20 не будет совместим со скриптами Perl 1.источник
PHP (
+746763 байта - все бонусы):Чтобы использовать это, вы должны предоставить вход как 'ball = poke & status = sleep' на STDIN.
HP должен быть указан как «hp [max]» или «hp [current]».
Этот код работает, как проверено здесь .
Вы можете указать статус по имени или по множителю. ( не требуется в вопросе ).
Вот читабельная версия:
Мне пришлось редактировать это, потому что я использовал гораздо более высокую точность, чем требовалось.
Исправление было предоставлено TheConstructor .
источник
Whenever any division is performed, the result is rounded down to a multiple of 1/4096.
)floor(x*4096)/4096
или реализовать деление с фиксированной запятой, как я.Ява, 611
Гол:
=> 611
Программа использует арифметику с фиксированной точкой с 12 долями дроби (
1/4096
это значение самого правого бита). Поскольку Java обычно не использует фиксированную точку, в коде есть некоторые сдвиги для достижения ожидаемых результатов. Смотрите длинную версию для используемых арифметических функций, которые были встроены для целей игры в гольф.Хотя большинство вычислений можно было бы выполнить для
int
значений, деления лучше работают сlong
s, так как вам нужно сместить дивиденд еще на 12 бит влево, чтобы сохранить желаемую точность (в противном случае вы потеряете все дробные биты).Пример ввода (
;
требуется только в интерактивном режиме, т. Е. STDIN не получил EOF): Ball, catch_rate, max_hpОбразец вывода:
Пример ввода: Ball, catch_rate, max_hp, current_hp, bonus_state
Образец вывода:
источник
CoffeeScript -
317313310307306294270250242 байта342 - 25 (параметры) - 75 (12 шаров) = 242
Ожидает ввода
HP_max,Rate,Ball[,HP_current[,status]]
. Не поддерживаетMoon
илиLove
шары.Это первое, что я когда-либо играл в гольф, это не регулярное выражение, так что, вероятно, есть место для совершенствования. Я беззастенчиво скопировал идею хранить только частичные имена шаров. ;) Поддержка двух других шаров просто не стоит, даже с дополнительными +7 для получения всех бонусов.
Неуправляемая версия
Эта версия опускает все короткие псевдонимы, которые я определяю в начале, но определяет поиск по шару отдельно.
Примечание к формуле вероятности: я перестроил полную формулу (с выпиской
a
), чтобы не было делений, и я вычисляю(...)^(1/4)
, взяв квадратный корень дважды.источник
p-=p%1/4096
похоже, работает. (p-=p%(1/4096)
Я бы подумал, что вам, по крайней мере, нужно написать, и тогда я все равно не был бы уверен, что для дробей с обеих сторон реализован модуль.%
может быть использовано для некоторых забавных вещей в JS. Перечитав вопрос, я думаю, что этот ответ не совсем соответствует требованию округления. Я думаю, что округление должно применяться после каждого деления. Возможно, мне придется немного перестроить мои расчеты. ^^p%(1/4096)
. Я даже проверил это перед публикацией, но как-то запомнил результат моего теста неправильно.Обновление: (C #)
Количество байт: 3600
Критический: -25
Все тычки: -91
Итого = 3484
[Golfed]
[Регулярные]
источник