Pokeball Simulator

26

В видеоиграх Pokemon, игрок отправляется в мир, чтобы заставить диких животных собирать крошечные шарики и обучать их сражаться. Конечно, все знают, что никто не играет в покемонов за сражение. Настоящая ничья в серии - это ловля покемонов! Ваша задача - симулировать покебол во время попытки захвата. Эта задача будет использовать формулу захвата V поколения, которая выглядит следующим образом:

a = (((3 * HP_max - 2 * HP_current) * скорость * bonus_ball) / 3 * HP_max) * bonus_status

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!

Удачи и счастливого гольфа!

undergroundmonorail
источник
В настоящее время я не могу судить, насколько велика вероятность того, что вы даете, так как 65536 / (255 / a)^(1/4)можете получить, но мои смелости говорят, что она больше 1. Вы проверяете случайное число в диапазоне от 0 до 65536? Успешна ли проверка, если случайное число больше или меньше?
TheConstructor
Если 65536 / (255 / a)^(1/4)больше 1, проверка автоматически завершается успешно. Я не уверен, что вы подразумеваете под вторым вопросом.
подземный
Это rnd < pозначает, что проверка прошла успешно rndв диапазоне от 0 до 1.
TheConstructor
1
@IsmaelMiguel смотрите мои комментарии: вы генерируете случайное число в диапазоне от 0 до 1 и сравниваете его с этим 65536 / (255 / a)^(1/4), тогда, если случайное число меньше, тест на встряхивание
прошел
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''
jpjacobs
источник
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, Dusk, Dive, Fast, Quick

Дай мне 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 бонусных очков

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

[edit2] оптимизировать словарь покебол

Торстейн
источник
Я думаю, что вы используете точность выше 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)исключить все подразделения?
teorsteinn
1/4096 означает 12 дробных бит. Посмотрите на мое решение; более прямой подход будет таким floor(x*4096)*4096же, как если бы вы округлились, например, до десятичных знаков.
TheConstructor
О, я вижу, спасибо. Это, вероятно, также должно относиться к умножению, как вы, кажется, сделали это, но так как это не указано в правилах, я не буду беспокоиться об этом. :)
Þorsteinn
Да, возможно, они используют арифметику с фиксированной точкой. Но ОП только попросили округлить деление.
TheConstructor
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é 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.

Конрад Боровски
источник
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;

Чтобы использовать это, вы должны предоставить вход как 'ball = poke & status = sleep' на 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*

Пример ввода: Ball, 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);
    }
}
TheConstructor
источник
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похоже, работает. ( p-=p%(1/4096)Я бы подумал, что вам, по крайней мере, нужно написать, и тогда я все равно не был бы уверен, что для дробей с обеих сторон реализован модуль.
Хорошо
@TheConstructor Хаха, да, я действительно должен был это проверить ... это тоже выглядело очень странно, но %может быть использовано для некоторых забавных вещей в JS. Перечитав вопрос, я думаю, что этот ответ не совсем соответствует требованию округления. Я думаю, что округление должно применяться после каждого деления. Возможно, мне придется немного перестроить мои расчеты. ^^
Мартин Эндер
Да, вероятно, все еще хорошая идея
TheConstructor
@TheConstructor На самом деле, мне нужно написать p%(1/4096). Я даже проверил это перед публикацией, но как-то запомнил результат моего теста неправильно.
Мартин Эндер
Попробовал в Chrome; работал без (), но, возможно, не всегда или не во всех браузерах ...
TheConstructor
0

Обновление: (C #)

Количество байт: 3600

Критический: -25

Все тычки: -91


Итого = 3484

[Golfed]

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();
        }    
      }
  }
gh0st
источник
Это код игры в гольф. Вы должны уменьшить свой ответ (например: удаление пробелов). Вы по-прежнему можете предоставить текущий ответ в виде читаемой версии.
Исмаэль Мигель