Calculatrice de puissance cachée

15

L'une des raisons pour lesquelles j'ai toujours aimé Pokemon est que, pour un jeu aussi simple, il a tellement de couches de complexité. Prenons le mouvement Hidden Power. Dans le jeu, le type et la puissance (au moins avant la génération VI) de la puissance cachée sont différents pour chaque Pokémon qui l'utilise! C'est plutôt cool, non? Maintenant, seriez-vous surpris si je vous disais que le type et la puissance de Hidden Power ne sont pas générés de manière aléatoire?

Dans tous les jeux Pokemon, tous les Pokémon (pas seulement ceux de votre groupe, ALL POKEMON) ont six entiers stockés en interne (un pour la statistique HP, un pour la statistique d'attaque, un pour la statistique de défense, un pour la statistique d'attaque spéciale, un pour la statistique de défense spéciale et un pour la statistique de vitesse) appelés leurs valeurs individuelles, ou IV. Ces valeurs varient entre 0 et 31, et elles sont essentiellement l'un des quelques facteurs qui influencent les statistiques générales d'un Pokémon. CEPENDANT, ils déterminent également le type et la puissance de la puissance cachée!

Dans la génération III à V (les générations dont nous allons implémenter l'algorithme), le type de puissance cachée est déterminé par la formule suivante (notez les crochets au sol, cela signifie que vous devez arrondir le résultat):

où a, b, c, d, e et f sont les bits les moins significatifs des HP, Attack, Defense, Speed, Sp. Attaque et Sp. IV de défense respectivement. (Le bit le moins significatif est IV mod 2.) Le nombre produit ici peut alors être converti en type réel à l'aide de ce tableau:

0 Fighting
1 Flying
2 Poison
3 Ground
4 Rock
5 Bug
6 Ghost
7 Steel
8 Fire
9 Water
10 Grass
11 Electric
12 Psychic
13 Ice
14 Dragon
15 Dark

Pour le pouvoir, une formule similaire est utilisée:

Ici, cependant, u, v, w, x, y et z représentent le deuxième bit le moins significatif des HP, Attack, Defense, Speed, Sp. Attaque et Sp. Défense IVs (dans cet ordre encore). (Le deuxième bit le moins significatif est plus compliqué que le bit le moins significatif. Si IV mod 4 est 2 ou 3, alors le bit est 1, sinon il est 0. Si votre langue a une sorte de intégré ou au moins une manière plus intelligente pour ce faire, vous devriez probablement l'utiliser.)


Donc, comme vous l'avez probablement déjà compris, le défi ici est d'écrire un programme qui prend six entiers séparés par des espaces via STDIN qui représentent les HP, Attack, Defense, Speed, Sp. Attaque et Sp. Défendez les IV d'un Pokémon (dans cet ordre) et produisez le type et la puissance du pouvoir caché de ce Pokémon.

Exemple d'entrée:

30 31 31 31 30 31

Exemple de sortie:

Grass 70

Exemple d'entrée:

16 18 25 13 30 22

Exemple de sortie:

Poison 61

C'est le code-golf, donc le code le plus court l'emporte. Bonne chance!

(Et avant que les gens ne demandent, j'ai utilisé l'algorithme de génération V ici parce que la génération VI se débarrasse de la randomisation de la puissance et la rend toujours 60. Non seulement je pense que c'est incroyablement boiteux, je pense que cela rend le défi beaucoup moins intéressant. pour les besoins du défi, nous organisons un jeu Gen V.)

un spaghetto
la source
Désolé, j'ai omis les entrées et sorties d'échantillon par erreur. Voici.
un spaghetto du
Quelques échantillons de test supplémentaires seraient bien :).
Blackhole
Oui, ma mauvaise. Fixé.
un spaghetto du
3
J'aimerais voir un défi à propos de MissingNo.
mbomb007
Cela pourrait arriver ensuite;)
un spaghetto

Réponses:

3

Pyth, 110 octets

J+dGA.b/*iN2CY63Cm_+0jd2_Q"("r@cs@LJjC"!�W��Zm�����A�zB0i��ȏ\"���?wC�ǀ�-#ך
?ЫܦO@�J/m���#"26)G3+30H

Il contient des caractères non imprimables. Voici donc un hexdump:

00000000: 4a 2b 64 47 41 2e 62 2f 2a 69 4e 32 43 59 36 33  J+dGA.b/*iN2CY63
00000010: 43 6d 5f 2b 30 6a 64 32 5f 51 22 0f 28 22 72 40  Cm_+0jd2_Q".("r@
00000020: 63 73 40 4c 4a 6a 43 22 10 21 de 57 ad c8 5a 1c  cs@LJjC".!.W..Z.
00000030: 10 6d e0 d6 12 f6 80 bc 41 85 7a 42 30 69 ae 80  .m......A.zB0i..
00000040: c8 8f 5c 22 a0 84 ab 3f 77 43 01 ca c7 80 d0 1d  ..\"...?wC......
00000050: 2d 23 d7 9a 0a 3f d0 ab dc a6 4f 40 b9 4a 2f 6d  -#[email protected]/m
00000060: d2 ca c6 23 22 32 36 29 47 33 2b 33 30 48        ...#"26)G3+30H

Vous pouvez également télécharger le fichier pokemon.pyth et l'exécuter avecpython3 pyth.py pokemon.pyth

L'entrée 30, 31, 31, 31, 30, 31imprime

Grass
70

Explication:

J+dGA.b/*iN2CY63Cm_+0jd2_Q".("
J+dG                            store the string " abc...xyz" in J
                 m      _Q      map each number d in reverse(input list) to:
                     jd2          convert d to base 2
                   +0             add a zero (list must have >= 2 items)
                  _               reverse the list
                C               zip
                          ".("  string with the ascii values 15 and 40
     .b                         map each N of ^^ and Y of ^ to:
         iN2                       convert N from base 2 to base 10
        *   CY                     multiply with the ascii value of Y
       /      63                   and divide by 63
    A                           G, H = ^

r@cs@LJjC"longstring"26)G3+30H
        C"longstring"           interpret the string as bytes and convert 
                                from base 256 to base 10
       j             26         convert to base 26
   s@LJ                         lookup their value in J and create a string
                                this gives "fighting flying ... dark"
  c                    )        split by spaces
 @                      G       take the Gth element
r                        3      make the first letter upper-case and print
                          +30H  print 30 + H
Jakube
la source
3
Je trouve plutôt amusant que votre extension de fichier pour les fichiers pyth soit plus verbeuse que l'extension de fichier de python: ^)
FryAmTheEggman
5

Rubis, 210

a=$*.map.with_index{|a,i|[a.to_i%2<<i,a.to_i[1]<<i]}.transpose.map{|a|a.inject &:+}
$><<"#{%w(Fighting
Flying
Poison
Ground
Rock
Bug
Ghost
Steel
Fire
Water
Grass
Electric
Psychic
Ice
Dragon
Dark)[a[0]*15/63]} #{a[1]*40/63+30}"

Golf pour la première fois, donc je suppose que c'est une solution assez évidente.

Borsunho
la source
3

CJam, 140 115 octets

q~]W%_1f&2bF*63/"GMÿD>BÙl½}YÛöí6P¶;óKs¯¿/·dǯã®Å[YÑÌÞ%HJ9¹G4Àv"256b25b'af+'j/=(euooSo2f/1f&2b40*63/30+

Notez que le code contient des caractères non imprimables.

Essayez-le en ligne dans l'interpréteur CJam: Chrome | Firefox

Dennis
la source
Wow, c'était rapide. Bon travail!
un spaghetto du
2

Javascript (ES6), 251 octets

Un peu long, du moins pour l'instant. La liste des types et les mathématiques complexes occupent à peu près la même quantité d'espace. Je cherche des moyens de raccourcir l'un ou les deux.

x=>([a,b,c,d,e,f]=x.split` `,`Fighting
Flying
Poison
Ground
Rock
Bug
Ghost
Steel
Fire
Water
Grass
Electric
Psychic
Ice
Dragon
Dark`.split`
`[(a%2+b%2*2+c%2*4+d%2*8+e%2*16+f%2*32)*5/21|0]+' '+((a/2%2+(b&2)+(c&2)*2+(d&2)*4+(e&2)*8+(f&2)*16)*40/63+30|0))

Comme d'habitude, les suggestions sont les bienvenues!

ETHproductions
la source
1

Javascript (ES6), 203 octets

f=(...l)=>(q=(b,m)=>~~(l.reduce((p,c,x)=>p+(!!(c&b)<<x),0)*m/63),'Fighting0Flying0Poison0Ground0Rock0Bug0Ghost0Steel0Fire0Water0Grass0Electric0Psychic0Ice0Dragon0Dark'.split(0)[q(1,15)]+' '+(q(2,40)+30))

L'exemple s'exécute:

f(30,31,31,31,30,31)
> "Grass 70"

f(16,18,25,13,30,22)
> "Poison 61"
Dendrobium
la source