В видеоиграх 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, проверка автоматически завершается успешно. Я не уверен, что вы подразумеваете под вторым вопросом.
rnd < p
означает, что проверка прошла успешно rnd
в диапазоне от 0 до 1.
65536 / (255 / a)^(1/4)
, тогда, если случайное число меньше, тест на встряхивание
65536 / (255 / a)^(1/4)
можете получить, но мои смелости говорят, что она больше 1. Вы проверяете случайное число в диапазоне от 0 до 65536? Успешна ли проверка, если случайное число больше или меньше?