Hidden Power Calculator


15

Uno dei motivi per cui ho sempre adorato Pokemon è perché per un gioco così semplice sembra avere così tanti livelli di complessità. Consideriamo la mossa Hidden Power. Nel gioco, il tipo e il potere (almeno prima della generazione VI) di Hidden Power è diverso per ogni Pokemon che lo usa! È abbastanza bello, vero? Ora, saresti sorpreso se ti dicessi che il tipo e il potere di Hidden Power non sono generati casualmente?

In tutti i giochi Pokemon, tutti i Pokemon (non solo quelli del tuo gruppo, TUTTO POKEMON) hanno sei numeri interi memorizzati internamente (uno per la statistica HP, uno per la statistica di attacco, uno per la statistica di difesa, uno per la statistica di attacco speciale, uno per la stat di difesa speciale e uno per la stat di velocità) chiamato i loro valori individuali, o IV. Questi valori sono compresi tra 0 e 31 e sono essenzialmente uno dei pochi fattori che influenzano le statistiche complessive di un Pokemon. TUTTAVIA, determinano anche il tipo e la potenza del potere nascosto!

Nella terza generazione a V (le generazioni di cui implementeremo l'algoritmo), il tipo di potenza nascosta è determinato dalla seguente formula (notare le parentesi quadre, il che significa che è necessario arrotondare per difetto il risultato):

dove a, b, c, d, e e f sono i bit meno significativi di HP, Attacco, Difesa, Velocità, Sp. Attack e Sp. Difesa IV rispettivamente. (Il bit meno significativo è IV mod 2.) Il numero prodotto qui può essere convertito nel tipo reale usando questo grafico:

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

Per il potere, viene utilizzata una formula simile:

Qui, tuttavia, u, v, w, x, y e z rappresentano il secondo bit meno significativo di HP, Attacco, Difesa, Velocità, Sp. Attack and Sp. Difesa IV (di nuovo in quell'ordine). (Il secondo bit meno significativo è più complicato del bit meno significativo. Se IV mod 4 è 2 o 3, allora il bit è 1, altrimenti è 0. Se la tua lingua ha una sorta di built-in o almeno un modo più intelligente per fare questo, probabilmente dovresti usarlo.)


Quindi, come probabilmente hai già capito, la sfida qui è scrivere un programma che comprenda sei numeri interi separati da spazi tramite STDIN che rappresentano HP, Attack, Defense, Speed, Sp. Attack and Sp. Difesa IV di un Pokemon (in quell'ordine) e produzione del tipo e del potere di quel potere nascosto di quel Pokemon.

Input di esempio:

30 31 31 31 30 31

Uscita campione:

Grass 70

Input di esempio:

16 18 25 13 30 22

Uscita campione:

Poison 61

Questo è code-golf, quindi vince il codice più corto. In bocca al lupo!

(E prima che le persone chiedano, ho usato l'algoritmo di generazione V qui perché la generazione VI elimina la randomizzazione della potenza e la rende sempre 60. Non solo penso che sia incredibilmente zoppo, penso che rende la sfida MOLTO MOLTO INTERESSANTE. Quindi ai fini della sfida, stiamo eseguendo un gioco di generazione V.)


Siamo spiacenti, ho lasciato fuori input e output di esempio per errore. Ecco qui.
uno spaghetto,

Alcuni campioni di test aggiuntivi sarebbero belli :).
Blackhole,

Sì, mia cattiva. Fisso.
uno spaghetto il

3
Mi piacerebbe vedere una sfida su MissingNo.
mbomb007,

Potrebbe succedere dopo;)
uno spaghetto il

Risposte:


3

Pyth, 110 byte

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

Questo contiene caratteri non stampabili. Quindi ecco 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  -#...?....O@.J/m
00000060: d2 ca c6 23 22 32 36 29 47 33 2b 33 30 48        ...#"26)G3+30H

Puoi anche scaricare il file pokemon.pyth ed eseguirlo conpython3 pyth.py pokemon.pyth

L'input viene 30, 31, 31, 31, 30, 31stampato

Grass
70

Spiegazione:

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

3
Trovo piuttosto divertente che l'estensione del file per i file Pyth sia più dettagliata dell'estensione del file Python: ^)
FryAmTheEggman

5

Ruby, 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}"

Giocare a golf per la prima volta, quindi credo che questa sia una soluzione abbastanza ovvia.


3

CJam, 140 115 byte

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+

Si noti che il codice contiene caratteri non stampabili.

Provalo online nell'interprete CJam: Chrome | Firefox


Wow, è stato veloce. Bel lavoro!
uno spaghetto il

2

Javascript (ES6), 251 byte

Un po 'a lungo, almeno per ora. L'elenco dei tipi e la matematica complessa occupano circa la stessa quantità di spazio. Sto cercando dei modi per accorciare entrambi.

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

Come al solito, suggerimenti benvenuti!


1

Javascript (ES6), 203 byte

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

Esempi di esecuzione:

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

f(16,18,25,13,30,22)
> "Poison 61"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.