Pokeball Simulator

26

Nos videogames Pokemon, o jogador é enviado ao mundo para forçar animais selvagens em pequenas bolas e treiná-los para lutar. Claro, todo mundo sabe que ninguém joga Pokemon para a batalha. O verdadeiro atrativo da série é o pokemon se capturando! Seu trabalho é simular a pokeball durante uma tentativa de captura. Esse desafio usará a fórmula de captura da geração V, que é a seguinte:

a = (((3 * HP_max - 2 * HP_current) * taxa * bonus_ball) / 3 * HP_max) * bonus_status

HP_maxé igual ao HP máximo do pokemon alvo. HP_currenté igual ao HP atual do pokemon alvo. rateé a taxa de captura do pokemon, bonus_ballé o multiplicador da bola lançada e bonus_statusé 2,5 se o pokemon alvo estiver adormecido ou congelado, 1,5 se o pokemon alvo estiver paralisado, envenenado ou queimado e 1 caso contrário.

Depois de encontrar a, você deve executar até três "verificações de vibração". A probabilidade de uma verificação de vibração é bem-sucedida 65536 / (255 / a)^(1/4). Se qualquer uma dessas verificações falhar, o pokemon escapa da bola. Se todas as três verificações forem bem-sucedidas, o pokemon será capturado!

Nota: Sempre que qualquer divisão é executada, o resultado é arredondado para um múltiplo de 1/4096. Geralmente, esse é um detalhe insignificante, mas deve ser considerado no seu programa.

Seu desafio é escrever um programa que execute as verificações de agitação e imprima para mostrar o status das verificações. No stdin, seu programa receberá (pelo menos, detalhes abaixo) o HP máximo do pokemon, a taxa de captura do pokemon alvo e o nome da pokeball. O HP máximo e a taxa de captura são garantidos como inteiros, enquanto o nome da pokeball é sempre uma string. Esta entrada pode vir em qualquer ordem e com qualquer caractere delimitante, é conveniente para você, desde que seja consistente. Suponha que a entrada esteja correta, nenhuma manipulação de erros é necessária.

Os nomes das pokeballs que você precisa apoiar e seus multiplicadores de captura estão listados aqui:

  Poke | 1
 Great | 1.5
 Ultra | 2
Master | 255

Você pode assumir que o alvo está adormecido e com 1 HP. O formato esperado para a saída é este:

(First check failed)
(no output)

(Second check failed)
*shake*

(Third check failed)
*shake*
*shake*
*shake*

(All checks pass)
*shake*
*shake*
*shake*
Click!

(Isso não é um erro de digitação, seu programa nunca deve produzir apenas dois shakes.)

Isso é , então sua pontuação é a contagem de bytes do código-fonte do seu programa. Menor pontuação ganha.

Bônus!

Eu disse que você pode assumir que o pokemon está com 1 HP e está dormindo. Como alternativa, você pode permitir que o usuário insira o HP e o pokemon atuais bonus_status. O HP atual do pokemon sempre será um número inteiro igual ou menor que o HP máximo e bonus_statussempre será 2,5, 1,5 ou 1. Se o fizer, você deve ter esses valores no final da entrada e usar como padrão 1 e 2.5 se não forem fornecidos. Você pode subtrair 15 pontos da sua pontuação para implementar um desses, ou 25 para ambos.

Além disso, você pode implementar capturas críticas. Se ocorrer uma captura crítica, apenas um teste de trepidação é realizado. Se falhar, o programa sai silenciosamente. Se aprovado, gera:

*shake*
Click!

Capturas críticas se tornam mais comuns à medida que o jogador coleta mais pokemon, mas por uma questão de simplicidade, podemos assumir que eles já os "pegaram em todos". Se um número gerado aleatoriamente entre 0 e 2047 for menor que a(o resultado do primeiro cálculo) multiplicado por 2,5, é uma captura crítica. O suporte para capturas críticas permite remover 25 pontos da sua pontuação.

Existem várias outras pokeballs que você pode escolher apoiar. Seus nomes e multiplicadores de capturas estão listados aqui:

Safari | 1.5
 Sport | 1.5
  Lure | 3
   Net | 3
  Dusk | 3.5
  Dive | 3.5
  Moon | 4
  Fast | 4
 Quick | 5
  Love | 8

Para cada uma dessas bolas às quais você adiciona suporte, você pode subtrair (5 + o comprimento do nome da bola) da sua pontuação.

Finalmente, nos chutes, alcançar todos esses bônus (HP atual e status de bônus de stdin, capturas críticas e todas as 10 bolas opcionais) renderá uma recompensa adicional de 7 pontos removidos da sua pontuação, para um bônus total de até 150 .

Exemplo de entrada / saída

Apenas para garantir que estamos todos na mesma página.

$ ./balls <<< "19,Ultra,255"
*shake*
*shake*
*shake*
Click!

Boa sorte e feliz golfe!

undergroundmonorail
fonte
Atualmente, não posso julgar qual a probabilidade que você dá, 65536 / (255 / a)^(1/4)mas minha coragem diz que é maior que 1. Você confere um número aleatório no intervalo de 0 a 65536? A verificação é bem-sucedida se o número aleatório for maior ou se for menor?
TheConstructor
Se 65536 / (255 / a)^(1/4)for maior que 1, a verificação será bem-sucedida automaticamente. Não sei o que você quer dizer com a segunda pergunta.
Undergroundmonorail
Então rnd < pmeio a verificação é bem sucedido com rndno intervalo de 0 e 1.
TheConstructor
1
@IsmaelMiguel ver meus comentários: você gerar um número aleatório no intervalo de 0 a 1 e compará-la com 65536 / (255 / a)^(1/4), em seguida, se o número aleatório é menos o teste de agitação sucedido
TheConstructor
1
Como indicado no texto, o tipo textual de pokeball, max hp e taxa de captura são passados ​​como entrada para o seu programa. Opcionalmente, você pode pedir para hp atual (padrão 1) ou bônus de status (padrão 2.5)
TheConstructor

Respostas:

3

J 301-150 = 151

Para esportes, todos os bônus foram implementados, embora eu provavelmente fosse melhor não :). Logo expliquei as coisas abaixo, mas essa é longa demais para ser explicada em detalhes, a menos que alguém solicite explicitamente. Ele implementa todas as bolas, capturas críticas e entradas opcionais.

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%])`[email protected] a

Aqui a versão golfada

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
fonte
6

PYTHON 249 bytes - 75 para bônus = 174

Minha primeira tentativa de golfe.

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

Bônus por incluir bolas selecionadas: Safari, Esporte, Isca, Rede, Crepúsculo, Mergulho, Rápido, Rápido

Dando-me 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 pontos de bônus

[edit] Arredonde para 12 bits fracionários toda vez que a divisão do tempo for usada por não usá-la

otimizar dicionário pokeball

Þorsteinn
fonte
Eu acho que você está usando um maior precission do que 1/4096 (pergunta estados Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor
Você provavelmente está certo, eu não entendi direito essa parte e as outras respostas pareciam fazer da mesma maneira que eu. Acho que preciso fazer algo assim: r < 65536/(255/a)^(0.25) <=> r*255^(0.25)/a^(0.25) < 65536 <=> r*255^(0.25) < 65536*a^(0.25)excluir todas as divisões?
precisa
1/4096 significa 12 bits fracionários. Dê uma olhada na minha solução; uma abordagem mais direta seria floor(x*4096)*4096exatamente como você arredondaria para baixo, por exemplo, casas decimais.
TheConstructor
Ohh entendo obrigado. Isso provavelmente também deve se aplicar à multiplicação, como você parece ter feito, mas como isso não está estabelecido nas regras, não vou me preocupar com isso. :) #
11333
Sim, provavelmente eles usam aritmética de ponto fixo. Mas a OP pediu apenas para arredondar a divisão.
TheConstructor
6

Perl 1 (374 - 150 = 224 + bytes ausentes)

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();

Lista de argumentos:

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

Sim, sei que isso quebra completamente as regras, mas não me importo. Caso você não tenha notado, este é o primeiro algoritmo de captura da geração Pokémon, com todas as suas peculiaridades (Great Balls é melhor que Ultra Balls, em determinadas condições). Isso implementa todos os recursos, incluindo os que não estão incluídos (e eu decidi incluir pontos para eles de qualquer maneira). Capturas críticas são ignoradas (mas são implementadas - apenas que elas não afetam a taxa de captura), as Pokébolas mais recentes carregam dados de outras Pokébolas.

Observe que, embora essa resposta seja curta, ela quebra todas as regras; portanto, considere apenas uma resposta divertida, não a aceite. Inicialmente eu ia implementar o algoritmo Gen5 no Perl 5, mas decidi - por que não se divertir? E sim, eu realmente compilei o Perl 1, e esse código funciona. Se você executá-lo na versão mais recente do Perl, poderá receber avisos sobre o uso descontinuado do, mas vamos ser honestos - é a única maneira de executar funções no Perl 1. O Perl 1 também possui algumas peculiaridades (por exemplo, não posso mova a linha começando com /M/a linha anterior - por quê? - não sei).

Além disso, não há números aleatórios no Perl 1, então espero que você não me mate pelo módulo de $$. É a coisa mais próxima do número aleatório que eu poderia ter encontrado.

Edit: Parece que a do call()sintaxe antiga foi removida no Perl 5.19.8. Certifique-se de usar uma versão mais antiga do Perl para executar esse script, pois parece que o Perl 5.20 não será compatível com os scripts do Perl 1.

Konrad Borowski
fonte
5

PHP (746 763 bytes - todos os bônus):

<?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;

Para usar isso, você deve fornecer a entrada como 'ball = poke & status = sleep' no STDIN.

O HP deve ser fornecido como 'hp [max]' ou 'hp [current]'.

Este código funciona, conforme testado aqui .

Você pode fornecer o status pelo nome ou pelo multiplicador. ( não é obrigatório na pergunta ).

Aqui está uma versão legível:

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

Eu tive que editar isso porque estava usando uma precisão muito maior do que a necessária.

A correção foi fornecida pelo TheConstructor .

Ismael Miguel
fonte
Eu acho que você está usando um precission maior que 1/4096 (questão afirma Nota: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor
E você está certo. Percebi que estou usando qualquer valor que venha da divisão. Se você quiser, pode me ajudar, porque não tenho a menor idéia de como arredondar para uma precisão menor em PHP.
Ismael Miguel
Você pode fazer floor(x*4096)/4096ou implementar a divisão de ponto fixo como eu fiz.
TheConstructor
Obrigado pela ajuda. Eu nunca pensaria nisso. Eu consertei minha resposta.
Ismael Miguel
3

Java, 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":""):""):"");}}

Ponto:

  • 729 bytes
  • -93 todas as bolas
  • -25 current_hp opcional e bonus_state

=> 611

O programa usa aritmética de ponto fixo com 12 bits de fração ( 1/4096é o valor do bit mais correto). Como o Java geralmente não usa ponto fixo, existem algumas mudanças no código para alcançar os resultados esperados. Veja a versão longa para as funções aritméticas usadas, que foram incorporadas para fins de golfe.

Embora a maioria dos cálculos possa ter sido feita sobre intvalores, as divisões funcionam melhor com longs, pois você precisa deslocar o dividendo por mais 12 bits para a esquerda para manter a precisão desejada (caso contrário, você perde todos os bits de fração).

Entrada de amostra ( ;só é necessária se for executada interativamente, ou seja, STDIN não recebeu EOF): Ball, catch_rate, max_hp

Poke 15 255 ;

Saída de amostra:

*shake*

Exemplo de entrada: Ball, catch_rate, max_hp, current_hp, bonus_state

Moon 42 255 50 1.5

Saída de amostra:

*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
fonte
1

CoffeeScript - 317 313 310 307 306 294 270 250 242 bytes

342 - 25 (parâmetros) - 75 (12 bolas) = 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]

Espera entrada HP_max,Rate,Ball[,HP_current[,status]]. Não suporta Moonou Lovebolas.

Esta é a primeira coisa que eu já joguei que não é uma regex, então provavelmente há espaço para melhorias. Copiei descaradamente a ideia de armazenar apenas nomes parciais de bolas. ;) Apoiar as outras duas bolas simplesmente não vale a pena, nem mesmo com os +7 adicionais para obter todos os bônus.

Versão ungolfed

Esta versão omite todos os apelidos curtos que eu defino no começo, mas define a pesquisa de bola separadamente.

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]

Uma observação sobre a fórmula da probabilidade: reorganizei a fórmula completa (com a escrita a) para que não haja divisões e estou computando (...)^(1/4)pegando a raiz quadrada duas vezes.

Martin Ender
fonte
1
Parece que a precedência está do seu lado. Oo p-=p%1/4096realmente parece funcionar. (Teria imaginado que seria de pelo menos necessidade de escrever p-=p%(1/4096)e depois eu ainda não estaria certo módulo é implementado para as frações de ambos os lados Nice.!
TheConstructor
@ TheConstructor Haha, sim, eu realmente tive que verificar isso ... parecia muito estranho para mim também, mas %pode ser usado para algumas coisas engraçadas em JS. Depois de reler a pergunta, acho que essa resposta não preenche completamente o requisito de arredondamento. Eu acho que o arredondamento deve ser aplicado após cada divisão. Talvez eu precise reestruturar um pouco meu cálculo. ^^
Martin Ender
Sim, provavelmente, ainda boa idéia
TheConstructor
@ TheConstructor Na verdade, preciso escrever p%(1/4096). Até chequei isso antes de postar, mas de alguma forma lembrei o resultado do meu teste errado.
Martin Ender
Tentei no Chrome; trabalhou sem (), mas talvez nem sempre ou não em todos os navegadores ...
TheConstructor
0

Atualização: (C #)

Contagem de bytes: 3.600

Critcal: -25

Todas as bolas de puxão: -91


Total = 3.484

[jogou golfe]

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();}}}

[regular]

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
fonte
Isso é código de golfe. Você deve reduzir sua resposta (por exemplo: remover espaços em branco). Você ainda pode fornecer a resposta atual como uma versão legível.
Ismael Miguel