Calculadora de potencia oculta

15

Una de las razones por las que siempre me ha encantado Pokemon es porque para un juego tan simple, tiene muchas capas de complejidad. Consideremos el movimiento Hidden Power. En el juego, el tipo y el poder (al menos antes de la Generación VI) de Hidden Power es diferente para cada Pokémon que lo usa. Eso es genial, ¿verdad? Ahora, ¿se sorprendería si le dijera que el tipo y el poder de Hidden Power no se generan al azar?

En todos los juegos de Pokémon, todos los Pokémon (no solo los de tu grupo, TODOS LOS POKEMON) tienen seis enteros almacenados internamente (uno para la estadística HP, uno para la estadística de ataque, uno para la estadística de defensa, uno para la estadística de ataque especial, uno para la estadística de defensa especial y otro para la estadística de velocidad) llamados sus valores individuales, o IVs. Estos valores oscilan entre 0 y 31, y esencialmente son uno de los pocos factores que influyen en las estadísticas generales de un Pokémon. ¡SIN EMBARGO, también determinan el tipo y el poder de Hidden Power!

En la Generación III a V (las generaciones cuyo algoritmo implementaremos), el tipo de Hidden Power está determinado por la siguiente fórmula (tenga en cuenta los corchetes, lo que significa que necesita redondear el resultado):

donde a, b, c, d, e y f son los bits menos significativos de HP, Attack, Defense, Speed, Sp. Ataque, y Sp. Defensa IVs respectivamente. (El bit menos significativo es IV mod 2.) El número producido aquí se puede convertir al tipo real usando este gráfico:

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

Para el poder, se usa una fórmula similar:

Aquí, sin embargo, u, v, w, x, y y z representan el segundo bit menos significativo de HP, Attack, Defense, Speed, Sp. Ataque y Sp. Defensa IVs (en ese orden nuevamente). (El segundo bit menos significativo es más complicado que el bit menos significativo. Si IV mod 4 es 2 o 3, entonces el bit es 1, de lo contrario es 0. Si su idioma tiene algún tipo de forma integrada o al menos una forma más inteligente para hacer esto, probablemente deberías usarlo).


Entonces, como probablemente ya descubrió, el desafío aquí es escribir un programa que tome seis enteros separados por espacios a través de STDIN que representan HP, Attack, Defense, Speed, Sp. Ataque y Sp. Defiende los IV de un Pokémon (en ese orden) y genera el tipo y el poder del Poder Oculto de ese Pokémon.

Entrada de muestra:

30 31 31 31 30 31

Salida de muestra:

Grass 70

Entrada de muestra:

16 18 25 13 30 22

Salida de muestra:

Poison 61

Este es el código de golf, por lo que gana el código más corto. ¡Buena suerte!

(Y antes de que la gente pregunte, usé el algoritmo de la Generación V aquí porque la Generación VI se deshace de la aleatorización de potencia y la hace siempre 60. No solo creo que esto es increíblemente pobre, creo que hace que el desafío sea MUCHO MENOS INTERESANTE. a los fines del desafío, estamos ejecutando un juego de Gen V.)

un espagueti
fuente
Lo siento, omití la entrada y salida de muestra por error. Aqui tienes.
un spaghetto
Algunas muestras de prueba adicionales serían buenas :).
Blackhole
Si, mi mal. Fijo.
un spaghetto
3
Me gustaría ver un desafío sobre MissingNo.
mbomb007
Eso podría suceder después;)
un espagueti

Respuestas:

3

Pyth, 110 bytes

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

Este contiene caracteres no imprimibles. Entonces aquí hay 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

También puede descargar el archivo pokemon.pyth y ejecutarlo conpython3 pyth.py pokemon.pyth

La entrada 30, 31, 31, 31, 30, 31imprime

Grass
70

Explicación:

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
fuente
3
Me resulta bastante divertido que su extensión de archivo para los archivos Pyth es más prolija que la extensión de archivo del pitón: ^)
FryAmTheEggman
5

Rubí, 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 por primera vez, así que supongo que esta es una solución bastante obvia.

Borsunho
fuente
3

CJAM, 140 115 bytes

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+

Tenga en cuenta que el código contiene caracteres no imprimibles.

Pruébelo en línea en el intérprete de CJam: Chrome | Firefox

Dennis
fuente
Wow, eso fue rápido. ¡Buen trabajo!
un spaghetto
2

Javascript (ES6), 251 bytes

Un poco largo, al menos por ahora. La lista de tipos y las matemáticas complejas ocupan aproximadamente la misma cantidad de espacio. Estoy buscando formas de acortar cualquiera / ambos.

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

Como de costumbre, las sugerencias son bienvenidas!

ETHproductions
fuente
1

Javascript (ES6), 203 bytes

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

Ejecuciones de ejemplo:

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

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