Magic: the Gatheringเป็นเกมไพ่ที่ผู้เล่นเล่นไพ่ที่เป็นตัวแทนของสิ่งมีชีวิตซึ่งสามารถโจมตีผู้เล่นอื่นหรือป้องกันการโจมตีของผู้เล่นคนอื่นโดยการปิดกั้น
ในการท้าทายรหัสกอล์ฟโปรแกรมของคุณจะอยู่ในตำแหน่งของผู้เล่นเวทย์มนตร์ตัดสินใจว่าจะบล็อกในการต่อสู้อย่างไร
สัตว์แต่ละตัวมีคุณสมบัติที่เกี่ยวข้องสองประการ ได้แก่ พลังและความทนทาน พลังของสิ่งมีชีวิตคือปริมาณของความเสียหายที่สามารถจัดการในการต่อสู้และความทนทานของมันคือปริมาณของความเสียหายที่จำเป็นในการทำลาย พลังอยู่เสมออย่างน้อย 0 และความเหนียวอยู่เสมออย่างน้อย 1
ระหว่างการต่อสู้ในเวทย์มนตร์ผู้เล่นที่มีเทิร์นจะประกาศสิ่งมีชีวิตบางส่วนของพวกเขาที่จะโจมตีฝ่ายตรงข้าม จากนั้นผู้เล่นคนอื่นที่รู้จักกันในชื่อผู้เล่นป้องกันอาจกำหนดสิ่งมีชีวิตของพวกเขาเป็นบล็อค สิ่งมีชีวิตอาจบล็อกสิ่งมีชีวิตเดียวต่อการต่อสู้ แต่สิ่งมีชีวิตหลายคนอาจบล็อกสิ่งมีชีวิตเดียวกัน
หลังจากบล็อกเกอร์ถูกประกาศผู้เล่นที่โจมตีจะทำการตัดสินใจสำหรับสิ่งมีชีวิตที่ถูกโจมตีแต่ละตัวที่ถูกบล็อกวิธีการกระจายความเสียหาย (เท่ากับพลังของมัน) ที่สิ่งมีชีวิตนั้นเกี่ยวข้องกับสิ่งมีชีวิตที่ปิดกั้น
จากนั้นความเสียหายจะได้รับการจัดการ สัตว์แต่ละตัวจะสร้างความเสียหายเท่ากับพลังของมัน โจมตีสัตว์ที่ถูกปิดกั้นสร้างความเสียหายตามมา สัตว์ที่ไม่ได้รับการปลดบล็อกจะสร้างความเสียหายให้กับผู้เล่นที่ป้องกัน การปิดกั้นสิ่งมีชีวิตสร้างความเสียหายให้กับสิ่งมีชีวิตที่พวกเขาบล็อก สิ่งมีชีวิตที่เป็นของผู้เล่นที่ป้องกันซึ่งไม่ได้บล็อกจะไม่ได้รับความเสียหายใด ๆ (ไม่จำเป็นต้องบล็อกสิ่งมีชีวิต)
ในที่สุดสิ่งมีชีวิตใด ๆ ที่สร้างความเสียหายเท่ากับหรือมากกว่าความทนทานของมันจะถูกทำลายและถูกลบออกจากสนามรบ จำนวนความเสียหายใด ๆ ที่น้อยกว่าความทนทานของสัตว์ไม่มีผล
นี่คือตัวอย่างของกระบวนการนี้:
สิ่งมีชีวิตที่มีพลัง P และความทนทาน T แสดงเป็น P/T
Attacking:
2/2, 3/3
Defending player's creatures:
1/4, 1/1, 0/1
Defending player declares blockers:
1/4 and 1/1 block 2/2, 0/1 does not block.
Attacking player distributes damage:
2/2 deals 1 damage to 1/4 and 1 damage to 1/1
Damage is dealt:
2/2 takes 2 damage, destroyed.
3/3 takes 0 damage.
1/1 takes 1 damage, destroyed.
1/4 takes 1 damage.
0/1 takes 0 damage.
Defending player is dealt 3 damage.
ผู้เล่นที่ป้องกันมี 3 เป้าหมายในการต่อสู้: ทำลายสิ่งมีชีวิตของฝ่ายตรงข้ามรักษาสิ่งมีชีวิตของตัวเองและได้รับความเสียหายน้อยที่สุดเท่าที่จะทำได้ นอกจากนี้สิ่งมีชีวิตที่มีพละกำลังและความเหนียวก็มีค่ามากกว่า
ในการรวมสิ่งเหล่านี้เข้าด้วยกันเราจะบอกว่าคะแนนของผู้เล่นที่ได้รับการปกป้องจากการต่อสู้นั้นเท่ากับผลรวมของพลังและความทนทานของสิ่งมีชีวิตที่ยังมีชีวิตอยู่ ครึ่งหนึ่งของจำนวนความเสียหายที่เกิดขึ้นกับผู้เล่นที่ป้องกัน ผู้เล่นที่ป้องกันต้องการเพิ่มคะแนนนี้ในขณะที่ผู้เล่นที่โจมตีต้องการลดให้น้อยที่สุด
ในการต่อสู้ที่แสดงด้านบนคะแนนคือ:
Defending player's surviving creatures:
1/4, 0/1
1 + 4 + 0 + 1 = 6
Attacking player's surviving creature:
3/3
3 + 3 = 6
Damage dealt to defending player:
3
6 - 6 - 3/2 = -1.5
หากผู้เล่นที่ป้องกันไม่ได้ถูกบล็อคในการต่อสู้ตามที่อธิบายไว้ข้างต้นคะแนนจะเป็น
8 - 10 - (5/2) = -4.5
ทางเลือกที่ดีที่สุดสำหรับผู้เล่นที่ปกป้องจะได้รับการป้องกัน2/2
ด้วย1/1
และ1/4
และปิดกั้นด้วย3/3
0/1
ถ้าพวกเขาทำเช่นนั้นเท่านั้น1/4
และ3/3
จะมีชีวิตรอดและไม่มีความเสียหายจะได้รับการแจกให้ผู้เล่นทีมป้องกันทำให้คะแนน
5 - 6 - (0/2) = -1
ความท้าทายของคุณคือการเขียนโปรแกรมที่จะส่งออกตัวเลือกการปิดกั้นที่ดีที่สุดสำหรับผู้เล่นที่ปกป้อง "ดีที่สุด" หมายถึงตัวเลือกที่เพิ่มคะแนนให้มากที่สุดเนื่องจากคู่ต่อสู้กระจายความเสียหายในลักษณะที่ทำให้คะแนนน้อยที่สุดตามที่คุณบล็อก
นี่คือ maximin: คะแนนสูงสุดเหนือการแจกแจงความเสียหายซึ่งลดคะแนนสำหรับการปิดกั้นแต่ละชุด
อินพุต:อินพุตประกอบด้วยสองรายการของ 2-tuples โดยที่ 2-tuple แต่ละรายการมีรูปแบบ (Power, Toughness) รายการแรกจะมีพลังและความทนทานของสิ่งมีชีวิตที่โจมตีแต่ละชนิด (สิ่งมีชีวิตของคู่ต่อสู้ของคุณ) รายการที่สองจะมีพลังและความทนทานของสิ่งมีชีวิตแต่ละตัวของคุณ
สิ่งอันดับและรายการอาจแสดงในรูปแบบที่สะดวกเช่น:
[[2, 2], [3, 3]]
[[1, 4], [1, 1], [0, 1]]
เอาท์พุท:เอาท์พุทจะประกอบด้วยชุดของ 2-tuples ในรูปแบบ (บล็อกสิ่งมีชีวิตสัตว์ที่ถูกบล็อก) - นั่นคือหนึ่งในสิ่งมีชีวิตของคุณตามด้วยหนึ่งในสิ่งมีชีวิตของพวกเขา สิ่งมีชีวิตจะถูกอ้างอิงโดยดัชนีของพวกเขาในรายการอินพุต ดัชนีอาจเป็นดัชนี 0 หรือ 1 อีกครั้งทุกรูปแบบที่สะดวก คำสั่งใดก็ได้ ตัวอย่างเช่นสถานการณ์การบล็อกที่ดีที่สุดจากด้านบนซึ่งได้รับอินพุตด้านบนอาจแสดงเป็น:
[0, 0] # 1/4 blocks 2/2
[1, 0] # 1/1 blocks 2/2
[2, 1] # 0/1 blocks 3/3
ตัวอย่าง:
Input:
[[2, 2], [3, 3]]
[[1, 4], [1, 1], [0, 1]]
Output:
[0, 0]
[1, 0]
[2, 1]
Input:
[[3, 3], [3, 3]]
[[2, 3], [2, 2], [2, 2]]
Output:
[1, 0]
[2, 0]
or
[1, 1]
[2, 1]
Input:
[[3, 1], [7, 2]]
[[0, 4], [1, 1]]
Output:
[1, 0]
or
[0, 0]
[1, 0]
Input:
[[2, 2]]
[[1, 1]]
Output:
(No output tuples).
อินพุทและเอาท์พุทอาจจะผ่าน STDIN, STDOUT, CLA, ฟังก์ชั่นอินพุต / คืน ฯลฯใช้ช่องโหว่มาตรฐาน นี่คือ code-golf: รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ
เพื่อชี้แจงข้อมูลจำเพาะและให้แนวคิดเริ่มต้นpastebin นี้จะให้บริการโซลูชั่นอ้างอิงใน Python best_block
ฟังก์ชั่นเป็นโซลูชั่นตัวอย่างเพื่อความท้าทายนี้และทำงานโปรแกรมจะให้ข้อมูลอย่างละเอียดมากขึ้นและการส่งออก