เกมหิว - กินหรือตาย
ถ้าคุณไม่กินคุณก็ตาย ถ้าคุณกินคุณมีชีวิตอยู่ (จนกว่าคุณจะตาย) คุณจะตายดังนั้นพยายามที่จะตายครั้งสุดท้าย
ภาพรวม
มีเกาะที่เต็มไปด้วยฝูงสัตว์ที่เป็นเหยื่อ คุณสามารถควบคุมนักล่าห้าคน เป้าหมายของคุณคือรักษาแพ็คของคุณให้มีชีวิตอยู่ ทำได้โดยกินเหยื่อ เหยื่อมีแนวโน้มที่จะหนีจากผู้ล่าและพยายามอยู่ในฝูงเป็นอย่างอื่น แน่นอนว่าแพ็คของคุณจะอยู่ในเขตเดียวกันกับชุดอื่น ๆดังนั้นการแข่งขันจะพยายามกินพวกเขาก่อนที่คุณจะสามารถ อย่าปล่อยให้เรื่องนี้ทำให้คุณท้อใจหรือคุณจะอดอาหาร
วิธีการเล่น
สร้างและส่งโปรแกรมบรรทัดคำสั่งเพื่อกำกับแพ็คของคุณ มันจะรับข้อมูลสถานะจากโปรแกรมควบคุมบน STDIN และคำสั่งเอาต์พุตบน STDOUT รูปแบบดังกล่าวมีรายละเอียดด้านล่าง แต่ละโปรแกรมจะดำเนินการเพียงครั้งเดียวและจะต้องทำงานต่อไปจนกว่าจะไม่มีสมาชิกแพ็คอีกต่อไป คุณจะต้องอ่านอินพุตเมื่อเข้ามาและตอบกลับอย่างรวดเร็ว มีการหมดเวลาที่เข้มงวด 200ms สำหรับการตอบกลับแต่ละครั้ง หากคุณยังไม่ตอบกลับแพ็คของคุณจะไม่ได้รับคำแนะนำใหม่สำหรับเทิร์นปัจจุบัน
หากโปรแกรมของคุณไม่สามารถเรียกใช้งานได้โดยคอนโทรลเลอร์จะถือว่าไม่ถูกต้อง โปรดรวมสตริงบรรทัดคำสั่งที่ฉันจะต้องใช้ในการเรียกใช้การส่งของคุณ หากมีคำแนะนำพิเศษใด ๆ (สำหรับการตั้งค่าคอมไพเลอร์ ฯลฯ ) โปรดรวมไว้ด้วย หากฉันไม่สามารถทำงานได้ฉันจะขอความช่วยเหลือในความคิดเห็น หากคุณไม่ตอบสนองฉันจะไม่สามารถยอมรับการส่งของคุณได้
การแข่งขันจะจัดขึ้นในระบบ Linux 64 บิต โปรดระลึกไว้เสมอเมื่อมีคำแนะนำที่จำเป็น
รายละเอียด
ตำแหน่งและทิศทางของสิ่งมีชีวิตแต่ละตัวอยู่ในรูปแบบของตัวเลขทศนิยมที่มีความแม่นยำสองเท่า (เช่น
double
) แทนx
และy
พิกัดตามลำดับสิ่งมีชีวิตแต่ละตัวถือว่าเป็นจุด ซึ่งหมายความว่าพวกเขาสามารถทับซ้อนกันและครอบครองพื้นที่เดียวกัน คุณจะไม่ถูกชนและไม่มีแนวคิดที่จะปะทะกับสัตว์อื่น ๆ
เกาะนี้มีสี่เหลี่ยมจัตุรัส 500 ด้าน หากคุณพยายามที่จะเสี่ยงเกินขอบเขตเหล่านั้นคุณจะถูกบีบลงบนขอบ ต้นกำเนิด
{0,0}
อยู่ที่ด้านซ้ายบนโดยx
เพิ่มขึ้นไปทางขวาและy
เพิ่มขึ้นลง อีกครั้งแผนที่ไม่ห่อเกมเริ่มต้นด้วย1,500 + (packCount * 50)สัตว์ล่าเหยื่อ พวกเขาจะรวมตัวกันในใจกลางของเกาะ แต่ตัดสินใจอย่างรวดเร็วว่าจะเริ่มเคลื่อนไหว
แพ็คจะถูกจัดเรียงในวงกลมเว้นระยะเท่ากันรอบปริมณฑล การสั่งซื้อแพ็คจะถูกสับเปลี่ยนดังนั้นอย่านับที่การเริ่มต้นในสถานที่เฉพาะ
สัตว์ที่เป็นเหยื่อสามารถมองเห็นสัตว์อื่น ๆ ทั้งหมดภายในรัศมี30หน่วย พวกเขาสามารถเคลื่อนที่ได้สูงสุด6.0หน่วยต่อเทิร์น
นักล่าสามารถมองเห็นสัตว์อื่น ๆ ทั้งหมดภายในรัศมี50หน่วยพวกเขาสามารถเคลื่อนที่ได้สูงสุด6.1หน่วยต่อเทิร์น ซึ่งหมายความว่าพวกเขาสามารถเห็นเหยื่อก่อนที่จะเห็นและ (แทบ) เอาชนะพวกเขา
นักล่าจะมีชีวิตและตายตามระดับความหิว มันเริ่มต้นที่1,000และลดลงทีละคน หากหลังจากการเคลื่อนไหวผู้ล่าอยู่ในระยะ 1 หน่วยของเหยื่อมันจะกินมันโดยอัตโนมัติ สิ่งนี้จะลบเหยื่อและตั้งค่าความหิวของนักล่าเป็น 1,000 นักล่าแต่ละคนสามารถกินเหยื่อเพียงคนเดียวต่อเทิร์น หากมีมากกว่าหนึ่งอยู่ในช่วงมันจะกินสิ่งใดก็ตามที่ห่วงถึงก่อน (ไม่จำเป็นต้องใกล้เคียงที่สุด) นักล่าจะตายถ้าความหิวของมันถึงศูนย์
แพ็คเริ่มต้นด้วยห้าสมาชิกแต่ละคน ทุก ๆ5000รอบการบรรจุทั้งหมดในเกมจะมีสมาชิกใหม่หนึ่งคน มันจะถูกวางไว้ในช่วงที่มองเห็นได้ของสมาชิกแพ็คเพื่อน ตรวจสอบให้แน่ใจว่ารายการของคุณสามารถจัดการกับสมาชิกมากกว่าห้าคน
ทุกๆ1,000รอบเหยื่อจะวางไข่มากขึ้น จำนวนเหยื่อใหม่จะเป็นจำนวนผู้ล่าที่มีชีวิตลบหนึ่งตัว
ผู้ล่าไม่สามารถโจมตีผู้ล่ารายอื่นได้ พวกเขากินเหยื่อเมื่อพวกมันจับได้ แค่นั้นแหละ.
คำสั่งซื้อภายในเทิร์นคือ:
- เหยื่อทุกคนตัดสินใจ
- นักล่าทุกคนจะตัดสินใจ
- ย้ายเหยื่อทั้งหมด
- นักล่าทุกคนย้าย / กิน
คำสั่งซื้อแต่ละแพ็คทำให้การตัดสินใจ / การเคลื่อนไหวของพวกเขาจะถูกสุ่มในแต่ละเทิร์น
พิธีสาร (ทั่วไป)
US-ASCII
การสื่อสารทั้งหมดจะทำในรูปแบบสตริง ตัวเลขจะถูกแปลงเป็นสตริงโดยใช้ Java ของหรือDouble.toString()
Integer.toString()
เอาต์พุตของคุณจะต้องจัดรูปแบบเพื่อให้สามารถอ่านได้โดย Java Double.valueOf(String)
(คุณจะไม่ได้รับการส่งออกจำนวนเต็ม) สำหรับรายละเอียดเกี่ยวกับรูปแบบ parseable ดูที่เอกสาร Double
เขตข้อมูลทั้งหมดบนเส้นจะถูกคั่นด้วยมาตรฐานตัวอักษรและการขึ้นบรรทัดใหม่เป็น\t
สตริงทั้งหมดจะถูกยกเลิกจะไบต์\n
null\0
ในตัวอย่างด้านล่างฉันใช้<>
เพื่อทำเครื่องหมายเขตข้อมูลเพื่อประโยชน์ในการอ่าน สิ่งเหล่านี้ไม่ปรากฏในสตริงที่แท้จริง
โปรโตคอล (อินพุต)
สตริงอินพุตมีความยาวแตกต่างกันไปขึ้นอยู่กับจำนวนสัตว์ที่มองเห็นได้ในแพ็คของคุณ มันสามารถมีความยาวเกิน 100k ตัวอักษรดังนั้นเตรียมพร้อมสำหรับสิ่งนั้น การตั้งค่าพื้นฐานคือ:
บรรทัดที่ 0: ข้อมูลพื้นฐานเกี่ยวกับเกม
turn
คือหมายเลขเทิร์นปัจจุบันและการนับเป็นจำนวนรวมของเหยื่อและผู้ล่าที่เหลือในสนาม เหล่านี้อยู่integer
ในรูปแบบสตริง<turn>\t<preyCount>\t<predatorCount>\n
บรรทัดที่ 1: รหัสที่ไม่ซ้ำกันและระดับความหิวของสมาชิกแพ็คของคุณ สิ่งเหล่านี้ไม่ได้อยู่ในลำดับเดียวกันสำหรับทุกอินพุต ใช้รหัสที่ไม่ซ้ำกันเพื่อติดตามสมาชิกแต่ละคนไม่ใช่ลำดับที่ปรากฏในอินพุต อีกครั้งสิ่งเหล่านี้
integer
เป็นสตริง สำหรับแพ็คสองอันนี้จะเป็น:<id[0]>\t<hunger[0]>\t<id[1]>\t<hunger[1]>\n
บรรทัดที่ 2: ตำแหน่งสมาชิกแพ็คของคุณในลำดับเดียวกับที่ได้รับในบรรทัด 1 เหล่านี้
double
เป็นสตริง:<x[0]>\t<y[0]>\t<x[1]>\t<y[1]>\n
บรรทัดต่อไปนี้จะมีการแสดงผลแพ็คแต่ละสมาชิกในลำดับเดียวกับที่ได้รับในบรรทัด 1 เหล่านี้จะได้รับเป็นสองบรรทัดต่อสมาชิก
ครั้งแรกสำหรับแต่ละประกอบด้วยสถานที่สำหรับเหยื่อที่เขาเห็น ที่สองคือสถานที่สำหรับนักล่าที่เขาเห็น ตำแหน่งที่ตั้งเหล่านี้ไม่เหมือนกันทั้งหมด ตัวอย่างเช่นหากสมาชิกกลุ่มสองคนสามารถเห็นสัตว์ชนิดเดียวกันมันจะอยู่ในสตริงของสมาชิกทั้งสอง นอกจากนี้สมาชิกแพ็คของคุณจะถูกรวม หากคุณต้องการยกเว้นสถานที่เหล่านั้นคุณอาจต้องการเปรียบเทียบสถานที่กับสมาชิกของคุณเอง สถานที่ทั้งหมดอยู่ในdouble
รูปแบบสตริง
สำหรับสมาชิกแต่ละคนที่ยังมีชีวิตอยู่:
<prey[0].x>\t<prey[0].y>\t<prey[1].x>\t<prey[1].y>\n
<predator[0].x>\t<predator[0].y>\t<predator[1].x>\t<predator[1].y>\n
ในที่สุดตัวละครสุดท้ายจะอยู่\0
ที่จุดเริ่มต้นของบรรทัดถัดไป
ข้อยกเว้น:ถ้าคุณได้รับอินพุตdead\0
แพ็คของคุณจะตาย จบโปรแกรมของคุณด้วยความกรุณา ผู้ควบคุมควรปิดกระบวนการที่มีชีวิตทั้งหมดเมื่อปิด แต่ฉันไม่ต้องการให้มีกระบวนการซอมบี้ทั่วสถานที่ คุณอาจรวมถึงการหมดเวลาป้อนข้อมูลด้วย ตัวอย่างเช่นคลาสตัวอย่างของฉันจะสิ้นสุดลงหากไม่ได้รับอินพุตเป็นเวลา 15 วินาที
โปรโตคอล (เอาท์พุท)
ผลผลิตง่าย คุณจะให้ค่าหนึ่งคู่double
สำหรับสมาชิก live pack แต่ละคน สิ่งเหล่านี้แสดงถึงการเคลื่อนไหวที่คุณต้องการให้พวกเขาทำในเทิร์นนี้ ตัวอย่างเช่นถ้าสิ่งมีชีวิตของคุณในขณะที่{100.0, 100.0}
คุณให้พวกเขามีคำสั่งของพวกเขาจะย้ายไป{-1.0, 1.0}
{99.0, 101.0}
ตัวเลขทั้งหมดจะอยู่ในบรรทัดเดียวคั่นด้วยแท็บ
ตัวอย่างเช่นหากคุณมีสมาชิก 3 คนที่ยังมีชีวิตอยู่นี่จะเป็นการตอบสนองที่ถูกต้อง:
1.0\t-1.0\t2.0\t-2.0\t3.0\t-3.0\0
นี้จะย้ายสิ่งมีชีวิตของคุณโดย{1.0,-1.0}
, และ{2.0,-2.0}
{3.0,-3.0}
คำสั่งซื้อนั้นเหมือนกับที่ได้รับในอินพุต อย่าลืมตอนจบ\0
!
หากคุณป้อนข้อมูลไม่ถูกต้องผลลัพธ์ที่ไม่ดีจะตามมา หากไม่สามารถแยกวิเคราะห์ตัวเลขเดี่ยวใด ๆ a double
มันจะกลายเป็นศูนย์ หากไม่สามารถแยกสตริงทั้งหมดจะไม่มีคำแนะนำใหม่และชุดทั้งหมดของคุณจะใช้เส้นทางจากเทิร์นก่อนหน้า
ทุกทิศทางจะถูกจับยึดไว้ที่ระยะสูงสุด 6.1 หน่วย คุณสามารถเคลื่อนที่ช้ากว่านี้ได้หากต้องการ ตัวอย่างเช่น{1, 0}
จะย้ายคุณหนึ่งหน่วย {6,8}
(ระยะทาง 10) จะย้ายคุณ 6.1 {3.66, 4.88}
หน่วยและจะลดไปประมาณ ทิศทางคงที่
สำคัญ:โปรแกรมควบคุมจะอ่านทั้ง STDOUT และ STDERR ของคุณ หากคุณส่งข้อยกเว้นและพิมพ์ไปที่ STDERR เป็นไปได้ยากมากที่ข้อความจะอยู่ในรูปแบบของการตอบกลับที่ถูกต้อง พยายามหลีกเลี่ยงการทำเช่นนี้
โปรแกรมควบคุม / การทดสอบ
แหล่งสำหรับการควบคุมที่สามารถพบได้ที่นี่ที่ bitbucket.org คุณจะต้องรวบรวมมันก่อนที่จะทำงาน คลาสหลักคือGame
และคลาสทั้งหมดอยู่ในแพ็คเกจเริ่มต้น หากต้องการเรียกใช้ให้รวมคำสั่งแต่ละชุดเป็นอาร์กิวเมนต์แยกต่างหาก ตัวอย่างเช่นหากคุณต้องการเรียกใช้ Java ChaserPack และ Python LazyPack.py คุณสามารถใช้:
java Game "java ChaserPack" "python LazyPack.py"
บนแผนที่เหยื่อจะปรากฏเป็นสีเขียวและผู้ล่าจะเป็นสีแดง อย่างไรก็ตามแพ็คใดก็ตามที่เป็นแพ็คแรกที่ได้รับเนื่องจากการโต้แย้งจะเป็นสีน้ำเงินแทน สิ่งนี้มีจุดประสงค์เพื่อแยกความแตกต่างได้ง่ายขึ้นสำหรับจุดประสงค์ในการทดสอบ นักล่าจะกระพริบสีขาวเป็นห้าเฟรมเมื่อพวกเขากิน
เกมดังกล่าวจะดำเนินต่อไปจนกว่าผู้ล่าคนสุดท้ายจะอดตายเขียนถึงคอนโซลเมื่อเกิดความอดอยากหรือการสูญพันธุ์ เมื่อเกมเสร็จสิ้นคะแนนจะได้รับสำหรับแต่ละแพ็ค หากคุณไม่ต้องการเห็นเหตุการณ์ความอดอยาก / การสูญพันธุ์คุณสามารถใช้-silent
อาร์กิวเมนต์ จากนั้นมันจะส่งออกคะแนนสุดท้ายเท่านั้น คุณต้องผ่านสิ่งนี้เป็นอาร์กิวเมนต์แรก :
java Game -silent "java ChaserCat" "./someOtherPack"
รวมเป็นชุดโครงกระดูก Java GenericPack
ชื่อ มันรวมถึงการดำเนินงานอินพุต / เอาท์พุตพื้นฐานที่จำเป็น มันอยู่ที่นั่นเพื่อให้ตัวอย่างที่ชัดเจนของวิธีการแยกและตอบกลับ หากคุณต้องการเพิ่มเทมเพลตในภาษาอื่นให้ฉันรู้
ChaserPack
รวมทั้งยังเป็นนักล่าในแม่แบบตาม มันจะไม่รวมอยู่ในทัวร์นาเมนต์และจะรวมอยู่ในการทดสอบเท่านั้น มันทำงานค่อนข้างแย่เนื่องจากข้อบกพร่องของการกำหนดเป้าหมายโดยเจตนา หากคุณไม่สามารถเอาชนะได้ลองต่อไป
ด้านล่างนี้เป็นตัวอย่างการใช้งานโปรแกรมควบคุม (คลิกเพื่อดูวิดีโอ) คุณภาพของวิดีโอนั้นไม่ดี (ขออภัย) แต่คุณสามารถรับรู้ได้ว่าเหยื่อเคลื่อนไหวอย่างไร ( ข้อควรระวัง: เสียง )
เกณฑ์การให้คะแนน
ผู้ชนะจะถูกกำหนดโดยทัวร์นาเมนต์รับคะแนนในแต่ละรอบ
แต่ละรอบจะดำเนินต่อไปจนกว่านักล่าทั้งหมดจะตาย แต่ละแพ็คจะได้รับคะแนนตามเมื่อสมาชิกคนสุดท้ายเสียชีวิตจากความอดอยาก พวกเขาจะได้รับคะแนนตามลำดับ คะแนนจะสะสมเป็นเวลาสิบรอบและผู้ชนะคือกลุ่มที่มีคะแนนรวมสูงสุด
สถานที่แรกสำหรับแต่ละรอบจะได้รับ 100 คะแนน สำหรับแต่ละสถานที่หลังจากนั้นรางวัลจะลดลง 20% (ปัดเศษลง) สิ่งนี้จะดำเนินต่อไปจนกว่าคะแนนจะถึงศูนย์ (หลังจากที่ 17) สถานที่ 18+ จะไม่ได้รับคะแนนสำหรับรอบ แพ็คที่เสมอกันจะได้รับคะแนนเท่ากัน ตัวอย่างเช่น:
1st : 100
2nd : 80
3rd : 64 (T)
3rd : 64 (T)
4th : 51
...
17th: 1
18th: 0
19th: 0
คะแนนสูงสุดที่เป็นไปได้ตลอดการแข่งขันคือ 1,000 จากสถานที่แรกทั้งสิบครั้ง
หากหลายรายการสิ้นสุดการแข่งขันที่ผูกไว้สำหรับสถานที่แรกการแข่งขันรอบสิบอื่น ๆ จะถูกจัดขึ้นโดยมีเพียงรายการแรกที่ส่ง สิ่งนี้จะดำเนินต่อไปจนกว่าจะมีผู้ชนะหนึ่งคน
ฉันจะพยายามเล่นทัวร์นาเมนต์ทุกสัปดาห์โดยประมาณหรือเมื่อมีการส่งใหม่ ๆ
กฎเพิ่มเติม (เล่นอย่างยุติธรรม!)
คุณไม่สามารถอ่านหรือเขียนทรัพยากรภายนอกใด ๆ เนื่องจากคุณจะไม่เรียกใช้โปรแกรมของคุณหลาย ๆ ครั้งข้อมูลสถานะใด ๆ จึงสามารถเก็บไว้ภายในได้
อย่ารบกวนกระบวนการ / การส่งอื่น ๆ สิ่งนี้ไม่ได้หมายความว่าอย่าพยายามขโมยเหยื่อของพวกเขาวิ่งเร็วกว่า ฯลฯ หมายความว่าอย่ารบกวนการทำงานของกระบวนการ นี่คือดุลยพินิจของฉัน
ผู้เข้าแข่งขันถูก จำกัด ไว้ไม่เกินสามรายการ หากคุณส่งมากกว่านี้ฉันจะให้คะแนนสามอันดับแรกเท่านั้นที่ส่ง หากคุณต้องการเพิกถอนให้ลบออก
คอมเมนต์อาจไม่ได้มีไว้เพื่อโพสต์รายการอื่น ๆ แต่ละคนควรเล่นเพื่อชนะด้วยตนเอง
โปรแกรมของคุณอาจวางกระบวนการลูกได้สูงสุดครั้งละหนึ่งรายการ (การสืบทอดทั้งหมดไม่ใช่โดยตรง) ไม่ว่าจะด้วยวิธีใดให้แน่ใจว่าคุณไม่ได้หมดเวลา คุณไม่สามารถเรียก
Game
ชั้นเรียนได้ด้วยวิธีใด ๆ
ผลลัพธ์ - 29 เมษายน 2014
นี่คือผลการแข่งขันสิบรอบล่าสุด:
Clairvoyant : 1000
EcoCamels : 752
Netcats : 688
RubySpiders : 436
RubyVultures : 431
CivilizedBeasts : 382
LazyPack : 257
แพ็คที่ส่งก่อน 09:00 EDT 2014/04/29 จะรวมอยู่ในการเรียกใช้นี้
คุณสามารถดูรายละเอียดของแต่ละรอบได้ ด้วยเหตุผลบางอย่างฉันตัดสินใจที่จะนับจำนวนรอบย้อนหลังดังนั้นจึงเริ่มต้นด้วย "รอบ 10"
อัพเดท
2014/04/23 : FGreg รายงานข้อผิดพลาดเกี่ยวกับการหมดเวลา (ขอบคุณ!) มีการใช้งานการแก้ไขดังนั้นผู้ทดสอบจะต้องการอัปเดตรหัสโปรแกรมควบคุม