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_status
sempre 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)
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?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 < p
meio a verificação é bem sucedido comrnd
no intervalo de 0 e 1.65536 / (255 / a)^(1/4)
, em seguida, se o número aleatório é menos o teste de agitação sucedidoRespostas:
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.
Aqui a versão golfada
fonte
PYTHON 249 bytes - 75 para bônus = 174
Minha primeira tentativa de golfe.
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
fonte
Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.
)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?floor(x*4096)*4096
exatamente como você arredondaria para baixo, por exemplo, casas decimais.Perl 1 (374 - 150 = 224 + bytes ausentes)
Lista de argumentos:
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.fonte
PHP (
746763 bytes - todos os bônus):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:
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 .
fonte
Whenever any division is performed, the result is rounded down to a multiple of 1/4096.
)floor(x*4096)/4096
ou implementar a divisão de ponto fixo como eu fiz.Java, 611
Ponto:
=> 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
int
valores, as divisões funcionam melhor comlong
s, 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_hpSaída de amostra:
Exemplo de entrada: Ball, catch_rate, max_hp, current_hp, bonus_state
Saída de amostra:
fonte
CoffeeScript -
317313310307306294270250242 bytes342 - 25 (parâmetros) - 75 (12 bolas) = 242
Espera entrada
HP_max,Rate,Ball[,HP_current[,status]]
. Não suportaMoon
ouLove
bolas.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.
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.fonte
p-=p%1/4096
realmente parece funcionar. (Teria imaginado que seria de pelo menos necessidade de escreverp-=p%(1/4096)
e depois eu ainda não estaria certo módulo é implementado para as frações de ambos os lados Nice.!%
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. ^^p%(1/4096)
. Até chequei isso antes de postar, mas de alguma forma lembrei o resultado do meu teste errado.Atualização: (C #)
Contagem de bytes: 3.600
Critcal: -25
Todas as bolas de puxão: -91
Total = 3.484
[jogou golfe]
[regular]
fonte