Калькулятор прихованої потужності


15

Однією з причин, яку я завжди любив Покемон, є те, що для такої простої, здавалося б, гри вона має стільки складних шарів. Розглянемо хід прихованої сили. У грі тип і потужність (принаймні до VI покоління) прихованої сили відрізняються для кожного покемона, який ним користується! Це досить круто, правда? Тепер ви здивуєтесь, якби я сказав вам, що тип і потужність прихованої сили не генеруються випадковим чином?

У всіх іграх Pokemon усі Pokemon (не тільки ті, хто є у вашій партії, ВСІ ПОКЕМОН) мають шість внутрішньо збережених цілих чисел (одне для статі HP, одне для стати атаки, одне для статусу оборони, одне для спеціального статусу атаки, один для спеціальної статистики захисту та один для статистики швидкості) називав їх індивідуальні значення, або IV. Ці значення коливаються в межах від 0 до 31, і вони по суті є одним з небагатьох факторів, що впливають на загальну статистику Pokemon. ЗАРАЗ, вони також визначають тип і потужність прихованої сили!

У поколінні III до V (покоління, алгоритм якого ми будемо реалізовувати) тип прихованої потужності визначається за такою формулою (зверніть увагу на дужки підлоги, це означає, що потрібно округлювати результат):

де a, b, c, d, e і f - найменш значущі біти HP, Attack, Defense, Speed, Sp. Attack, і Sp. Оборона ІV відповідно. (Найменше значущий біт - IV мод 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. Attack і Sp. Оборона IV (у тому порядку знову). (Другий найменш значущий біт складніший, ніж найменш значущий біт. Якщо IV мод 4 дорівнює 2 або 3, то біт дорівнює 1, інакше він дорівнює 0. Якщо у вашій мові є якийсь вбудований або, принаймні, більш розумний спосіб для цього вам, ймовірно, слід скористатися.)


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

Зразок введення:

30 31 31 31 30 31

Вибірка зразка:

Grass 70

Зразок введення:

16 18 25 13 30 22

Вибірка зразка:

Poison 61

Це код-гольф, тому найкоротший код виграє. Удачі!

(І перш ніж люди запитують, я тут використав алгоритм Покоління V, тому що Покоління VI позбавляється від рандомізації потужності і робить його завжди 60. Я не тільки вважаю, що це неймовірно кульгаво, я думаю, що це робить виклик НЕ МОЛЬШОМУ цікавим. Отже для цілей виклику ми проводимо гру V Gen.)


Вибачте, я помилково вимкнув зразок введення та виводу. Ось ви йдете.
спагетто

Деякі додаткові тестові зразки були б непогані :).
Blackhole

Так, мій поганий. Виправлено.
спагетто

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

Тут містяться символи, що не друкуються. Отож ось шістнадцятковий набір:

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


Ого, це було швидко. Хороша робота!
спагетто

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.