เครื่องคิดเลขพลังงานที่ซ่อนอยู่


15

หนึ่งในเหตุผลที่ฉันรักโปเกมอนเสมอเพราะสำหรับเกมที่ดูง่าย ๆ มันมีความซับซ้อนหลายระดับ ลองมาดูท่าซ่อนเร้นพลัง ในเกมประเภทและพลัง (อย่างน้อยก่อน Generation VI) ของ Hidden Power นั้นแตกต่างกันไปสำหรับโปเกมอนทุกตัวที่ใช้มัน! มันเจ๋งใช่มั้ย ตอนนี้คุณจะแปลกใจไหมถ้าฉันบอกคุณว่าประเภทและพลังของ Hidden Power นั้นไม่ได้สร้างแบบสุ่ม?

ในเกมโปเกมอนทุกเกมโปเกมอนทั้งหมด (ไม่ใช่แค่เกมในปาร์ตี้ของคุณ POKEMON ทั้งหมด) มีจำนวนเต็มหกที่เก็บไว้ภายใน (หนึ่งสำหรับ HP stat หนึ่งสำหรับการโจมตีสถิติหนึ่งสำหรับการป้องกันสถิติหนึ่งสำหรับการโจมตีพิเศษสถิติ หนึ่งสำหรับสถิติการป้องกันพิเศษและหนึ่งสำหรับสถิติความเร็ว) เรียกว่าค่าของแต่ละบุคคลหรือ IV ค่าเหล่านี้มีค่าอยู่ระหว่าง 0 ถึง 31 และโดยพื้นฐานแล้วเป็นหนึ่งในปัจจัยสองสามอย่างที่มีผลต่อสถานะโดยรวมของโปเกมอน อย่างไรก็ตามพวกเขายังกำหนดประเภทและพลังของ Hidden Power!

ใน Generation III ถึง V (ยุคที่อัลกอริทึมที่เราจะนำไปใช้) ประเภทของพลังที่ซ่อนอยู่จะถูกกำหนดโดยสูตรต่อไปนี้ (จดวงเล็บพื้นซึ่งหมายความว่าคุณต้องปัดเศษผลลัพธ์):

โดยที่ a, b, c, d, e และ f เป็นบิตที่สำคัญน้อยที่สุดของ HP, Attack, Defense, Speed, Sp การโจมตีและ Sp Defense 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 Defense IVs (ตามลำดับนั้นอีกครั้ง) (บิตที่มีนัยสำคัญน้อยที่สุดที่สองนั้นซับซ้อนกว่าและที่สำคัญน้อยที่สุดถ้า IV mod 4 เป็น 2 หรือ 3 ดังนั้นบิตคือ 1 มิฉะนั้นก็คือ 0 หากภาษาของคุณมีการติดตั้งภายในหรืออย่างน้อยก็ฉลาดกว่า หากต้องการทำสิ่งนี้คุณควรใช้มัน)


ความท้าทายที่นี่คือการเขียนโปรแกรมที่ใช้จำนวนเต็มหกจำนวนคั่นด้วยช่องว่างผ่าน STDIN ซึ่งเป็นตัวแทนของ HP, Attack, Defense, Speed, Sp โจมตีและ Sp Defense IV ของโปเกมอน (ตามลำดับ) และแสดงประเภทและพลังของ Hidden Power ของโปเกมอนนั้น

ตัวอย่างอินพุต:

30 31 31 31 30 31

ตัวอย่างผลลัพธ์:

Grass 70

ตัวอย่างอินพุต:

16 18 25 13 30 22

ตัวอย่างผลลัพธ์:

Poison 61

นี่คือรหัส - กอล์ฟดังนั้นรหัสที่สั้นที่สุดจึงชนะ โชคดี!

(และก่อนที่ผู้คนจะถามฉันใช้อัลกอริธึม Generation V ที่นี่เพราะ Generation VI กำจัดการสุ่มพลังงานและทำให้เป็น 60 เสมอไม่เพียง แต่ฉันคิดว่านี่เป็นง่อยอย่างไม่น่าเชื่อฉันคิดว่ามันเป็นการท้าทายที่น่าสนใจมาก สำหรับจุดประสงค์ของการท้าทายเรากำลังใช้งานเกม Gen V)


ขออภัยฉันออกจากตัวอย่างอินพุตและเอาต์พุตโดยไม่ได้ตั้งใจ ไปเลย
สปาเก็ตตี้

ตัวอย่างทดสอบเพิ่มเติมจะดี :)
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

สิ่งนี้มีตัวอักษรที่ไม่สามารถพิมพ์ได้ ดังนั้นนี่คือ 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 | 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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.