У відеоіграх Pokemon гравця відправляють у світ, щоб змусити диких тварин на крихітні кульки та навчити їх битися. Звичайно, всі знають, що в битву ніхто не грає в Покемон. Справжня нічия серіалу - це покемон, що наздоганяє себе! Ваше завдання - імітувати покебол під час спроби захоплення. У цьому виклику буде використана формула захоплення V покоління, яка полягає в наступному:

HP_maxдорівнює максимальному HP покемону. HP_currentдорівнює поточному HP-покемону HP. rate- коефіцієнт вилову bonus_ballпокемону, є множником кинутого покеба, і bonus_statusстановить 2,5, якщо цільовий покемон спить або заморожується, 1,5, якщо цільовий покемон паралізований, отруєний або спалений, і 1 в іншому випадку.
Після знаходження aви повинні виконати до трьох «перевірок струшування». Ймовірність успішної перевірки струшування є 65536 / (255 / a)^(1/4). Якщо будь-яка з цих перевірок не вдасться, покемон уникає своєї кулі. Якщо всі три перевірки пройдуть успішно, покемон спійманий!
Примітка. Щоразу, коли виконується будь-яке ділення, результат округляється до кратного 1/4096. Це, як правило, незначна деталь, але її потрібно враховувати у вашій програмі.
Ваше завдання полягає в тому, щоб написати програму, яка виконує перевірки тремтіння та друкує для викреслення статусу чеків. У stdin ваша програма отримає (принаймні, деталі нижче) максимальний HP покемон, швидкість лову цільового покемону та назву pokkeball. Максимальний показник 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 і 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? Чи вдасться перевірити, якщо випадкове число більше або якщо воно нижче?