Ukryty kalkulator mocy

15

Jednym z powodów, dla których zawsze uwielbiałem Pokemona, jest to, że w tak pozornie prostej grze ma tyle warstw złożoności. Rozważmy ruch Ukryta Moc. W grze rodzaj i moc (przynajmniej przed generacją VI) ukrytej mocy jest inna dla każdego pokemona, który z niej korzysta! To całkiem fajne, prawda? Czy byłbyś zaskoczony, gdybym ci powiedział, że rodzaj i moc Ukrytej Mocy nie są generowane losowo?

We wszystkich grach Pokemon wszystkie Pokemony (nie tylko w twojej drużynie, WSZYSTKIE POKEMON) mają sześć wewnętrznie zapisanych liczb całkowitych (jedna dla statystyki HP, jedna dla statystyki ataku, jedna dla statystyki obrony, jedna dla specjalnej statystyki ataku, jeden dla specjalnej statystyki obrony, a drugi dla statystyki prędkości) nazywał ich indywidualne wartości lub IV. Wartości te mieszczą się w zakresie od 0 do 31 i zasadniczo są jednym z kilku czynników, które wpływają na ogólne statystyki pokemona. JEDNAK określają także rodzaj i moc Ukrytej Mocy!

W generacjach od III do V (generacje, których algorytm będziemy wdrażać) rodzaj ukrytej mocy jest określany według następującego wzoru (zwróć uwagę na nawiasy podłogowe, co oznacza, że ​​musisz zaokrąglić wynik):

gdzie a, b, c, d, e i f są najmniej znaczącymi bitami HP, Ataku, Obrony, Prędkości, Sp. Attack i Sp. Obrona IV odpowiednio. (Najmniej znaczącym bitem jest IV mod 2.) Wytworzona tutaj liczba może zostać przekonwertowana na rzeczywisty typ za pomocą tej tabeli:

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

Do zasilania stosuje się podobną formułę:

Tutaj jednak u, v, w, x, y i z reprezentują drugą najmniej znaczącą część HP, Ataku, Obrony, Prędkości, Sp. Attack and Sp. Obrona IV (znowu w tej kolejności). (Drugi najmniej znaczący bit jest bardziej skomplikowany niż najmniej znaczący bit. Jeśli IV mod 4 to 2 lub 3, to bit ma wartość 1, w przeciwnym razie jest równy 0. Jeśli twój język ma wbudowany lub co najmniej bardziej sprytny sposób aby to zrobić, prawdopodobnie powinieneś go użyć).


Tak więc, jak zapewne już się zorientowałeś, wyzwaniem jest napisanie programu, który poprzez STDIN przyjmuje sześć liczb całkowitych oddzielonych spacjami, które reprezentują HP, Atak, Obrona, Szybkość, Sp. Attack and Sp. Obroń IV pokemona (w tej kolejności) i generuj typ i moc Ukrytej Mocy tego Pokemona.

Przykładowe dane wejściowe:

30 31 31 31 30 31

Przykładowe dane wyjściowe:

Grass 70

Przykładowe dane wejściowe:

16 18 25 13 30 22

Przykładowe dane wyjściowe:

Poison 61

To jest golf golfowy, więc wygrywa najkrótszy kod. Powodzenia!

(I zanim ludzie zapytają, użyłem tutaj algorytmu Generacji V, ponieważ Generacja VI pozbywa się losowości mocy i sprawia, że ​​zawsze ma 60 lat. Nie tylko uważam, że jest to bardzo kiepskie, ale sprawia, że ​​wyzwanie jest MNIEJSZE ZAINTERESOWANE. Więc na potrzeby tego wyzwania prowadzimy grę Gen V.)

spaghetto
źródło
Przepraszam, pomyłkowo pominąłem przykładowe dane wejściowe i wyjściowe. Proszę bardzo.
spaghetto
Przydałyby się dodatkowe próbki testowe :).
Blackhole
Tak, mój zły. Naprawiony.
spaghetto
3
Chciałbym zobaczyć wyzwanie dotyczące MissingNo.
mbomb007
To może się zdarzyć później;)
spaghetto

Odpowiedzi:

3

Pyth, 110 bajtów

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

Zawiera znaki niedrukowalne. Oto zrzut heksowy:

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

Możesz także pobrać plik pokemon.pyth i uruchomić go za pomocąpython3 pyth.py pokemon.pyth

Dane wejściowe 30, 31, 31, 31, 30, 31zostaną wydrukowane

Grass
70

Wyjaśnienie:

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
źródło
3
Uważam, że raczej zabawne jest to, że twoje rozszerzenie pliku dla Pyth jest bardziej pełne niż rozszerzenie pliku Pythona: ^)
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}"

Pierwszy raz w golfa, więc myślę, że jest to dość oczywiste rozwiązanie.

Borsunho
źródło
3

CJam, 140 115 bajtów

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+

Pamiętaj, że kod zawiera znaki niedrukowalne.

Wypróbuj online w interpretatorze CJam: Chrome | Firefox

Dennis
źródło
Wow, to było szybkie. Dobra robota!
spaghetto
2

JavaScript (ES6), 251 bajtów

Trochę długo, przynajmniej na razie. Lista typów i złożone matematyki zajmują mniej więcej tyle samo miejsca. Szukam sposobów na skrócenie jednego lub obu z nich.

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

Jak zwykle sugestie mile widziane!

ETHprodukcje
źródło
1

JavaScript (ES6), 203 bajty

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

Przykładowe przebiegi:

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

f(16,18,25,13,30,22)
> "Poison 61"
Dendrobium
źródło