Dans les jeux vidéo Pokemon, le joueur est envoyé dans le monde pour forcer les animaux sauvages en minuscules boules et les entraîner à se battre. Bien sûr, tout le monde sait que personne ne joue à Pokemon pour le combat. Le vrai tirage de la série est le pokemon qui se rattrape! Votre travail consiste à simuler le pokeball lors d'une tentative de capture. Ce défi utilisera la formule de capture de génération V, qui est la suivante:

HP_maxest égal aux PV maximum du pokemon cible. HP_currentest égal aux PV actuels du pokemon cible. rateest le taux de capture du pokemon, bonus_ballest le multiplicateur du pokeball lancé et bonus_statusest de 2,5 si le pokemon cible est endormi ou gelé, 1,5 si le pokemon cible est paralysé, empoisonné ou brûlé, et 1 sinon.
Après avoir trouvé a, vous devez effectuer jusqu'à trois "contrôles d'agitation". La probabilité de réussite d'un test d'agitation est 65536 / (255 / a)^(1/4). Si l'un de ces contrôles échoue, le pokemon échappe à sa balle. Si les trois contrôles réussissent, le pokemon est pris!
Remarque: chaque fois qu'une division est effectuée, le résultat est arrondi à un multiple de 1/4096. Il s'agit généralement d'un détail insignifiant, mais il doit être pris en compte dans votre programme.
Votre défi consiste à écrire un programme qui exécute les vérifications de secousses et imprime pour afficher l'état des vérifications. Sur stdin, votre programme recevra (au moins, les détails ci-dessous) le HP maximum du pokemon, le taux de capture du pokemon cible et le nom du pokeball. Le HP maximum et le taux de capture sont tous deux garantis comme des entiers, tandis que le nom de la pokeball est toujours une chaîne. Cette entrée peut venir dans n'importe quel ordre et avec n'importe quel caractère de délimitation, cela vous convient, tant qu'elle est cohérente. Supposons que l'entrée est correcte, aucune gestion des erreurs n'est requise.
Les noms des pokeballs que vous devez prendre en charge et leurs multiplicateurs de capture sont répertoriés ici:
Poke | 1
Great | 1.5
Ultra | 2
Master | 255
Vous pouvez supposer que la cible est endormie et à 1 HP. Le format attendu pour la sortie est le suivant:
(First check failed)
(no output)
(Second check failed)
*shake*
(Third check failed)
*shake*
*shake*
*shake*
(All checks pass)
*shake*
*shake*
*shake*
Click!
(Ce n'est pas une faute de frappe, votre programme ne devrait jamais produire seulement deux secousses.)
Il s'agit de code-golf , donc votre score est le nombre d'octets du code source de votre programme. Le score le plus bas l'emporte.
Bonus!
J'ai dit que vous pouvez supposer que le pokemon est à 1 HP et endormi. Alternativement, vous pouvez autoriser l'utilisateur à saisir les HP et pokemon actuels bonus_status. Le HP actuel du pokemon sera toujours un entier égal ou inférieur à son HP maximum, et bonus_statussera toujours soit 2,5, 1,5 ou 1. Si vous le faites, vous devez avoir ces valeurs à la fin de votre entrée, et par défaut à 1 et 2.5 s'ils ne sont pas fournis. Vous pouvez soustraire 15 points de votre score pour la mise en œuvre de l'un d'entre eux, ou 25 pour les deux.
En outre, vous pouvez implémenter des captures critiques. Si une capture critique se produit, un seul test d'agitation est effectué. En cas d'échec, le programme se ferme silencieusement. S'il est réussi, il génère:
*shake*
Click!
Les captures critiques deviennent plus courantes à mesure que le joueur recueille plus de pokemon, mais pour des raisons de simplicité, nous pouvons supposer qu'ils les ont déjà "tous pris". Si un nombre généré de façon aléatoire entre 0 et 2047 est inférieur à a(le résultat du premier calcul) multiplié par 2,5, c'est une capture critique. La prise en charge des captures critiques vous permet de supprimer 25 points de votre score.
Il existe un certain nombre d'autres pokeballs que vous pouvez choisir de prendre en charge. Leurs noms et multiplicateurs de capture sont répertoriés ici:
Safari | 1.5
Sport | 1.5
Lure | 3
Net | 3
Dusk | 3.5
Dive | 3.5
Moon | 4
Fast | 4
Quick | 5
Love | 8
Pour chacune de ces balles pour lesquelles vous ajoutez un support, vous pouvez soustraire (5 + la longueur du nom de la balle) de votre score.
Enfin, pour les coups de pied, la réalisation de tous ces bonus (HP actuels et bonus_status de stdin, captures critiques et les 10 balles optionnelles) vous rapportera une récompense supplémentaire de 7 points retirés de votre score, pour un bonus total égal à 150 .
Exemple d'entrée / sortie
Juste pour nous assurer que nous sommes tous sur la même longueur d'onde.
$ ./balls <<< "19,Ultra,255"
*shake*
*shake*
*shake*
Click!
Bonne chance et bon golf!
65536 / (255 / a)^(1/4)est supérieur à 1, la vérification réussit automatiquement. Je ne sais pas ce que vous entendez par la deuxième question.
rnd < psignifie donc que le contrôle est réussi avec une rndplage de 0 et 1.
65536 / (255 / a)^(1/4), puis si le nombre aléatoire est inférieur, le test de secousse a réussi
65536 / (255 / a)^(1/4)mais mes tripes disent qu'elle est supérieure à 1. Comparez-vous avec un nombre aléatoire compris entre 0 et 65536? La vérification réussit-elle si le nombre aléatoire est plus grand ou plus bas?