ในการท้าทายนี้คุณต้องออกแบบสายพันธุ์ของสิ่งมีชีวิตเซลล์เดียวเพื่อต่อสู้กับความตายในเวที petri-dish เวทีถูกแสดงเป็นกริดสี่เหลี่ยมโดยที่แต่ละเซลล์มีหนึ่งช่องว่าง:
.....x....
...x...o..
...x.c..o.
.......o..
แอตทริบิวต์
ทุกเซลล์มีสามคุณลักษณะ เมื่อระบุเซลล์สปีชีส์ของคุณในตอนเริ่มเกมคุณจะต้องจัดสรร 12 คะแนนระหว่างแอตทริบิวต์เหล่านี้
- Hit Points (HP): หาก HP ของเซลล์ตกลงไปที่ศูนย์มันจะตาย เซลล์ใหม่มี HP เต็ม
- เมื่อเซลล์ตายมันจะทิ้งไว้ข้างหลังศพซึ่งเซลล์อื่นสามารถกินเป็นพลังงานได้
- เซลล์ไม่สามารถฟื้น HP ที่หายไปกลับคืนได้ แต่สามารถสร้างเซลล์ใหม่ด้วย HP เต็มรูปแบบโดยการหาร
- พลังงาน : การกระทำส่วนใหญ่ที่เซลล์สามารถรับได้นั้นต้องการพลังงาน โดยการพักผ่อนอย่างแข็งขันเซลล์สามารถฟื้นพลังงานที่สูญเสียไปจนถึงจำนวนสูงสุดของสปีชีส์
- เซลล์ชนิดที่มีพลังงานน้อยกว่า 5 น่าจะล้มเหลวเพราะไม่สามารถแบ่งเพื่อสร้างเซลล์ใหม่ได้
- เซลล์ไม่สามารถฟื้นพลังงานเกินค่าสูงสุดของสปีชีส์ได้
- เซลล์ที่สร้างขึ้นใหม่มีค่าพลังงานเริ่มต้นคัดลอกมาจากแหล่งกำเนิดของมัน (และค่าสูงสุดกำหนดโดยสเปคของสปีชีส์)
- ความเป็นกรด : หากเซลล์เลือกที่จะระเบิดระดับความเป็นกรดของเซลล์จะใช้ในการคำนวณความเสียหายต่อเซลล์ที่อยู่ติดกัน
การปฏิบัติ
ทุกเทิร์นทุกเซลล์สามารถดำเนินการอย่างใดอย่างหนึ่ง:
ย้าย:เซลล์เคลื่อนที่หนึ่งช่องว่างในทิศทางใดก็ได้ (N / S / E / W / NE / NW / SE / SW) ด้วยต้นทุน 1 พลังงาน
- เซลล์ไม่สามารถเคลื่อนที่ไปยังพื้นที่ที่ถูกครอบครองโดยเซลล์ที่มีชีวิตอื่น
- เซลล์ไม่สามารถย้ายออกจากกริด
- การเคลื่อนที่เข้าสู่เซลล์ศพจะเป็นการทำลายศพ
การโจมตี:เซลล์โจมตีเซลล์ที่อยู่ติดกันสร้างความเสียหาย 1 ถึง 3 โดยการเพิ่มคะแนนพลังงาน 1 ถึง 3
- เซลล์สามารถโจมตีได้ทุกทิศทาง (N / S / E / W / NE / NW / SE / SW)
- มันถูกกฎหมายในการโจมตีเซลล์ที่เป็นมิตร
หาร:เซลล์จะแบ่งและสร้างเซลล์ใหม่ในพื้นที่ที่อยู่ติดกันในราคา 5 พลังงาน
- เซลล์สามารถแบ่งในทิศทางใดก็ได้ (N / S / E / W / NE / NW / SE / SW)
- เซลล์ใหม่มี HP เต็มตามข้อกำหนดเซลล์ดั้งเดิมของคุณ
- เซลล์ใหม่มีพลังงานมากเท่ากับเซลล์แม่หลังจากลบค่าใช้จ่ายในการหาร (ตัวอย่างเช่นเซลล์แม่ที่มีคะแนนพลังงานเริ่มต้น 8 คะแนนจะลดลงเป็น 3 พลังงานและสร้างเซลล์เด็กที่มี 3 พลังงาน)
- เซลล์ใหม่ไม่สามารถทำหน้าที่ได้จนกว่าคุณจะถึงรอบต่อไป
- เซลล์ไม่สามารถแบ่งออกเป็นช่องว่างที่ครอบครองโดยเซลล์ที่มีชีวิต แต่สามารถแบ่งออกเป็นช่องว่างที่ครอบครองโดยศพเซลล์ที่ตายแล้ว (สิ่งนี้จะทำลายศพ)
Eat:เซลล์กินศพเซลล์ที่อยู่ติดกันได้รับพลังงาน 4 ก้อน
- เซลล์สามารถกินได้ทุกทิศทาง (N / S / E / W / NE / NW / SE / SW)
ส่วนที่เหลือ:เซลล์ไม่ทำอะไรเลยสำหรับหนึ่งเทิร์นคืนพลังงาน 2
ระเบิด:เมื่อเซลล์มี HP 3 หรือน้อยกว่าและพลังงานมากกว่า HP มันอาจเลือกที่จะระเบิดสร้างความเสียหายให้กับเซลล์ทั้งแปดที่อยู่ติดกัน
- สร้างความเสียหายต่อเซลล์แต่ละเซลล์ที่อยู่ติดกัน
(exploding cell HP) + (explodng cell acidity)
- เซลล์ที่ถูกระเบิดจะตายและทิ้งไว้ข้างหลังศพเช่นเดียวกับเซลล์ใด ๆ ที่ถูกฆ่าตายในการระเบิด
- สร้างความเสียหายต่อเซลล์แต่ละเซลล์ที่อยู่ติดกัน
โปรโตคอล
ติดตั้ง
โปรแกรมของคุณจะทำงานด้วยสตริงที่BEGIN
ให้ไว้ใน stdin โปรแกรมของคุณจะต้องเขียนไป stdout รายการพื้นที่ที่คั่นของจำนวนเต็ม 3 ที่ไม่ใช่เชิงลบที่เป็นตัวแทนของ HP, พลังงานและความเป็นกรดชนิดมือถือของคุณ: 5 6 1
เช่น ตัวเลขต้องรวมเป็น 12 0
หากคุณต้องการความเป็นกรด (คุณลักษณะอื่น ๆ อาจเป็นศูนย์ แต่การทำเช่นนั้นจะทำให้เสียเกม!)
คุณเริ่มต้นด้วยเซลล์เดียวในมุมตะวันตกเฉียงเหนือหรือตะวันออกเฉียงใต้หนึ่งช่องว่างห่างจากขอบทั้งสอง เซลล์เริ่มต้นมี HP และพลังงานเต็มที่
ทุกเซลล์ทำหน้าที่
ทุกเทิร์นโปรแกรมของคุณจะถูกเรียกใช้หนึ่งครั้งสำหรับทุกเซลล์ที่มีชีวิตอยู่ในทีมของคุณ (ยกเว้นเซลล์ที่เพิ่งสร้างเทิร์นนี้) เพื่อให้เซลล์สามารถทำงานได้ โปรแกรมของคุณมีข้อมูลเกี่ยวกับ stdin ซึ่งรวมถึงสถานะของจานเพาะเชื้อและข้อมูลเกี่ยวกับเซลล์นี้โดยเฉพาะ:
10 4
..........
..xx.c....
...c...o..
......o...
6 3 5 7
ตัวเลขสองตัวแรกแสดงถึงความกว้างและความสูงของที่เกิดเหตุ: ที่นี่มีสนามขนาด 10 คูณ 4
o
เซลล์เป็นของคุณ;x
เซลล์เป็นศัตรูของคุณ (นี่เป็นเรื่องจริงเสมอผู้เล่นแต่ละคนมักเห็นเซลล์ของตัวเองเป็นo
).
พื้นที่ว่างเปล่าc
ช่องว่างแทนศพเซลล์กิน
ตัวเลขหลังบรรทัดว่างแสดงข้อมูลเกี่ยวกับเซลล์นี้:
- ตัวเลขสองตัวแรกเป็น
x,y
พิกัดโดยทำดัชนีจาก0,0
ด้านบนซ้าย (ดังนั้น6 3
นี่หมายถึงo
เซลล์ที่อยู่ใต้สุด) - หมายเลขที่สามคือ HP ของเซลล์; ตัวเลขที่สี่คือพลังงานของเซลล์
โปรแกรมของคุณควรส่งออกการกระทำ (ไปยัง stdout) ในตัวอย่างด้านล่างเราจะใช้N
เป็นทิศทางตัวอย่าง แต่อาจเป็นทิศทางที่ถูกต้องตามกฎหมายสำหรับการกระทำนั้น ( N
/ S
/ E
/ W
/ NE
/ NW
/ SE
/ / SW
) เอาต์พุตของโปรแกรมทั้งหมดไม่คำนึงถึงขนาดตัวพิมพ์ แต่ตัวอย่างจะใช้ตัวพิมพ์ใหญ่ การดำเนินการเอาท์พุทใด ๆ ที่ไม่ถูกต้อง (เนื่องจากมีไวยากรณ์ที่ไม่ถูกต้องหรือพยายามกระทำที่ผิดกฎหมาย) จะถูกละเว้นและผลลัพธ์ในเซลล์REST
ไอเอ็นจี (และทำให้ได้รับ 2 พลังงาน)
MOVE N
DIVIDE N
EAT N
ATTACK N 2
- ตัวเลขแสดงถึงความแข็งแกร่งของการโจมตี (1 - 3)REST
EXPLODE
ตาของทีมของคุณประกอบด้วยเซลล์ทั้งหมดของคุณได้รับโอกาสในการทำหน้าที่หนึ่งต่อหนึ่ง เซลล์ทั้งหมดของคุณทำหน้าที่ก่อนที่เซลล์ของฝ่ายตรงข้ามจะทำหน้าที่ เมื่อเซลล์ทั้งหมดของคุณทำหน้าที่ตาคุณจะสิ้นสุดและตาคุณของฝ่ายตรงข้ามจะเริ่มขึ้น เมื่อทุกเซลล์ของคู่ต่อสู้ของคุณทำหน้าที่คุณจะเริ่มต้นอีกครั้ง ภายในตาคุณแต่ละเซลล์จะได้รับการจัดลำดับความสำคัญให้ดำเนินการตามอายุ: เซลล์ที่เก่าแก่ที่สุดในทีมของคุณทำหน้าที่ก่อนเซลล์ที่อายุน้อยกว่า
ตัวอย่าง
นี่คือวิธีการทำงานของโปรแกรม อินพุตจาก stdin แสดงที่นี่ด้วย>
ลูกศรนำ(แยกออกจากอินพุตจริงด้วยการล้างพื้นที่) และเอาต์พุตบน stdout มี<
ลูกศร
> BEGIN
< 5 6 1
จากนั้นโปรแกรมจะถูกเรียกใช้อีกครั้ง:
> 10 4
> ..........
> .o........
> ........x.
> ..........
>
> 1 1 5 6
< DIVIDE SE
หลังจากเทิร์นของคู่ต่อสู้ของคุณ (ผู้ตัดสินใจว่าจะDIVIDE W
ใช้เซลล์เริ่มต้นเดียว) โปรแกรมของคุณจะถูกเรียกสองครั้งหนึ่งครั้งสำหรับแต่ละเซลล์:
> 10 4
> ..........
> .o........
> ..o....xx.
> ..........
>
> 1 1 5 1
< MOVE E
สำหรับการขอรอบที่สองในตาคุณ:
> 10 4
> ..........
> ..o.......
> ..o....xx.
> ..........
>
> 2 2 5 1
< MOVE SE
หมายเหตุเซลล์ที่สองนี้จะเห็นสถานะกระดานที่ได้รับการปรับปรุงตามการเคลื่อนไหวของเซลล์อื่นก่อนหน้านี้ในตาคุณ โปรดทราบว่าเซลล์นี้ถูกสร้างขึ้นด้วย 1 พลังงานเนื่องจากเซลล์แม่มี 6 พลังงานเมื่อดำเนินการแบ่งครั้งสุดท้าย (ดังนั้นเดิม 6 ลบค่าใช้จ่ายพลังงาน 5 ส่วนของการสร้างเซลล์เด็กที่มี 1 พลังงาน)
ตอนนี้ตาคุณจบแล้วและตาคุณของฝ่ายตรงข้ามเริ่มขึ้น เซลล์ตรงข้ามทั้งสองจะได้รับโอกาสในการลงมือทำและเมื่อถึงเทิร์นถัดไปของคุณจะเริ่มขึ้น
ชัยชนะ
คุณสามารถชนะโดย:
- ทำลายเซลล์ที่เป็นปฏิปักษ์ทั้งหมดหรือ
- มีเซลล์มากกว่าคู่ต่อสู้ของคุณหลังจากที่ผู้เล่นแต่ละคนจบ 150 รอบแล้ว
การให้คะแนนจะขึ้นอยู่กับจำนวนชัยชนะใน 100 เกมต่อการส่งต่อ ๆ กัน ครึ่งหนึ่งของการจำลองสถานการณ์โปรแกรมของคุณจะได้รับอนุญาตให้ดำเนินการก่อน
เกมเสมอ (คือจำนวนเซลล์ที่เท่ากันอย่างแน่นอนหลังจากผ่าน 150 รอบหรือมีเพียงเซลล์ที่เหลือเท่านั้นที่ถูกสังหารด้วยกันในการระเบิด) จะไม่ถูกนับรวมในผลรวมการชนะของผู้เล่น
ข้อมูลอื่น ๆ
- โปรแกรมของคุณไม่ควรพยายามรักษาสถานะ (นอกเหนือจากการใช้สถานะของจาน Petri): สิ่งมีชีวิต monocellular ไม่มีความทรงจำที่ดีมากและตอบสนองต่อโลกในแต่ละช่วงเวลา โดยเฉพาะอย่างยิ่งการเขียนไปยังไฟล์ (หรือที่เก็บข้อมูลอื่น) การสื่อสารกับเซิร์ฟเวอร์ระยะไกลหรือการตั้งค่าตัวแปรสภาพแวดล้อมจะไม่ได้รับอนุญาตอย่างชัดเจน
- ผลงานจะถูกเรียกใช้ / เรียบเรียงบน Ubuntu 12.04.4
- เฉพาะเกมที่ทำคะแนนได้ 100 เกมนั้นยังไม่ได้รับการยืนยัน แต่น่าจะเกี่ยวข้องกับสนามกีฬาหลายขนาด (ตัวอย่างเช่น 50 เกมบนเวทีเล็ก ๆ และ 50 เกมบนเวทีใหญ่) สำหรับเวทีขนาดใหญ่ฉันอาจเพิ่มจำนวนเทิร์นสูงสุดเพื่อให้แน่ใจว่าการต่อสู้ที่เหมาะสมจะเกิดขึ้น
ทรัพยากร
นี่คือรหัสขับรถที่วิ่งจำลองที่เขียนขึ้นสำหรับ Node.js node petri.js 'first program' 'second program'
เรียกได้ว่าเป็น ยกตัวอย่างเช่นบ่อเซลล์หลามเขียนกับมือถือ Java node petri.js 'python some_cell.py' 'java SomeCellClass'
เขียนอาจมีลักษณะเช่น
นอกจากนี้ฉันเข้าใจว่าการอ่านและการแยกวิเคราะห์หลายบรรทัดใน stdin อาจเป็นความเจ็บปวดอย่างมากดังนั้นฉันจึงได้ร่างตัวอย่างเซลล์ที่สมบูรณ์สองสามภาษาเป็นภาษาต่าง ๆ ซึ่งคุณมีอิสระในการต่อเติมยกเครื่องทั้งหมดหรือเพิกเฉยอย่างสิ้นเชิง
- เซลล์ Java
- เซลล์ Python
- เซลล์ JavaScript (สำหรับใช้กับ Node.js)
แน่นอนคุณมีอิสระที่จะเขียนเซลล์ในภาษาอื่น นี่เป็นเพียงสามภาษาที่ฉันตัดสินใจเขียนรหัสสำเร็จรูปเพื่อช่วยประหยัดเวลา
หากคุณมีปัญหาในการเรียกใช้ไดรเวอร์โปรดอย่าลังเลที่จะส่ง Ping ไปที่ห้องแชทที่ฉันสร้างขึ้นสำหรับความท้าทายนี้ หากคุณมีชื่อเสียงไม่เพียงพอสำหรับการแชทให้แสดงความคิดเห็น
'node c:/cell/cell_template.js'
สำหรับแต่ละอาร์กิวเมนต์เช่นเดียวกับที่คุณต้องระบุ'java CellTemplate'
สำหรับรหัส Java ฉันจะทำให้ชัดเจนขึ้นในข้อความท้าทาย หากคุณมีปัญหาในสไตล์เรา (และคนอื่น ๆ ที่มีปัญหาทางด้านเทคนิค) สามารถดำเนินการต่อการสนทนานี้ในห้องสนทนาที่ฉันได้ทำเพียง