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_max
est égal aux PV maximum du pokemon cible. HP_current
est égal aux PV actuels du pokemon cible. rate
est le taux de capture du pokemon, bonus_ball
est le multiplicateur du pokeball lancé et bonus_status
est 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_status
sera 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)
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?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 < p
signifie donc que le contrôle est réussi avec unernd
plage de 0 et 1.65536 / (255 / a)^(1/4)
, puis si le nombre aléatoire est inférieur, le test de secousse a réussiRéponses:
J 301-150 = 151
Pour le sport, tous les bonus ont été mis en place, mais je ferais probablement mieux de ne pas le faire :). J'ai brièvement expliqué les choses ci-dessous, mais celui-ci est beaucoup trop long pour être expliqué en détail, sauf si quelqu'un le demande explicitement. Il implémente toutes les billes, les captures critiques et les entrées optionnelles.
Voici la version golfée
la source
PYTHON 249 octets - 75 pour les bonus = 174
Mon premier essai de golf.
Bonus pour inclure les balles sélectionnées: Safari, Sport, Lure, Net, Dusk, Dive, Fast, Quick
Me donnant 8 * 5 + 6 + 5 + 4 + 3 + 4 + 4 + 4 + 5 = 75 points bonus
[modifier] Arrondir à 12 bits fractionnaires chaque fois que la division temporelle est utilisée en ne l'utilisant pas
[edit2] optimiser le dictionnaire pokeball
la source
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)
pour exclure toutes les divisions?floor(x*4096)*4096
arrondir à la décimale, par exemple.Perl 1 (374 - 150 = 224 + nombre manquant d'octets)
Liste d'arguments:
Oui, je suis conscient que cela enfreint complètement les règles, mais je m'en fiche. Au cas où vous ne l'auriez pas remarqué, il s'agit du premier algorithme de capture de génération Pokémon, avec toutes ses bizarreries (les Great Balls sont meilleures que les Ultra Balls, dans certaines conditions). Cela implémente toutes les fonctionnalités, y compris celles qui ne sont pas incluses (et j'ai décidé d'inclure des points pour eux de toute façon). Les captures critiques sont ignorées (mais elles sont implémentées - juste qu'elles n'affectent pas le taux de capture), les Poké Balls plus récents chargent les données des autres Poké Balls.
Veuillez noter que bien que cette réponse soit courte, elle enfreint toutes les règles, alors considérez-la simplement comme une réponse amusante, ne l'acceptez pas. J'allais initialement implémenter l'algorithme Gen5 en Perl 5, mais j'ai décidé - pourquoi ne pas s'amuser. Et oui, j'ai en fait compilé Perl 1, et ce code fonctionne. Si vous l'exécutez dans une version plus récente de Perl, vous pouvez obtenir des avertissements sur l'utilisation obsolète de
do
, mais soyons honnêtes - c'est le seul moyen d'exécuter des fonctions dans Perl 1. Perl 1 a également quelques bizarreries à lui seul (par exemple, je ne peux pas déplacer la ligne en commençant par/M/
ligne précédente - pourquoi? - je ne sais pas).De plus, il n'y a pas de nombres aléatoires dans Perl 1, alors j'espère que vous ne me tuerez pas pour le module de
$$
. C'est la chose la plus proche du nombre aléatoire que j'aurais pu trouver.Edit: Il semble que l'ancienne
do call()
syntaxe ait été supprimée dans Perl 5.19.8. Assurez-vous d'utiliser une ancienne version de Perl pour exécuter ce script, car il semble que Perl 5.20 ne sera pas compatible avec les scripts Perl 1.la source
PHP (
746763 octets - tous les bonus):Pour l'utiliser, vous devez fournir l'entrée comme «ball = poke & status = sleep» sur STDIN.
Le HP doit être fourni en tant que «hp [max]» ou «hp [current]».
Ce code fonctionne, comme testé ici .
Vous pouvez fournir le statut par son nom ou le multiplicateur. ( non requis dans la question ).
Voici une version lisible:
J'ai dû modifier cela parce que j'utilisais une précision beaucoup plus élevée que celle requise.
Le correctif a été fourni par TheConstructor .
la source
Whenever any division is performed, the result is rounded down to a multiple of 1/4096.
)floor(x*4096)/4096
ou implémenter la division en virgule fixe comme je l'ai fait.Java, 611
But:
=> 611
Le programme utilise l'arithmétique à virgule fixe avec 12 bits de fraction (
1/4096
est la valeur du bit le plus à droite). Comme Java n'utilise généralement pas de virgule fixe, il y a pas mal de changements à l'intérieur du code pour obtenir les résultats attendus. Voir la version longue pour les fonctions arithmétiques utilisées, qui ont été intégrées pour le golf.Alors que la plupart des calculs auraient pu être effectués sur des
int
valeurs, les divisions fonctionnent mieux aveclong
s car vous devez décaler le dividende d'un autre 12 bits vers la gauche pour conserver la précision souhaitée (sinon vous perdez tous les bits de fraction).Exemple d'entrée (
;
n'est requis que s'il est exécuté de manière interactive, c'est-à-dire que STDIN n'a pas reçu EOF): Ball, catch_rate, max_hpExemple de sortie:
Exemple d'entrée: Ball, catch_rate, max_hp, current_hp, bonus_state
Exemple de sortie:
la source
CoffeeScript -
317313310307306294270250242 octets342 - 25 (paramètres) - 75 (12 balles) = 242
Attend l'entrée
HP_max,Rate,Ball[,HP_current[,status]]
. Ne supporte pasMoon
ouLove
boules.C'est la première chose que j'ai jamais joué au golf qui n'est pas une expression régulière, donc il y a probablement place à amélioration. J'ai copié sans vergogne l'idée de ne stocker que des noms de balle partiels. ;) Soutenir les deux autres boules ne vaut tout simplement pas la peine, même pas avec le +7 supplémentaire pour obtenir tous les bonus.
Version non golfée
Cette version omet tous les alias courts que je définis au début, mais définit la recherche de balle séparément.
Une note sur la formule de probabilité: j'ai réorganisé la formule complète (avec écrit
a
) afin qu'il n'y ait pas de divisions, et je calcule(...)^(1/4)
en prenant la racine carrée deux fois.la source
p-=p%1/4096
semble vraiment fonctionner. (J'aurais deviné que vous auriez au moins besoin d'écrirep-=p%(1/4096)
et puis je ne serais pas sûr que le module soit implémenté pour les fractions des deux côtés. Nice!%
peut être utilisé pour des choses drôles dans JS. Après avoir relu la question, je pense que cette réponse ne répond pas tout à fait à l'exigence d'arrondi. Je pense que l'arrondissement devrait être appliqué après chaque division. Je vais peut-être devoir restructurer un peu mon calcul. ^^p%(1/4096)
. J'ai même vérifié cela avant de poster, mais je me souviens en quelque sorte du résultat de mon test.Mise à jour: (C #)
Nombre d'octets: 3600
Critique: -25
Toutes les boules de poke: -91
Total = 3 484
[golfé]
[ordinaire]
la source