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:

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 é código-golfe , 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!
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.
rnd < pmeio a verificação é bem sucedido com rndno intervalo de 0 e 1.
65536 / (255 / a)^(1/4), em seguida, se o número aleatório é menos o teste de agitação sucedido
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?