Pokeball Simulator

26

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:

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

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 , 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!

métro monorail
la source
Je ne peux actuellement pas juger de l'ampleur de la probabilité que vous donnez, 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?
TheConstructor
Si 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.
undergroundmonorail
Cela rnd < psignifie donc que le contrôle est réussi avec une rndplage de 0 et 1.
TheConstructor
1
@IsmaelMiguel voir mes commentaires: vous générez un nombre aléatoire dans la plage de 0 à 1 et le comparez 65536 / (255 / a)^(1/4), puis si le nombre aléatoire est inférieur, le test de secousse a réussi
TheConstructor
1
Comme indiqué dans le texte, le type textuel de pokeball, la puissance maximale et le taux de capture sont passés en entrée dans votre programme. En option, vous pouvez demander le ch actuel (par défaut 1) ou un bonus de statut (par défaut 2,5)
TheConstructor

Réponses:

3

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.

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

Voici la version golfée

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
la source
6

PYTHON 249 octets - 75 pour les bonus = 174

Mon premier essai de golf.

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

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

Þorsteinn
la source
Je pense que vous utilisez une précision supérieure à 1/4096 (états des questions Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor
Vous avez probablement raison, je n'ai pas bien compris cette partie et les autres réponses semblaient se dérouler de la même manière que moi. Je suppose que je dois faire quelque chose comme ça: 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?
Þorsteinn
1/4096 signifie 12 bits fractionnaires. Jetez un oeil à ma solution; une approche plus directe consisterait à floor(x*4096)*4096arrondir à la décimale, par exemple.
TheConstructor
Ohh je vois, merci. Cela devrait probablement s'appliquer également à la multiplication comme vous semblez l'avoir fait, mais comme cela n'est pas indiqué dans les règles, je ne vais pas m'en inquiéter. :)
Þorsteinn
Oui, ils utilisent probablement des arithmétiques à virgule fixe. Mais OP a seulement demandé d'arrondir la division.
TheConstructor
6

Perl 1 (374 - 150 = 224 + nombre manquant d'octets)

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

Liste d'arguments:

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

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.

Konrad Borowski
la source
5

PHP (746 763 octets - tous les bonus):

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

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:

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

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 .

Ismael Miguel
la source
Je pense que vous utilisez un precission supérieur à 1/4096 (états question Note: Whenever any division is performed, the result is rounded down to a multiple of 1/4096.)
TheConstructor
Et tu as raison. J'ai remarqué que j'utilise toute valeur provenant de la division. Si vous le souhaitez, vous pouvez m'aider, car je n'ai aucune idée de comment arrondir à une plus petite précision en PHP.
Ismael Miguel
Vous pouvez faire floor(x*4096)/4096ou implémenter la division en virgule fixe comme je l'ai fait.
TheConstructor
Merci de votre aide. Je n'y penserais jamais. J'ai fixé ma réponse.
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":""):""):"");}}

But:

  • 729 octets
  • -93 toutes les balles
  • -25 current_hp et bonus_state en option

=> 611

Le programme utilise l'arithmétique à virgule fixe avec 12 bits de fraction ( 1/4096est 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 intvaleurs, les divisions fonctionnent mieux avec longs 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_hp

Poke 15 255 ;

Exemple de sortie:

*shake*

Exemple d'entrée: Ball, catch_rate, max_hp, current_hp, bonus_state

Moon 42 255 50 1.5

Exemple de sortie:

*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
la source
1

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

342 - 25 (paramètres) - 75 (12 balles) = 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]

Attend l'entrée HP_max,Rate,Ball[,HP_current[,status]]. Ne supporte pas Moonou Loveboules.

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.

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]

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.

Martin Ender
la source
1
On dirait que la priorité est de votre côté Oo p-=p%1/4096semble vraiment fonctionner. (J'aurais deviné que vous auriez au moins besoin d'écrire p-=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!
TheConstructor
@TheConstructor Haha, ouais j'ai dû vérifier que ... ça me semblait vraiment bizarre aussi, mais %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. ^^
Martin Ender
Oui probablement toujours une bonne idée
TheConstructor
@TheConstructor En fait, j'ai besoin d'écrire 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.
Martin Ender
Essayé dans Chrome; travaillé sans () mais peut-être pas toujours ou pas sur tous les navigateurs ...
TheConstructor
0

Mise à jour: (C #)

Nombre d'octets: 3600

Critique: -25

Toutes les boules de poke: -91


Total = 3 484

[golfé]

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

[ordinaire]

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
la source
C'est du golf de code. Vous devriez réduire votre réponse (par exemple: supprimer les espaces blancs). Vous pouvez toujours fournir la réponse actuelle sous forme de version lisible.
Ismael Miguel