คนขับทดสอบ • อภิปรายการท้าทาย • ส่งนักผจญภัย
( แหล่งรูปภาพ )
นักผจญภัยคู่ต่อสู้หลายคนกำลังบุกหาซากปรักหักพังเพื่อหาสมบัติ แต่พวกเขาสามารถบรรทุกได้ครั้งละมากและมีข้อ จำกัด ด้านความอดทน พวกเขาต้องการได้รับสมบัติที่มีค่าที่สุดและออกไปก่อนที่พวกเขาจะเหนื่อยเกินไปที่จะดำเนินการต่อ พวกเขาพยายามที่จะเป็นคนรวยที่สุดเท่าที่จะทำได้จากการขโมยของ shenanigans
เพลย์
นักผจญภัยแต่ละคนจะเริ่มในห้องแรกของดันเจี้ยนที่มี 1,000 คะแนนความแข็งแกร่งและพื้นที่ 50 กก. ในกระเป๋าเป้สะพายหลังของพวกเขา
เกมดังกล่าวทำงานในแบบเทิร์นเบสโดยผู้เล่นทุกคนสามารถแก้ไขผลัดกันได้ในเวลาเดียวกัน ในแต่ละเทิร์นคุณสามารถทำสิ่งใดสิ่งหนึ่งต่อไปนี้:
- ย้ายไปที่ห้องถัดไป
- ย้ายไปที่ห้องก่อนหน้า
- เสนอราคาความแข็งแกร่งที่จะใช้สมบัติ
- วางสมบัติ
การย้ายระหว่างห้องต้องใช้ความแข็งแกร่ง 10 อย่างบวก 1 สำหรับทุกๆ 5 กิโลกรัมในกระเป๋าเป้ของคุณ ตัวอย่างเช่นนักผจญภัยที่มีสมบัติ 3 กิโลกรัมต้องใช้ความแข็งแกร่ง 11 ระดับในการเคลื่อนย้ายและน้ำหนัก 47 กิโลกรัมหนึ่งตัวต้องใช้ความแข็งแกร่ง 20 ชิ้นในการเคลื่อนย้าย
การทิ้งสมบัติต้องใช้ 1 ความแข็งแกร่งโดยไม่คำนึงถึงสมบัติที่ลดลง
เมื่อออกจากซากปรักหักพังผู้เล่นจะไม่ถูกเลี้ยวอีกต่อไป
หากผู้เล่นไม่สามารถดำเนินการใด ๆ เหล่านี้ได้ (เนื่องจากการขาดความแข็งแกร่งหรือขาดสมบัติ) นักผจญภัยของพวกเขาจะเสียชีวิตจากความเหนื่อยล้าทะลักสมบัติที่ถือไว้ในห้องที่ถูกครอบครองในปัจจุบัน ในทำนองเดียวกันหากผู้เล่นพยายามกระทำที่ไม่ถูกต้องนักผจญภัยของพวกเขาจะถูกฆ่าโดยกับดักแทนทำให้เกิดการรั่วไหลของสมบัติเดียวกัน
คำสั่ง
การเสนอราคาขั้นต่ำสำหรับขุมทรัพย์คือ 1 เรี่ยวแรงต่อ 1 กิโลกรัมที่สมบัติมีน้ำหนัก คุณอาจเสนอราคาคะแนนความแข็งแกร่งเพิ่มเติมเพื่อให้ได้รับสมบัติ ความแข็งแกร่งที่ถูกเสนอราคาถูกใช้ไปไม่ว่าผลลัพธ์จะออกมาเป็นอะไร
ในกรณีที่ผู้เล่นหลายคนมีการเสนอราคาเพื่อใช้สมบัติเดียวกันผู้เล่นที่เสนอราคาสูงสุดจะได้รับสมบัติ หากผู้เล่นมากกว่าหนึ่งคนทำการเสนอราคาสูงสุดจะไม่มีใครได้รับสมบัติ
เงื่อนไขการชนะ
ผู้เล่นที่มีมูลค่ารวมมากที่สุดคือผู้ชนะ ในกรณีที่ไม่เสมอกันเสมอไปที่น้ำหนักรวมที่น้อยที่สุดจากนั้นจำนวนของสมบัติที่น้อยที่สุดจากนั้นให้มูลค่าของสมบัติที่มีค่าที่สุดที่มีค่ามากที่สุดที่สองที่มีค่าที่สามที่สาม ... จนกว่าเน็คไทจะเสีย ในเหตุการณ์ที่ใกล้เป็นไปไม่ได้ที่ยังมีการผูกกัน ณ จุดนี้ผู้ขับทดสอบบอกว่า "ขันมัน" และผู้ชนะจะถูกตัดสินโดยพลการ
ในบริบทของทัวร์นาเมนต์ผู้เล่นจะได้รับอันดับที่ 1 ซึ่งได้รับ 10 คะแนนอันดับที่สองที่มี 9 คะแนนอันดับที่สามกับ 8 คะแนนและอื่น ๆ ... โดยผู้เล่นที่ตายแล้วและนักผจญภัยที่ไม่มีขุมทรัพย์ให้คะแนน 0 คะแนน
เกี่ยวกับซากปรักหักพัง
- ห้องพักแต่ละห้องแรกมีระหว่างและสมบัติ (โดยที่คือหมายเลขห้อง)
- มีหลายห้องโดยพลการ จำกัด โดยความแข็งแกร่งของนักผจญภัยและความเต็มใจที่จะสำรวจ
- แต่ละขุมทรัพย์จะมีมูลค่าเป็นเงิน (เป็นเงินทั้งหมด) และน้ำหนัก (เป็นกิโลกรัมทั้งหมด)
- สมบัติมีค่ามากกว่าและมีอยู่มากมายเมื่อคุณเข้าไปในซากปรักหักพัง
- สูตรเฉพาะสำหรับการสร้างสมบัติมีดังนี้ (ใช้สัญกรณ์สำหรับลูกเต๋าม้วน)
- น้ำหนักถูกสร้างขึ้นครั้งแรกโดยใช้สูตร (ขั้นต่ำ 1)
- ค่าสมบัติจะถูกสร้างผ่าน (โดยที่คือหมายเลขห้องและคือน้ำหนัก)
ข้อมูลที่ปรากฏแก่ผู้เล่น
ในแต่ละเทิร์นผู้เล่นจะได้รับข้อมูลต่อไปนี้:
- จำนวนห้องที่พวกเขาอยู่ในปัจจุบันนี่คือ 1 ดัชนีดังนั้นแนวคิดทางออกอยู่ที่ "ห้อง 0"
- รายการสมบัติที่อยู่ในห้องในขณะนี้
- รายชื่อผู้เล่นคนอื่น ๆ ที่อยู่ในห้องด้วย
- คลังสมบัติปัจจุบันของคุณ
- ระดับความแข็งแกร่งของคุณในปัจจุบัน
การเข้ารหัส
คุณควรใช้คลาสย่อยของคลาสนี้Adventurer
:
class Adventurer:
def __init__(self, name, random):
self.name = name
self.random = random
def get_action(self, state):
raise NotImplementedError()
def enter_ruins(self):
pass
คุณจะต้องแทนที่get_action
วิธีการ enter_ruins
ทำงานก่อนที่เกมจะเริ่มต้นขึ้นและเป็นโอกาสของคุณในการเตรียมสิ่งที่คุณต้องการให้พร้อมสำหรับเกม คุณไม่จำเป็นต้องแทนที่__init__
และคุณไม่ควร หาก__init__
เกิดปัญหาของคุณคุณจะถูกตัดสิทธิ์
get_action
รับอาร์กิวเมนต์เดี่ยวซึ่งเป็นnamedtuple
ฟิลด์ต่อไปนี้ (ตามลำดับนี้หากคุณต้องการทำลาย):
room
: จำนวนห้องที่คุณอยู่ในปัจจุบันtreasures
: รายการสมบัติในห้องplayers
: รายชื่อผู้เล่นอื่นในห้อง คุณได้รับชื่อผู้เล่นด้วยวิธีนี้เท่านั้นดังนั้นคุณจึงไม่ทราบว่าบอทควบคุมอะไรหรือคลัง / ความแข็งแกร่งของพวกเขาinventory
: รายการสมบัติในกระเป๋าเป้ของคุณstamina
: ระดับความแข็งแกร่งในปัจจุบันของคุณ
วัตถุนี้ยังให้คุณสมบัติของอรรถประโยชน์สองอย่างเพิ่มเติม:
carry_weight
: น้ำหนักรวมของขุมทรัพย์ทั้งหมดที่คุณกำลังบรรทุกtotal_value
: มูลค่ารวมของสมบัติทั้งหมดที่คุณกำลังถือ
treasures
และinventory
รายการประกอบด้วยnamedtuple
s ด้วยคุณสมบัติเหล่านี้:
name
: ชื่อสมบัติ (เพื่อความสวยงาม)value
: มูลค่าทางการเงินของสมบัติเป็น $weight
: น้ำหนักของสมบัติเป็นกิโลกรัม
get_action
ควรคืนหนึ่งในค่า / รูปแบบต่อไปนี้:
'next'
หรือ'previous'
เพื่อย้ายไปยังห้องถัดไป / ก่อนหน้า'take', <treasure index>, <bid>
(ใช่เป็นทูเปิลถึงแม้ว่าลำดับใด ๆ ในทางเทคนิคจะทำงานได้ดีเช่นกัน) เพื่อเสนอราคาสมบัติที่ดัชนีที่กำหนดในรายการสมบัติของห้อง อาร์กิวเมนต์ทั้งสองควรเป็นจำนวนเต็ม ลอยจะถูกปัดเศษลง'drop', <inventory index>
เพื่อทิ้งสมบัติที่หาได้ที่ดัชนีที่กำหนด ดัชนีควร (ตามธรรมชาติ) เป็นจำนวนเต็ม
ข้อ จำกัด อื่น ๆ
- คุณสามารถใช้อินสแตนซ์แบบสุ่มที่ให้ไว้กับคุณในระหว่างการเริ่มต้นสำหรับการสุ่มหลอกเท่านั้น
- ไม่อนุญาตให้มีสิ่งอื่นใดที่อาจนำไปสู่ ความตั้งใจที่นี่คือการทำให้บอททำงานเหมือนกันเมื่อได้รับเมล็ดเดียวกันเพื่อช่วยในการทดสอบบอตใหม่ (และอาจเป็นข้อบกพร่องในโปรแกรมควบคุมการทดสอบ) เฉพาะรังสีคอสมิกควรทำให้เกิดการเบี่ยงเบน / nondeterminism ใด ๆ
- โปรดทราบว่ารหัสแฮชจะถูกสุ่มใน Python 3 ดังนั้นจึง
hash
ไม่อนุญาตให้ใช้สำหรับการตัดสินใจใด ๆdict
s ใช้ได้แม้เมื่อใช้คำสั่งวนซ้ำเพื่อการตัดสินใจเนื่องจากรับประกันการสั่งซื้ออย่างสม่ำเสมอตั้งแต่ Python 3.6
- คุณไม่สามารถหลีกเลี่ยงการใช้ไดรเวอร์ทดสอบโดยใช้
ctypes
แฮ็กหรือinspect
สแต็ควูดู (หรือวิธีอื่นใด) มีบางสิ่งที่น่ากลัวอย่างน่าประทับใจที่คุณสามารถทำได้กับโมดูลเหล่านั้น โปรดอย่า- บอทแต่ละบ็อกซ์นั้นมีเหตุผลที่ดีในการป้องกันการคัดลอกและความไม่เปลี่ยนแปลงตามธรรมชาติของ
namedtuple
s แต่ก็มีช่องโหว่ / ช่องโหว่ที่ไม่สามารถจับคู่ได้ - ฟังก์ชั่นอื่น ๆ จาก
inspect
และctypes
อาจใช้งานได้ตราบใดที่ไม่ใช้เพื่อหลีกเลี่ยงการทำงานของคอนโทรลเลอร์ - ไม่อนุญาตให้ใช้วิธีการจับอินสแตนซ์ของบ็อตอื่นในเกมปัจจุบันของคุณ
- บอทแต่ละบ็อกซ์นั้นมีเหตุผลที่ดีในการป้องกันการคัดลอกและความไม่เปลี่ยนแปลงตามธรรมชาติของ
- บอตควรดำเนินงานเดี่ยวและไม่สามารถประสานงานกับบ็อตอื่น ๆ ไม่ว่าด้วยวิธีใด ๆ ซึ่งรวมถึงการสร้างสองบอทโดยมีเป้าหมายที่แตกต่างกันเช่นที่หนึ่งเสียสละตัวเองเพื่อความสำเร็จ เมื่อมีคู่แข่งมากกว่า 10 รายคุณจะไม่ได้รับการรับรองว่ามีบอทสองตัวในเกมเดียวกันและชื่อนักผจญภัยไม่ได้บ่งบอกคลาสบ็อตดังนั้นกลยุทธ์ประเภทนี้จึง จำกัด
- ขณะนี้ไม่มีการ จำกัด เวลาในการดำเนินการอย่างหนัก แต่ฉันขอสงวนสิทธิ์ในการ จำกัด การใช้ในอนาคตหากการแข่งขันเริ่มต้นใช้เวลานานเกินไป มีเหตุผลและพยายามที่จะประมวลผลเทิร์นต่ำกว่า 100msเนื่องจากฉันไม่คิดว่าจะต้อง จำกัด ไว้ต่ำกว่าเกณฑ์นั้น (ทัวร์นาเมนต์จะใช้เวลาประมาณ 2 ชั่วโมงหากบอตทั้งหมดใช้เวลาประมาณ 100ms ต่อเทิร์น)
- คลาสบอตของคุณจะต้องมีชื่อไม่ซ้ำกันในทุกการส่ง
- คุณไม่สามารถจำอะไรได้ระหว่างเกม (อย่างไรก็ตามคุณสามารถจดจำสิ่งต่าง ๆ ระหว่างรอบได้ )
- อย่าแก้ไข sys.modules ตัวแปรอินสแตนซ์ที่อยู่นอกสิ่งใดควรถูกถือว่าเป็นค่าคงที่
- คุณไม่สามารถแก้ไขโค้ดของบ็อตใด ๆ โดยทางโปรแกรมรวมถึงของคุณเอง
- ซึ่งรวมถึงการลบและกู้คืนรหัสของคุณ นี่คือการทำให้การดีบักและการแข่งขันมีความคล่องตัวยิ่งขึ้น
- รหัสใด ๆ ที่ทำให้ตัวควบคุมล้มเหลวจะถูกตัดสิทธิ์ทันที ในขณะที่ข้อยกเว้นส่วนใหญ่จะถูกจับบางคนอาจผ่านไปและ segfaults ไม่สามารถจับได้ (ใช่คุณสามารถใช้ segfault ใน Python ได้ด้วย
ctypes
)
การส่ง
เพื่อช่วยในการคัดคำตอบให้ระบุชื่อของบอทของคุณที่ด้านบนของคำตอบด้วย#Header1
และตรวจสอบให้แน่ใจว่าคำตอบของคุณมีรหัสบล็อกอย่างน้อยหนึ่งบล็อก คุณไม่จำเป็นต้องรวมการนำเข้าหรือเอกสารใด ๆ เนื่องจากมีดโกนจะถูกเพิ่มโดยอัตโนมัติ
ฉันจะมีแนวโน้มที่จะถอนคำตอบมากขึ้นด้วยคำอธิบายที่ละเอียดและเข้าใจง่าย คนอื่น ๆ มีแนวโน้มที่จะประพฤติตัวเหมือนกัน
คำตอบของคุณควรมีรูปแบบดังนี้:
# Name of Bot
Optional blurb
#imports go here
class BotName(Adventurer):
#implementation
Explanation of bot algorithm, credits, etc...
(แสดงผลเป็น)
ชื่อ ธ ปท
ประกาศแจ้งทางเลือก
#imports go here class BotName(Adventurer): #implementation
คำอธิบายของอัลกอริทึม bot เครดิต ฯลฯ ...
เรียกใช้การทดสอบไดรเวอร์ในเครื่อง
คุณจะต้องใช้ Python 3.7+ และฉันแนะนำให้คุณติดตั้งtabulate
ผ่าน pip ขูดหน้านี้สำหรับการส่งนอกจากนี้ยังต้องและlxml
requests
คุณควรใช้เทอร์มินัลพร้อมรองรับ ANSI color escapes เพื่อผลลัพธ์ที่ดีที่สุด ข้อมูลเกี่ยวกับวิธีการตั้งค่านี้ใน Windows 10 สามารถพบได้ที่นี่
เพิ่มบ็อตของคุณไปยังไฟล์ในไดเรกทอรีย่อยภายในไดเรกทอรีเดียวกันกับruins.py
( ruins_bots
โดยค่าเริ่มต้น) และอย่าลืมเพิ่มfrom __main__ import Adventurer
ไปที่ด้านบนของโมดูล นี้จะถูกเพิ่มโมดูลเมื่อมีดโกนดาวน์โหลดส่งของคุณและในขณะที่มันเป็น hacky แน่นอนนี้เป็นวิธีที่ตรงไปตรงมามากที่สุดของการทำให้แน่ใจว่า ธ Adventurer
ปทคุณอย่างถูกต้องมีการเข้าถึง
บอตทั้งหมดในไดเรกทอรีนั้นจะถูกโหลดแบบไดนามิกเมื่อรันไทม์ดังนั้นไม่จำเป็นต้องทำการเปลี่ยนแปลงเพิ่มเติม
การแข่งขัน
ผู้ชนะเลิศจะได้รับการพิจารณาในชุดของเกมที่มีมากถึง 10 บอทในแต่ละเกม หากมีการส่งมากกว่า 10 รายการบอท 10 อันดับแรกจะถูกกำหนดโดยแบ่งพาร์ติชันเป็น 10 กลุ่มอย่างเป็นระบบจนกว่าบอททุกเกมจะเล่น (ตรง) 20 เกม บอท 10 อันดับแรกจะถูกเลือกจากกลุ่มนี้ด้วยคะแนนรีเซ็ตและจะเล่นเกมจนกว่าบอทแรกจะได้รับแต้ม 50 แต้มเหนือบอทที่สองหรือจนถึง 500 เกมที่เล่น
จนกว่าจะมีการส่งอย่างน้อย 10 ครั้งช่องว่างจะเต็มไปด้วย "Drunkards" ซึ่งเดินสุ่มผ่านซากปรักหักพังและนำสมบัติสุ่ม (และบางครั้งทิ้ง) จนกว่าพวกเขาจะวิ่งออกจากความแข็งแกร่งและต้องตรงไปที่ทางออก
การแข่งขันจะเริ่มใหม่ทุกสัปดาห์หากมีการส่งใหม่ นี่เป็นความท้าทาย KOTH แบบเปิดโดยไม่มีวันที่สิ้นสุด
ลีดเดอร์บอร์ด
ตั้งแต่วันที่ 4 พฤษภาคม 2019 เวลา 16:25 นพ MDT: (2019-05-04 4:25 -6: 00)
Seed: K48XMESC
Bot Class | Score | Mean Score
--------------+---------+--------------
BountyHunter | 898 | 7.301
Scoundrel | 847 | 6.886
Accountant | 773 | 6.285
Ponderer | 730 | 5.935
Artyventurer | 707 | 5.748
PlanAhead | 698 | 5.675
Sprinter | 683 | 5.553
Accomodator | 661 | 5.374
Memorizer | 459 | 3.732
Backwards | 296 | 2.407
อัปเดต - 15 เมษายน: การอัปเดต / การชี้แจงกฎสองข้อ
อัปเดต - 17 เม.ย. : ห้ามไม่ให้มีคดีขอบสองสามคดีที่น่ารังเกียจเช่นการแก้ไขโค้ดของบอทอื่น ๆ
อัพเดท - 4 พฤษภาคม: มอบรางวัลให้กับ Sleafar สำหรับทำลายย้อนหลังอย่างแน่นอน ขอแสดงความยินดี!
pip
ติดตั้งและเปิดPATH
(ซึ่งเป็นค่าเริ่มต้นสำหรับการติดตั้งใหม่ AFAIK) จากนั้นคุณสามารถเรียกใช้pip install modulename
ในพรอมต์คำสั่ง สำหรับสถานการณ์อื่น ๆ (ซึ่งฉันไม่รู้) ไปที่pipค้นหาโมดูลที่ต้องการและเลือกตัวเลือก