ในวิดีโอเกมโปเกมอนผู้เล่นจะถูกส่งออกไปยังโลกเพื่อบังคับให้สัตว์ป่าเป็นลูกบอลขนาดเล็กและฝึกฝนให้ต่อสู้ แน่นอนว่าทุกคนรู้ว่าไม่มีใครเล่น Pokemon ในการต่อสู้ ชุดวาดที่แท้จริงคือโปเกมอนที่จับตัวมันเอง! งานของคุณคือการจำลอง pokeball ในระหว่างการพยายามจับ ความท้าทายนี้จะใช้สูตรการจับ V เจนเนอเรชั่นซึ่งมีดังนี้
HP_max
เท่ากับ HP สูงสุดของโปเกมอนเป้าหมาย HP_current
เท่ากับ HP ปัจจุบันของโปเกมอนเป้าหมาย rate
คืออัตราการจับของโปเกมอนbonus_ball
คือตัวคูณของ pokeball ที่ถูกโยนและbonus_status
เป็น 2.5 หากโปเกมอนเป้าหมายนอนหลับหรือแช่แข็ง 1.5 ถ้าโปเกมอนเป้าหมายนั้นเป็นอัมพาตพิษหรือเผาและ 1 เป็นอย่างอื่น
หลังจากการค้นหาa
คุณจะต้องทำการ "ตรวจสอบการสั่น" สูงสุดสามรายการ 65536 / (255 / a)^(1/4)
น่าจะเป็นของการตรวจสอบการสั่นไหวที่ประสบความสำเร็จคือ หากการตรวจสอบใด ๆ เหล่านี้ล้มเหลวโปเกมอนจะหนีบอล หากการตรวจสอบทั้งสามรายการสำเร็จจะเป็นการจับโปเกมอน!
หมายเหตุ: เมื่อใดก็ตามที่มีการแบ่งผลการแข่งขันจะถูกปัดเศษเป็นทวีคูณของ 1/4096 โดยทั่วไปนี่เป็นรายละเอียดที่ไม่สำคัญ แต่ต้องคำนึงถึงในโปรแกรมของคุณ
ความท้าทายของคุณคือการเขียนโปรแกรมที่ดำเนินการตรวจสอบการสั่นและพิมพ์เพื่อ stdout สถานะของการตรวจสอบ ใน stdin โปรแกรมของคุณจะได้รับ (อย่างน้อย, รายละเอียดด้านล่าง) HP สูงสุดของโปเกมอน, อัตราการจับของโปเกมอนเป้าหมายและชื่อของ pokeball HP สูงสุดและอัตราการดักจับรับประกันได้ว่าจะเป็นจำนวนเต็มในขณะที่ชื่อของ pokeball จะเป็นสตริงเสมอ การป้อนข้อมูลนี้อาจมีลำดับใด ๆ และมีตัวคั่นที่สะดวกสำหรับคุณตราบใดที่มันสอดคล้องกัน สมมติว่าอินพุตถูกต้องไม่จำเป็นต้องจัดการข้อผิดพลาด
ชื่อของ pokeballs ที่คุณต้องการให้การสนับสนุนและตัวคูณ catch ของพวกเขาอยู่ที่นี่:
Poke | 1
Great | 1.5
Ultra | 2
Master | 255
คุณอาจสันนิษฐานว่าเป้าหมายนั้นหลับและอยู่ที่ 1 HP รูปแบบที่คาดหวังสำหรับผลลัพธ์คือ:
(First check failed)
(no output)
(Second check failed)
*shake*
(Third check failed)
*shake*
*shake*
*shake*
(All checks pass)
*shake*
*shake*
*shake*
Click!
(นั่นไม่ใช่การพิมพ์ผิดโปรแกรมของคุณจะต้องไม่สั่นเพียงสองครั้ง)
นี่คือโค้ดกอล์ฟดังนั้นคะแนนของคุณคือจำนวนไบต์ของซอร์สโค้ดของโปรแกรม คะแนนต่ำสุดชนะ
โบนัส!
ฉันบอกว่าคุณอาจคิดว่าโปเกมอนอยู่ที่ 1 HP และหลับ bonus_status
หรือคุณอาจจะอนุญาตให้ผู้ใช้สามารถป้อนข้อมูลโปเกมอนของเอชพีในปัจจุบันและ HP ปัจจุบันของโปเกมอนจะเป็นจำนวนเต็มเท่ากับหรือน้อยกว่า HP สูงสุดbonus_status
เสมอและจะเป็น 2.5, 1.5 หรือ 1 หากคุณทำคุณจะต้องมีค่าเหล่านี้เมื่อสิ้นสุดการป้อนข้อมูลของคุณและเริ่มต้นที่ 1 และ 2.5 หากไม่ได้ให้มา คุณสามารถลบ15คะแนนจากคะแนนของคุณสำหรับการดำเนินการอย่างใดอย่างหนึ่งเหล่านี้หรือ25สำหรับทั้งสอง
นอกจากนี้คุณอาจใช้การจับที่สำคัญ หากการดักจับแบบวิกฤติเกิดขึ้นจะทำการทดสอบการสั่นเพียงครั้งเดียว หากล้มเหลวโปรแกรมจะออกจากโปรแกรมอย่างเงียบ ๆ ถ้าผ่านมันส่งออก:
*shake*
Click!
การจับที่สำคัญกลายเป็นเรื่องธรรมดามากขึ้นเมื่อผู้เล่นรวบรวมโปเกมอนมากขึ้น แต่เพื่อความเรียบง่ายเราจึงสามารถสรุปได้ว่าพวกเขา "จับได้เลย" หากจำนวนที่สร้างแบบสุ่มระหว่าง 0 ถึง 2047 น้อยกว่าa
(ผลลัพธ์ของการคำนวณครั้งแรก) คูณด้วย 2.5 นั่นคือการจับที่สำคัญ การสนับสนุนการบันทึกที่สำคัญช่วยให้คุณสามารถลบ25คะแนนออกจากคะแนนของคุณ
มี pokeball อื่น ๆ อีกมากมายที่คุณอาจเลือกให้การสนับสนุน ชื่อและตัวคูณจับของพวกเขาอยู่ที่นี่:
Safari | 1.5
Sport | 1.5
Lure | 3
Net | 3
Dusk | 3.5
Dive | 3.5
Moon | 4
Fast | 4
Quick | 5
Love | 8
สำหรับแต่ละลูกที่คุณเพิ่มการสนับสนุนคุณอาจลบ(5 + ความยาวของชื่อลูกบอล)ออกจากคะแนนของคุณ
ในที่สุดสำหรับการเตะการได้รับโบนัสทั้งหมด (HP ปัจจุบันและโบนัส _status จาก stdin การจับที่สำคัญและลูกบอลเสริมทั้งหมด 10 ลูก) จะทำให้คุณได้รับโบนัสเพิ่มเติม7คะแนนจากคะแนนรวมเป็น150โบนัสทั้งหมด
ตัวอย่างอินพุต / เอาท์พุต
เพียงเพื่อให้แน่ใจว่าเราทุกคนอยู่ในหน้าเดียวกัน
$ ./balls <<< "19,Ultra,255"
*shake*
*shake*
*shake*
Click!
ขอให้โชคดีและเล่นกอล์ฟอย่างมีความสุข!
65536 / (255 / a)^(1/4)
มากกว่า 1 การตรวจสอบจะสำเร็จโดยอัตโนมัติ ฉันไม่แน่ใจว่าคุณหมายถึงอะไรโดยคำถามที่สอง
rnd < p
หมายถึงการตรวจสอบจะประสบความสำเร็จrnd
ในช่วง 0 และ 1
65536 / (255 / a)^(1/4)
ถ้าจำนวนสุ่มน้อยกว่าการทดสอบการสั่นสำเร็จ
65536 / (255 / a)^(1/4)
แต่ความกล้าของฉันบอกว่ามันมากกว่า 1 คุณตรวจสอบตัวเลขสุ่มในช่วง 0 ถึง 65536 หรือไม่? การตรวจสอบสำเร็จหรือไม่ถ้าหมายเลขสุ่มมีขนาดใหญ่กว่าหรือต่ำกว่า?