Симулятор покеба


26

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

a = (((3 * HP_max - 2 * HP_current) * швидкість * bonus_ball) / 3 * HP_max) * бонус_стат

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. Чи перевіряєш ти випадкове число в діапазоні від 0 до 65536? Чи вдасться перевірити, якщо випадкове число більше або якщо воно нижче?
Конструктор

Якщо 65536 / (255 / a)^(1/4)більший за 1, перевірка автоматично проходить успішно. Я не впевнений, що ви маєте на увазі під другим питанням.
підземниймонорельс

Тому rnd < pозначає, що перевірка є успішною з rndдіапазоном 0 і 1.
TheConstructor

1
@IsmaelMiguel дивіться мої коментарі: ви генеруєте випадкове число в діапазоні від 0 до 1 і порівнюєте його з 65536 / (255 / a)^(1/4), тоді, якщо випадкове число менше, тест тремтіння вдався
TheConstructor

1
Як зазначається в тексті, текстовий тип покеболу, макс. К.с. і швидкість лову минули як вхід для вашої програми. За бажанням ви можете попросити поточний hp (за замовчуванням 1) або бонус за статус (за замовчуванням 2,5)
TheConstructor

Відповіді:


3

J 301-150 = 151

У спорті всі бонуси реалізовані, хоча мені, мабуть, краще не буде :). Я коротко пояснив речі нижче, але це ще занадто довго, щоб детально пояснювати, якщо хтось прямо не вимагає. Він реалізує всі кулі, критичні зйомки та необов'язкові входи.

tm =: =*./@:+.' '=] NB. Template match, match non-blanks in right with left
balls  =: 'MMLLPGSUNDFQ',.12{.'oauo' NB. space = wildcard.
NB. lookup function: name -> bonus_ball
lookup =: 4 255 3 8 1 1.5 1.5 2 3 3.5 4 5 #~ (tm"1&balls)@(2&{.) 

NB. convert given option
options =: ;".`lookup@.(_=_&".);._2 ,&',' i3 NB. parse options to numeric values
NB. add defaults if necessary
complete =: (, 1 2.5{.~(5-$)) options         
NB. formula
r=: <.&.(*&4096)                              NB. round to 1/4096
NB. a=: ((3*zeroth - 2*thirth)*first*second*fourth)/(3*zeroth)
a=:r(1-3%~2*%/3 0{complete)**/1 2 4{complete  NB. A prime, already divided by 255

NB. Critical captures
crit =: >2r5*[:?11^~2: NB. check for critical, k a
mess =: 2 7$'*shake*Click! '"_ NB. Message template
check =: >"0 [:?(4$2^16)"_     NB. Perform 4 checks
mes2 =: mess#~3(<.,<)]          NB. Construct message from number of passed checks
NB. If critical, just output the message array, else do the 4 tests, and execute mes2 on their running and (meaning count the number of uninterrupted trues)
echo mes2@(+/)@(*./\)@(check"0)@(65536%4%:[:r 255%])`mess@.crit a

Тут версія для гольфу

NB. Golfed verion
echo(m#~3(<.,<)])@(+/)@(*./\)@(>"0[:?(4$2^16)"_)@(65536%4%:[:r 255%])`(m=:2 7$'*shake*Click! '"_)@.(>2r5*[:?11^~2:)(r=:<.&.(*&4096))(1-3%~2*%/3 0{co)**/1 2 4{co=:(,1 2.5{.~(5-$));(".`(4 255 3 8 1 1.5 1.5 2 3 3.5 4 5 #~((=*./@:+.' '=])"1)&('MMLLPGSUNDFQ',.12{.'oauo')@(2&{.)))@.(_=_&".);._2,&','stdin''

6

PYTHON 249 байт - 75 за бонуси = 174

Моя перша спробу гольфу в історії.

import sys,random
y=sys.argv
d,b,f={10:1,1:1.5,15:2,7:1.5,13:255,-2:3.5,6:3,8:3,0:4,11:5},3*int(y[1]),"*shake*\n"
s=lambda:random.random()*(255*b)**.25<65536*((b-2)*int(y[3])*d[ord(y[2][0])-70]*2.5)**.25
if s():print f*3+"Click!" if s()and s()else f

Бонус за включення вибраних кульок: Safari, Sport, Lure, Net, Sumk, Dive, Fast, Quick

Даючи мені 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 бонусних балів

[редагувати] Округлюйте до 12 дробових розрядів кожного разу, коли розділення використовується, не використовуючи його

[редагувати2] оптимізувати словник покеба


Я думаю, що ви використовуєте точку вище 1/4096 (питання питання Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor

Ви, напевно, праві, я не зовсім зрозумів цю частину, і інші відповіді, здавалося, робили це так само, як і я. Я думаю, мені потрібно зробити щось подібне: r < 65536/(255/a)^(0.25) <=> r*255^(0.25)/a^(0.25) < 65536 <=> r*255^(0.25) < 65536*a^(0.25)щоб виключити всі підрозділи?
teinorsteinn

1/4096 означає 12 дробових бітів. Погляньте на моє рішення; Більш прямий підхід був би таким, floor(x*4096)*4096як ви округлили б, наприклад, до десяткових знаків.
TheConstructor

Ой, бачу, дякую. Це, мабуть, стосуватиметься і множення, як, здається, ви це зробили, але оскільки це не зазначено в правилах, я не буду про це турбуватися. :)
teinorsteinn

Так, ймовірно, вони використовують арифметику з фіксованою точкою. Але ОП попросили лише круглий поділ.
Конструктор

6

Perl 1 (374 - 150 = 224 + відсутнє число байтів)

sub h{print "*shake*
";}($x,$h,$_,$c,$s)=split(/,/,<>);$G=$$%(/P/?256:/U/?151:201);$S=$G-($s==1?0:$s==1.5?12:25);
$F=255&int(int($h*255/(/G|S/?8:12))/(int($x/4)||1));sub c{for($i=0;$i<3;$i++){do h();}print "Click!
";exit;}
/M/||$S<0||$S<$c&&$F>$$*$$%255&&do c();$W=int(int($c*100/(/P/?255:/U/?150:200))*$F/255)+($s==1?0:$s==1.5?5:10);$W>9&&do h();$W>29&&do h();$W>69&&do h();

Список аргументів:

current hp, max hp, pokéball, catch rate, status, critical capture

Так, я знаю, що це цілком порушує правила, але мені все одно. Якщо ви цього не помітили, це перший алгоритм захоплення покемонів покоління з усіма його химерностями (Великі кулі в певних умовах кращі за Ультра кулі). Це реалізує всі функції, включаючи ті, які не включені (і я все-таки вирішив включити для них бали). Критичні зйомки ігноруються (але вони реалізовані - просто так, що вони не впливають на швидкість захоплення), новіші кулі Poké завантажують дані інших куль Poké.

Зауважте, що ця відповідь коротка, але вона порушує всі правила, тому вважайте це просто цікавою відповіддю, але не приймайте її. Я спочатку збирався реалізувати алгоритм 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.


5

PHP (746 763 байти - всі бонуси):

<?if(!$i=fgets(STDIN))die('');parse_str($i,$i);$b=array('poke'=>1,'great'=>1.5,'ultra'=>2,'master'=>255,'safari'=>1.5,'sport'=>1.5,'lure'=>3,'net'=>3,'dusk'=>3.5,'dive'=>3.5,'moon'=>4,'fast'=>4,'quick'=>5,'love'=>8);$s=array('sleep'=>2.5,'frozen'=>2.5,'paralyzed'=>1.5,'poisoned'=>1.5,'burnt'=>1.5,''=>1);$i=array_merge(array('ball'=>'poke','hp'=>array('max'=>25,'current'=>1),'status'=>2.5,'rate'=>255),$i);$l='strtolower';$r='mt_rand';$x='*shake*'.PHP_EOL;$c='Click!'.PHP_EOL;$a=(((3*$i[hp][max])-(2*$i[hp][current]))*$i[rate]*$b[$l($i[ball])])/(3*$i[hp][max])*(is_numeric($i[status])?$i[status]:$s[$l($i[status])]);$a=((pow(65536/(255/$a),0.25)*4096)<<0)/4096;if($r(0,1)>$a)die();echo$x;if($a>1)die($c);if($r(0,1)>$a)die();echo$x,$x;if($r(0,1)>$a)die();echo$c;

Щоб скористатись цим, ви повинні надати вхід як "м'яч = ткнути & статус = сон" на STDIN.

HP має бути надано як "hp [max]" або "hp [current]".

Цей код працює, як перевірено тут .

Ви можете надати статус за своїм ім'ям або множником. ( не вимагається у питанні ).

Ось прочитана версія:

if(!$info=fgets(STDIN))die('');
parse_str($info,$info);
$balls=array(//list of pokeballs
    'poke'=>1,
    'great'=>1.5,
    'ultra'=>2,
    'master'=>255,
    'safari'=>1.5,
    'sport'=>1.5,
    'lure'=>3,
    'net'=>3,
    'dusk'=>3.5,
    'dive'=>3.5,
    'moon'=>4,
    'fast'=>4,
    'quick'=>5,
    'love'=>8
);
$status=array(//list of status
    'sleep'=>2.5,
    'frozen'=>2.5,
    'paralyzed'=>1.5,
    'poisoned'=>1.5,
    'burnt'=>1.5,
    ''=>1 //in case there is no status
);
$info=array_merge(//this will set the default values
    array(
        'ball'=>'poke',
        'hp'=>array('max'=>25,'current'=>1),
        'status'=>2.5,
        'rate'=>255
    ),
    $info
);
$a=(((3*$info['hp']['max'])-(2*$info['hp']['current']))*$info['rate']*$balls[strtolower($info['ball'])])/(3*$info['hp']['max'])*(is_numeric($info['status'])?$info['status']:$status[strtolower($info['status'])]);
$a=((pow(65536/(255/$a),0.25)*4096)<<0)/4096;//same as $a=floor(pow(65536/(255/$a),0.25)*4096)/4096;

if(mt_rand(0,1)>$a) die();//test 1
echo '*shake*',PHP_EOL;
if($a>1)die('Click!'.PHP_EOL);//if $a>1, catch it (critical catch)

if(mt_rand(0,1)>$a) die();//test 2
echo'*shake*',PHP_EOL,'*shake*',PHP_EOL;

if(mt_rand(0,1)>$a) die();//test 3
echo 'Click!',PHP_EOL;//passed all tests

Мені довелося це відредагувати, оскільки я використовував набагато більшу точність, ніж потрібно.

Виправлення надав TheConstructor .


Я думаю , що ви використовуєте Precission вище , ніж 1/4096 (питання стану Примітка: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor

І ти маєш рацію. Я помітив, що використовую будь-яке значення, що випливає з поділу. Якщо ви хочете, ви можете надати мені допомогу, тому що я не маю проклятого уявлення про те, як "круглити" з меншою точністю в PHP.
Ісмаїл Мігель

Ви можете зробити floor(x*4096)/4096або застосувати поділ з фіксованою точкою, як я.
TheConstructor

Дякую за твою допомогу. Я б ніколи про це не думав. Я виправив свою відповідь.
Ісмаїл Мігель

3

Ява, 611

import java.util.*;class P{enum B{DI(35),DU(35),FA(40),GR(15),LO(80),LU(30),MA(2550),MO(40),NE(30),PO(10),QU(50),SA(15),SP(15),UL(20);long v;B(int i){v=((long)i<<12)/(long)10;}}public static void main(String[]y){Scanner s=new Scanner(System.in);B b=B.valueOf(s.next().toUpperCase().substring(0,2));long c=(long)(s.nextDouble()*4096);long m=s.nextLong()<<12;long h=(s.hasNextInt()?s.nextLong():1)<<12;long S=(long)((s.hasNextDouble()?s.nextDouble():2.5)*4096);long p=(65536L<<12)/(long)(Math.sqrt(Math.sqrt((255L<<24)/((((3L*m-2L*h)*c>>12)*b.v>>12<<12)/(3L*m)*S>>12)))*512);Random r=new Random();System.out.print(r.nextInt(65536)<p?"*shake*\n"+(r.nextInt(65536)<p?"*shake*\n*shake*\n"+(r.nextInt(65536)<p?"Click!\n":""):""):"");}}

Оцінка:

  • 729 байт
  • -93 всі кулі
  • -25 необов’язкові current_hp та bonus_state

=> 611

Програма використовує арифметику з фіксованою точкою з 12 дробовими розрядами ( 1/4096це значення самого правого біта). Оскільки Java зазвичай не використовує фіксовану точку, всередині коду є досить певні зрушення для досягнення очікуваних результатів. Дивіться довгу версію щодо використовуваних арифметичних функцій, які були накреслені для цілей гольфу.

Хоча більшість обчислень могло бути зроблено на intзначеннях, підрозділи працюють краще з longs, оскільки вам потрібно змістити дивіденд ще на 12 біт вліво, щоб зберегти потрібну точність (інакше ви втратите всі дроби-дроби).

Зразок введення ( ;потрібен лише у випадку інтерактивного запуску, тобто STDIN не отримав EOF): Ball, catch_rate, max_hp

Poke 15 255 ;

Вибірка зразка:

*shake*

Зразок введення: Бал, catch_rate, max_hp, current_hp, bonus_state

Moon 42 255 50 1.5

Вибірка зразка:

*shake*
*shake*
*shake*
Click!
import java.math.BigDecimal;
import java.util.Random;
import java.util.Scanner;

class Pokeball {
    static long shift(long i) {
        return i << 12;
    }
    enum B {
        DI(35),DU(35),FA(40),GR(15),LO(80),LU(30),MA(2550),MO(40),NE(30),PO(10),QU(50),SA(15),SP(15),UL(20);
        long v;
        B(int i) {
            v = semiFixedDivision(shift(i),10);
        }
    }

    public static void main(String[] args) {
        final Scanner s = new Scanner(System.in);
        B b = B.valueOf(s.next().toUpperCase().substring(0, 2));
        long catchRate = (long) (s.nextDouble() * 4096);
        long maxHp = shift(s.nextLong());
        long currentHp = shift(s.hasNextInt()?s.nextInt():1);
        long statusBonus = (long) ((s.hasNextDouble()?s.nextDouble():2.5) * 4096);
        long a = fixedMultiplication(fixedDivision(fixedMultiplication(fixedMultiplication(
                semiFixedMultiplication(3, maxHp) - semiFixedMultiplication(2, currentHp), catchRate), b.v),
                                                   semiFixedMultiplication(3, maxHp)), statusBonus);
        println("a=",a);
        long x = fixedFourthRoot(fixedDivision(shift(255), a));
        println("x=",x);
        println("x^4=",fixedMultiplication(fixedMultiplication(x,x), fixedMultiplication(x,x)));
        long p = semiFixedDivision(shift(65536), fixedFourthRoot(fixedDivision(shift(255), a)));
        Random r = new Random();
        System.out.print(r.nextInt(65536) < p ?
                         "*shake*\n" + (r.nextInt(65536) < p ?
                                        "*shake*\n*shake*\n" + (r.nextInt(65536) < p ?
                                                                "Click!\n" :
                                                                "") :
                                        "") :
                         "");
    }

    private static long unshift(long p) {
        return p >> 12;
    }

    private static void println(String s, long v) {
        System.out.print(s);
        println(v);
    }

    private static void println(long v) {
        System.out.printf("%s%n", BigDecimal.valueOf(v).divide(BigDecimal.valueOf(4096)));
    }

    /**
     * Calculates division of {@code a/b} with both number last 12 bits treated as being "right of the dot"
     */
    static long fixedDivision(long a, long b) {
        return (a<<12)/b;
    }

    /**
     * Calculates division of {@code a/b} with {@code a}'s last 12 bits treated as being "right of the dot"
     */
    static long semiFixedDivision(long a, long b) {
        return a/b;
    }
    static long fixedMultiplication(long a, long b) {
        return (a*b) >> 12;
    }
    static long semiFixedMultiplication(long a, long b) {
        return a*b;
    }
    static long fixedFourthRoot(long a) {
        return (long)(Math.sqrt(Math.sqrt(a)) * 512);
    }
}

1

CoffeeScript - 317 313 310 307 306 294 270 250 242 байт

342 - 25 (параметри) - 75 (12 балів) = 242

_=process.stdin
l=console.log
m=Math
s=m.sqrt
t=['*shake*','Click!']
n=65536
_.resume()
_.setEncoding 'utf8'
_.on 'data',(d)=>
 [A,B,C,E,F]=d.match /\w+/g;E||=1;F||=2.5;i=0;while i++<3
  if n*(s s (3*A-2*E)*B*{P:1,G:1.5,U:2,M:255,S:1.5,L:3,N:3,D:3.5,F:4,Q:5}[C.charAt 0]*F)<m.floor(m.random()*n)*s s 765*A
   break
  l t[0]
 if i>2
  l t[i-3]

Очікує введення HP_max,Rate,Ball[,HP_current[,status]]. Не підтримує Moonабо Loveкулі.

Це перше, що я коли-небудь гольфував, це не регулярний вираз, тому, можливо, є можливість для вдосконалення. Я безсоромно копіював ідею зберігати лише часткові назви балів. ;) Підтримувати інші два кулі просто не варто, навіть не маючи додаткових +7 для отримання всіх бонусів.

Безгольова версія

Ця версія не містить усіх коротких псевдонімів, які я визначаю на початку, але визначає пошук кулі окремо.

balls =
  P: 1
  G: 1.5
  U: 2
  M: 255
  S: 1.5
  L: 3
  N: 3
  D: 3.5
  F: 4
  Q: 5

messages = ['*shake*', 'Click!']

process.stdin.resume()
process.stdin.setEncoding 'utf8'
process.stdin.on 'data', (data) =>
  [HP_max, rate, ball, HP_current, status] = data.match /\w+/g
  HP_current ||= 1
  HP_status ||= 2.5
  i = 0
  while i++ < 3
    if 65536 * (Math.sqrt Math.sqrt (3*HP_max - 2*HP_current)*rate*status*balls[ball.charAt 0]) < Math.floor(Math.random()*65536) * Math.sqrt Math.sqrt 765*HP_max
      break
    console.log messages[0]
  if i > 2
    console.log messages[i-3]

Примітка до формули ймовірності: я переставив повну формулу (з виписаною a), щоб не було поділів, і я обчислюю (...)^(1/4), взявши квадратний корінь двічі.


1
Схоже, що превенція на вашому боці, p-=p%1/4096здається, Oo справді працює. (Ви здогадалися б, що вам потрібно хоча б написати, p-=p%(1/4096)і тоді я все ще не буду впевнений, що модуль реалізований для дробів з обох сторін. Добре!
TheConstructor

@TheConstructor Ха-ха, так, я насправді повинен був це перевірити ... мені це виглядало і дуже дивно, але %можна використовувати для деяких кумедних речей в JS. Після перечитання питання, я думаю, що ця відповідь не зовсім відповідає вимозі округлення. Я думаю, округлення слід застосовувати після кожного поділу. Можливо, мені доведеться трохи переструктурувати свій розрахунок. ^^
Мартін Ендер

Так, напевно, ще гарна ідея
TheConstructor

@TheConstructor Насправді мені потрібно писати p%(1/4096). Я навіть перевіряв це перед публікацією, але якось неправильно запам’ятав результат свого тесту.
Мартін Ендер

Пробували в Chrome; працював без (), але, можливо, не завжди чи не у всіх браузерах ...
TheConstructor

0

Оновлення: (C #)

Кількість байтів: 3600

Критичний: -25

Всі кульки-трюки: -91


Всього = 3,484

[гольф]

using System;using System.Text;using System.Security.Cryptography;using System.Linq;namespace Pokemon{public class MainClass{private string[] c(string[] i){if(i.Length <= 3){var v1 =i[0][0];var v2 =i[1][0];var v3 =i[2][0];if(v1>='0'&&v1<='9'&&v2>='a'&&v2<='z'&&v3>='0'&&v3<='9')return new string[]{i[0],i[2],i[1]};else if(v1>='0'&&v1<='9'&&v2>='0'&&v2<='9'&&v3>='a'&&v3<='z')return new string[]{i[0],i[1],i[2]};else if(v1>='a'&&v1<='z'&&v2>='0'&&v2<='9'&&v3>='0'&&v3<='9')return new string[]{i[1],i[2],i[0]};else return null;}else return null;}private static void Main(string[] args){while(true){Console.Clear();MainClass _c = new MainClass();Console.Write("Inputs'please:");var i = Console.ReadLine().ToLower();string[] r = _c.c((string[])(i.Split(new Char[]{' ','.',',','\n','\t','!','@','#','$','%','^','&','&','*','(',')','-','_','+','=','?','/','\\'},StringSplitOptions.RemoveEmptyEntries).Select(p=>p.Trim()).ToList()).ToArray());new w("Processing...\n");if(r== null)new w("Too many errors");else new m(r);}}}public class w{public w(string l){Console.WriteLine(l);}}public class m{public m(string[] v){switch (v[2].Substring(0,2)){case "po":c(v[0],v[1],"1");break;case "ul":c(v[0],v[1],"2");break;case "ma":c(v[0],v[1],"255");break;case "gr":case "sa":case "sp":c(v[0],v[1],"1.5");break;case "lu":case "ne":c(v[0],v[1],"3");break;case "du":case "di":c(v[0],v[1],"3.5");break;case "mo":case "fa":c(v[0],v[1],"4");break;case "qu":c(v[0],v[1],"5");break;case "lo":c(v[0],v[1],"8");break;default:new w("Not supported");break;}}private double y(double v){return Convert.ToDouble(((double)1/(double)4096)*(v/Convert.ToDouble(1/4096)-(v%Convert.ToDouble(1/4096))));}private bool i(double v,double r,double b){if(((double)new Random().Next(0,(int)r))>b*v)return true;else return false;}private double f(double r, double h, double b){return 2.5*y((((3.0*h)-2.0)*r*b)/(3.0*h));}private void c(params string[] v){var s =0.0;var x =0;if(int.Parse(v[1])>100&&int.Parse(v[1])<= 255){s =f(double.Parse(v[0]),double.Parse(v[1]),double.Parse(v[2]));x=0;}else if(int.Parse(v[0])>100&&int.Parse(v[0])<= 255){s =f(double.Parse(v[1]),double.Parse(v[0]),double.Parse(v[2]));x=1;}else{new w(String.Format("Which number is the Max HP? :{0} or {1}:",v[0],v[1]));var c_ = int.Parse(Console.ReadLine());s =f((double.Parse(v[0])+double.Parse(v[1]))-double.Parse(v[c_]),double.Parse(v[c_]),double.Parse(v[2]));x=2;}if(((double)new Random().Next(0, 2047))<s*2.5)new w("*shake*\nClick!");else{for(int c_= 0;c_<3;c_++){new w("*shake*");var r =Math.Pow(65536.0/y(255.0/s),0.25);if(i(r,double.Parse(v[x]),2.5)==true){new w("Click!");break;}else;}}Console.ReadKey();}}}

[звичайний]

using System;
using System.Text;
using System.Security.Cryptography;
using System.Linq;

namespace Pokemon
{
    public class MainClass
    {
        private string[] c(string[] i)
        {
            if (i.Length <= 3)
            {
                var v1 =i[0][0];
                var v2 =i[1][0];
                var v3 =i[2][0];
                if(v1>='0'&&v1<='9'&&v2>='a'&&v2<='z'&&v3>='0'&&v3<='9')return new string[]{i[0],i[2],i[1]};
                else if(v1>='0'&&v1<='9'&&v2>='0'&&v2<='9'&&v3>='a'&&v3<='z')return new string[]{i[0],i[1],i[2]};
                else if(v1>='a'&&v1<='z'&&v2>='0'&&v2<='9'&&v3>='0'&&v3<='9')return new string[]{i[1],i[2],i[0]};
                else return null;
            }
            else return null;
        }

        private static void Main(string[] args)
        {
            while(true)
            {
                Console.Clear();
                MainClass _c = new MainClass();
                Console.Write("Inputs'please:");
                var i = Console.ReadLine().ToLower();
                string[] r = _c.c((string[])(i.Split(new Char[]{' ','.',',','\n','\t','!','@','#','$','%','^','&','&','*','(',')','-','_','+','=','?','/','\\'},StringSplitOptions.RemoveEmptyEntries).Select(p=>p.Trim()).ToList()).ToArray());
                new w("Processing...\n");
                if(r== null)new w("Too many errors");
                else new m(r);
            }
        }
    }

    public class w
    {
        public w(string l)
        {
            Console.WriteLine(l);
        }
    }

    public class m
    {
        public m(string[] v)
        {
            switch (v[2].Substring(0,2))
            {
                case "po":
                    c(v[0],v[1],"1");
                    break;
                case "ul":
                    c(v[0],v[1],"2");
                    break;
                case "ma":
                    c(v[0],v[1],"255");
                    break;
                case "gr":
                case "sa":
                case "sp":
                    c(v[0],v[1],"1.5");
                    break;
                case "lu":
                case "ne":
                    c(v[0],v[1],"3");
                    break;
                case "du":
                case "di":
                    c(v[0],v[1],"3.5");
                    break;
                case "mo":
                case "fa":
                    c(v[0],v[1],"4");
                    break;
                case "qu":
                    c(v[0],v[1],"5");
                    break;
                case "lo":
                    c(v[0],v[1],"8");
                    break;
                default:
                    new w("Not supported");
                    break;
            }
        }

        private double y(double v){return Convert.ToDouble(((double)1/(double)4096)*(v/Convert.ToDouble(1/4096)-(v%Convert.ToDouble(1/4096))));}

        private bool i(double v,double r,double b){if(((double)new Random().Next(0,(int)r))>b*v)return true;else return false;}

        private double f(double r, double h, double b){return 2.5*y((((3.0*h)-2.0)*r*b)/(3.0*h));}

        private void c(params string[] v)
        {
            var s =0.0;
            var x =0;
            if(int.Parse(v[1])>100&&int.Parse(v[1])<= 255){s =f(double.Parse(v[0]),double.Parse(v[1]),double.Parse(v[2]));x=0;}
            else if(int.Parse(v[0])>100&&int.Parse(v[0])<= 255){s =f(double.Parse(v[1]),double.Parse(v[0]),double.Parse(v[2]));x=1;}
            else
            {
                new w(String.Format("Which number is the Max HP? :{0} or {1}:",v[0],v[1]));
                var c_ = int.Parse(Console.ReadLine());
                s =f((double.Parse(v[0])+double.Parse(v[1]))-double.Parse(v[c_]),double.Parse(v[c_]),double.Parse(v[2]));
                x=2;
            }
            if (((double)new Random().Next(0, 2047))<s*2.5)new w("*shake*\nClick!");
            else
            {
                for(int c_= 0;c_<3;c_++)
                {
                    new w("*shake*");
                    var r =Math.Pow(65536.0/y(255.0/s),0.25);
                    if (i(r,double.Parse(v[x]),2.5)==true){new w("Click!");break;}else;
                }
            }
            Console.ReadKey();
        }    
      }
  }

Це кодовий гольф. Слід зменшити свою відповідь (наприклад: зачистка пробілів). Ви все ще можете надати поточну відповідь як читабельну версію.
Ісмаїл Мігель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.