Калькулятор скрытой мощности


15

Одна из причин, по которой я всегда любил покемонов, заключается в том, что в такой простой, на первый взгляд, игре много уровней сложности. Давайте рассмотрим ход Hidden Power. В игре тип и сила (по крайней мере до VI поколения) скрытой силы различна для каждого покемона, который его использует! Это довольно круто, правда? Теперь, вы будете удивлены, если я скажу вам, что тип и сила Скрытой Силы не генерируются случайным образом?

Во всех играх покемонов все покемоны (не только в вашей группе, ВСЕ ПОКЕМОНЫ) имеют шесть целых чисел, хранящихся внутри (одно для характеристики HP, одно для характеристики атаки, одно для характеристики защиты, одно для особой характеристики атаки, один для особой защиты и один для скорости), называемый их индивидуальными значениями, или IV. Эти значения находятся в диапазоне от 0 до 31, и они по сути являются одним из немногих факторов, которые влияют на общую статистику покемонов. ОДНАКО, они также определяют тип и силу Скрытой Силы!

В поколениях с III по V (поколения, чей алгоритм мы будем реализовывать), тип скрытой силы определяется по следующей формуле (обратите внимание на квадратные скобки, это означает, что вам нужно округлить результат):

где a, b, c, d, e и f - младшие значащие биты HP, Attack, Defense, Speed, Sp. Attack и Sp. Защита IVs соответственно. (Наименее значимым битом является IV mod 2.) Произведенное здесь число затем можно преобразовать в фактический тип, используя эту диаграмму:

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

Для мощности используется аналогичная формула:

Здесь, однако, u, v, w, x, y и z представляют второй младший бит HP, Attack, Defense, Speed, Sp. Атака и Sp. Защита IV (в том же порядке). (Второй младший значащий бит является более сложным, чем младший значащий бит. Если IV mod 4 равен 2 или 3, то бит равен 1, в противном случае он равен 0. Если ваш язык имеет какой-то встроенный или, по крайней мере, более умный способ чтобы сделать это, вы, вероятно, должны использовать его.)


Итак, как вы, наверное, уже поняли, задача здесь состоит в том, чтобы написать программу, которая принимает шесть целых чисел, разделенных пробелами через STDIN, которые представляют HP, Attack, Defense, Speed, Sp. Атака и Sp. Защитите IV Покемона (в таком порядке) и выведите тип и силу Скрытой Силы этого Покемона.

Пример ввода:

30 31 31 31 30 31

Пример вывода:

Grass 70

Пример ввода:

16 18 25 13 30 22

Пример вывода:

Poison 61

Это код-гольф, поэтому выигрывает самый короткий код. Удачи!

(И прежде чем люди спросят, я использовал алгоритм Generation V здесь, потому что Generation VI избавляется от рандомизации мощности и делает ее всегда 60. Я не только считаю, что это невероятно хромая, я думаю, что это делает задачу МЕНЬШЕ ИНТЕРЕСНОЙ. для выполнения задачи мы запускаем игру Gen V.)


Извините, я пропустил выборочный ввод и вывод по ошибке. Ну вот.
спагетто

Некоторые дополнительные тестовые образцы были бы хороши :).
Черная

Да мой плохой Исправлена.
спагетто

3
Я хотел бы увидеть вызов о MissingNo.
mbomb007

Это может произойти дальше;)
спагетто

Ответы:


3

Pyth, 110 байт

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

Это содержит непечатаемые символы. Итак, вот 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

Вы также можете скачать файл pokemon.pyth и запустить его сpython3 pyth.py pokemon.pyth

Входные 30, 31, 31, 31, 30, 31распечатки

Grass
70

Объяснение:

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
Я нахожу довольно забавным, что ваше расширение для файлов pyth является более многословным, чем расширение файла python: ^)
FryAmTheEggman

5

Рубин, 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}"

В первый раз играю в гольф, так что, думаю, это довольно очевидное решение.


3

CJam, 140 115 байтов

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+

Обратите внимание, что код содержит непечатаемые символы.

Попробуйте онлайн в интерпретаторе CJam: Chrome | Fire Fox


Вау, это было быстро Хорошая работа!
спагетто

2

Javascript (ES6), 251 байт

Вроде долго, по крайней мере пока. Список типов и сложные математические вычисления занимают примерно одинаковое количество места. Я ищу способы сократить один или оба из них.

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

Как обычно, предложения приветствуются!


1

Javascript (ES6), 203 байта

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

Пример работы:

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

f(16,18,25,13,30,22)
> "Poison 61"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.