เป็นวันคริสต์มาสในเดือนกรกฎาคมดังนั้นจะมีวิธีใดที่ดีไปกว่าการเฉลิมฉลองการแลกเปลี่ยนของขวัญช้างเผือกเสมือนจริง!
สำหรับการท้าทาย King of the Hill นี้คุณต้องสร้างบอทที่เล่นในการจำลองการแลกเปลี่ยนช้างเผือกพยายามที่จะได้รับของขวัญที่มีค่าสูงสุดเท่าที่จะทำได้
กฎของเกม
- เกมจะเล่นในหลายรอบแต่ละรอบประกอบด้วยจำนวนรอบที่แตกต่างกัน
- การตั้งค่ารอบ : จะมีของขวัญให้มากที่สุดเท่าที่มีผู้เล่นในเกมแต่ละค่าจะมีการสุ่มอย่างสม่ำเสมอในช่วง [0 ... 1) ด้วยค่านี้จะไม่เป็นที่รู้จักจนกว่าจะมีการเปิด "ปัจจุบัน" ผู้เล่นจะถูกสุ่มวางในคิว ผู้เล่นคนแรกจะถูกตอกจากด้านหน้าคิว
- เมื่อถึงคราวของผู้เล่นพวกเขาอาจจะเปิดของขวัญหรือขโมยของขวัญของผู้เล่นคนอื่นผ่านหันไปหาผู้เล่นที่ถูกขโมยในปัจจุบัน
- ของขวัญแต่ละชิ้นอาจถูกขโมยได้สูงสุด 3 ครั้ง
- คุณไม่สามารถขโมยจากผู้เล่นที่ขโมยมาจากคุณ
- ผู้เล่นแต่ละคนสามารถมีเพียงหนึ่งครั้งในปัจจุบัน
- หลังจากเปิดของขวัญเล่นไปยังผู้เล่นคนต่อไปที่โผล่ออกมาจากด้านหน้าของคิว นี่จะเป็นผู้เล่นคนถัดไปตามลำดับที่ยังไม่ได้เทิร์น
- รอบสุดท้าย : เมื่อเปิดของขวัญทั้งหมดแล้วรอบนั้นจะสิ้นสุดลงและมูลค่าของของขวัญที่ผู้เล่นแต่ละคนถืออยู่จะถูกเพิ่มเข้าไปในคะแนนของผู้เล่นนั้น รอบใหม่เริ่มต้นขึ้นโดยผู้เล่นแต่ละคนจะไม่มีของขวัญและผู้เล่นสั่งสับ
- Game End : เกมจะจบลงเมื่อผู้เล่นอย่างน้อยหนึ่งคนมีคะแนน
100500 คะแนนโดยชัยชนะจะมอบให้กับผู้เล่นที่มีมูลค่ารวมสูงสุดของของขวัญ
การเข้ารหัส
การส่งทั้งหมดควรเข้ากันได้กับ Python 3.7 WhiteElephantBot
คุณต้องเขียนชั้นเรียนที่สืบทอดโดยตรงจาก ตัวอย่างเช่น
class FooBot(WhiteElephantBot):
# Your implementation here
คุณอาจจะให้__init__
วิธีการ (ซึ่งจะใช้เวลาหนึ่งอาร์กิวเมนต์name
) super().__init__(name)
ในชั้นเรียนบอทของคุณซึ่งจะต้องเรียก ชั้นเรียนของคุณจะต้องมีtake_turn
วิธีการที่คาดหวังข้อโต้แย้งต่อไปนี้ในลำดับนี้:
players
: รายชื่อผู้เล่นตามลำดับของผู้เล่นทั้งหมดที่ยังไม่มีของขวัญpresents
: พจนานุกรมที่แมปชื่อผู้เล่นกับ 2-tuples ที่มีมูลค่าปัจจุบันที่ผู้เล่นคนนั้นถือครองและจำนวนครั้งที่มีการขโมย ซึ่งจะรวมถึงผู้เล่นอื่น ๆ ที่กำลังถือของขวัญอยู่ในปัจจุบันjust_stole
: หากการกระทำล่าสุดถูกขโมยไปจะเป็นชื่อของผู้เล่นที่ขโมยมาNone
ถ้าไม่ได้ก็จะเป็น
แต่ละข้อโต้แย้งจะไม่เปลี่ยนรูปหรือวัตถุใหม่เพื่อให้กลายพันธุ์ใด ๆ ของพวกเขาจะไม่ส่งผลกระทบต่อเกม คุณสามารถเก็บสำเนาของข้อโต้แย้งใด ๆ หากคุณต้องการ
ค่าตัวอย่างสำหรับpresents
:
{
'Alice': (0.35, 0),
'Bob': (0.81, 2),
'Charlie': (0.57, 1)
}
take_turn
วิธีการของคุณควรคืนชื่อผู้เล่นที่คุณต้องการขโมยจากหรือNone
เพื่อเปิดของขวัญ หากมีข้อยกเว้นให้ส่งคืนสิ่งอื่นที่ไม่ใช่str
หรือNone
หรือชื่อของผู้เล่นที่คุณไม่สามารถขโมยได้คุณจะเปิดของขวัญตามค่าเริ่มต้น
ตัวสร้างของคุณจะถูกเรียกที่จุดเริ่มต้นของแต่ละรอบดังนั้นคุณจะไม่จำสถานะจากรอบต่อรอบ
โดยการสืบทอดจากWhiteElephantBot
คุณจะสามารถเข้าถึงsteal_targets
วิธีการที่จะนำเสนอ dict และjust_stole
และส่งกลับรายชื่อผู้เล่นที่คุณสามารถขโมยได้
โมดูลใด ๆ ที่คุณต้องการสคริปต์จะต้องนำเข้าที่ด้านบนของรายการของคุณ
ทดสอบไดร์เวอร์
ขับทดสอบที่สามารถพบได้ที่นี่ คุณไม่จำเป็นต้องรวมfrom white_elephant import WhiteElephantBot
ไว้ในคำตอบที่โพสต์ของคุณอย่างไรก็ตามโมดูลท้องถิ่นจะต้องทำเช่นนั้น
คู่แข่งหลัก
- สุ่ม : สุ่มเลือกว่าจะเปิดของขวัญใหม่หรือขโมยพร้อมกับเป้าหมายขโมยที่เลือกแบบสุ่ม
- โลภ : ขโมยของกำนัลที่มีค่าที่สุดที่สามารถถูกขโมยได้ หากไม่สามารถขโมยของขวัญได้ให้เปิดของกำนัล
- นิสัยดี : เปิดของขวัญใหม่เสมอ ไม่เคยขโมย
กฎเพิ่มเติม
- มันเป็นความรับผิดชอบของคุณในการตรวจจับข้อยกเว้นทั้งหมด หากคลาสของคุณไม่สามารถตรวจพบข้อยกเว้นคลาสนั้นจะถูกตัดสิทธิ์ นอกจากนี้โปรดอย่าจับ KeyboardInterrupts
- อย่าใช้ไฟล์หรือวิธีการอื่นเพื่อหลีกเลี่ยงการไม่สามารถบันทึกสถานะระหว่างเกมได้ ตัวอย่างเช่นคุณไม่สามารถบันทึกสถานะเครือข่ายนิวรัลลงในไฟล์ที่เรียกใช้งานได้
- บอทของคุณจะต้องอยู่ในรหัสชั้นเรียนและค่าคงที่ที่เกี่ยวข้อง
- คุณสามารถใช้การนำเข้าไลบรารีมาตรฐานเท่านั้น
- ไม่มีข้อกำหนดด้านประสิทธิภาพที่เข้มงวด มีเหตุผลและรอบคอบ หากประสิทธิภาพกลายเป็นปัญหาฉันขอสงวนสิทธิ์ในการเพิ่มการ จำกัด เวลา
หนึ่งรายการต่อคนหากคุณส่งมากกว่าหนึ่งรายการบอทของคุณอาจไม่ทำงานร่วมกัน ตอนนี้ฉันจะอนุญาตให้เข้าร่วมหลายรายการต่อคนแม้ว่าฉันจะทำการตรวจสอบอีกครั้งในภายหลังหากเป็นปัญหา- นี่เป็นการแข่งขันแบบเปิดที่ไม่มีวันสิ้นสุดที่แตกต่างกัน มันจะเริ่มใหม่ทุกครั้งที่ฉันสามารถทำได้เมื่อมีการเปลี่ยนแปลงที่สำคัญ
แก้ไข 1: เปลี่ยนคะแนนผู้ชนะจาก 100 เป็น 500 เพื่อให้การจัดอันดับสอดคล้องกันมากขึ้น โปรแกรมควบคุมการทดสอบมีการแก้ไขข้อบกพร่องใหม่และยังสะท้อนถึงการเปลี่ยนแปลงคะแนนชนะ
EDIT2: ชี้แจงบันทึกการนำเข้าที่ต้องการ
ลีดเดอร์บอร์ด (จนถึง 8 ส.ค. 2561)
- SampleBot (500.093)
- LastMinuteBot (486.163)
- RobinHood (463.160)
- OddTodd (448.825)
- GreedyBot (438.520)
- SecondPlaceBot (430.598)
- ThresholdBot (390.480)
- นักพนัน (313.362)
- NiceBot (275.536)
- RandomBot (256.172)
- GoodSamaritan (136.298)