Versteckter Stromrechner

15

Einer der Gründe, warum ich Pokemon immer geliebt habe, ist, dass es für ein so simpel wirkendes Spiel so viele Komplexitätsebenen hat. Betrachten wir den Zug Hidden Power. Im Spiel unterscheiden sich Art und Stärke (mindestens vor Generation VI) von Hidden Power für jedes Pokémon, das sie verwendet! Das ist ziemlich cool, oder? Wäre es für Sie überraschend, wenn ich Ihnen sagen würde, dass die Art und Kraft von Hidden Power nicht zufällig erzeugt wird?

In allen Pokemon-Spielen haben alle Pokemon (nicht nur die in Ihrer Gruppe, ALL POKEMON) sechs intern gespeicherte Ganzzahlen (eine für die HP-Statistik, eine für die Angriffsstatistik, eine für die Verteidigungsstatistik, eine für die Spezialangriffsstatistik, eine für den Spezialverteidigungsstatus und eine für den Geschwindigkeitsstatus, genannt ihre individuellen Werte oder IVs. Diese Werte liegen zwischen 0 und 31 und sind im Wesentlichen einer der wenigen Faktoren, die die Gesamtstatistik eines Pokemons beeinflussen. Sie bestimmen jedoch auch den Typ und die Stärke von Hidden Power!

In den Generationen III bis V (den Generationen, deren Algorithmus wir implementieren) wird der Typ der verborgenen Kraft durch die folgende Formel bestimmt (beachten Sie die Klammern, dh Sie müssen das Ergebnis abrunden):

Dabei sind a, b, c, d, e und f die niedrigstwertigen Bits von HP, Attack, Defense, Speed, Sp. Angriff und Sp. Verteidigungs-IVs. (Das am wenigsten signifikante Bit ist IV mod 2.) Die hier erzeugte Zahl kann dann unter Verwendung dieser Tabelle in den tatsächlichen Typ umgewandelt werden:

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

Für die Potenz wird eine ähnliche Formel verwendet:

Hier repräsentieren jedoch u, v, w, x, y und z das zweitniedrigste Bit von HP, Attack, Defense, Speed, Sp. Angriff und Sp. Verteidigungs-IVs (wieder in dieser Reihenfolge). (Das zweitniedrigstwertige Bit ist komplizierter als das niedrigstwertige Bit. Wenn IV mod 4 2 oder 3 ist, dann ist das Bit 1, andernfalls 0. Wenn Ihre Sprache eine Art eingebauten oder zumindest geschickteren Weg hat Um dies zu tun, sollten Sie es wahrscheinlich verwenden.)


Wie Sie wahrscheinlich bereits herausgefunden haben, besteht die Herausforderung hier darin, ein Programm zu schreiben, das sechs durch Leerzeichen getrennte Ganzzahlen über STDIN enthält, die die Werte HP, Attack, Defense, Speed, Sp. Z oo darstellen. Angriff und Sp. Verteidige IVs eines Pokemons (in dieser Reihenfolge) und gib den Typ und die Stärke der verborgenen Kraft dieses Pokemons aus.

Beispieleingabe:

30 31 31 31 30 31

Beispielausgabe:

Grass 70

Beispieleingabe:

16 18 25 13 30 22

Beispielausgabe:

Poison 61

Das ist Code-Golf, also gewinnt der kürzeste Code. Viel Glück!

(Und bevor die Leute fragen, habe ich hier den Generation V-Algorithmus verwendet, weil die Generation VI die Power-Randomisierung beseitigt und immer 60 macht. Ich halte dies nicht nur für unglaublich lahm, sondern auch für eine WENIGER INTERESSANTE Herausforderung. Also Für die Zwecke der Herausforderung führen wir ein Gen V-Spiel aus.)

ein Spaghetto
quelle
Entschuldigung, ich habe versehentlich die Eingabe und Ausgabe des Samples ausgelassen. Bitte schön.
ein Spaghetto
Einige zusätzliche Testmuster wären nett :).
Blackhole
Ja, meine schlechte. Fest.
ein Spaghetto
3
Ich würde gerne eine Herausforderung zu MissingNo sehen.
mbomb007
Das könnte als nächstes passieren;)
ein Spaghetto

Antworten:

3

Pyth, 110 Bytes

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

Dies enthält nicht druckbare Zeichen. Also hier ist ein 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

Sie können auch die Datei pokemon.pyth herunterladen und mit ausführenpython3 pyth.py pokemon.pyth

Die Eingabe wird 30, 31, 31, 31, 30, 31gedruckt

Grass
70

Erläuterung:

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
quelle
3
Ich finde es ziemlich amüsant, dass Ihre Dateierweiterung für Pyth-Dateien ausführlicher ist als die Dateierweiterung von Python: ^)
FryAmTheEggman
5

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

Das erste Mal Golf spielen, also denke ich, dass dies eine ziemlich offensichtliche Lösung ist.

Borsunho
quelle
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+

Beachten Sie, dass der Code nicht druckbare Zeichen enthält.

Probieren Sie es online im CJam-Interpreter aus: Chrome | Feuerfuchs

Dennis
quelle
Wow, das war schnell. Gut gemacht!
ein Spaghetto
2

Javascript (ES6), 251 Byte

Zumindest für den Moment ein bisschen lang. Die Typenliste und die komplexe Mathematik nehmen ungefähr den gleichen Platz ein. Ich suche nach Möglichkeiten, einen von beiden zu verkürzen.

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

Vorschläge sind wie immer willkommen!

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

Beispiel läuft:

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

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