การประกวดเสร็จสิ้น! อ่านความคิดเห็นเกี่ยวกับ blobs เพื่อดูคะแนนของพวกเขา
KOTH นี้เป็นแรงบันดาลใจอย่างอิสระโดยรองพื้นของคัดเลือกโดยธรรมชาติจำลอง บอทของคุณคือหยด เพื่อความอยู่รอดคุณต้องกินเม็ดเพื่อฟื้นพลังงานซึ่งใช้ในการย้าย ด้วยพลังงานพิเศษหยดสามารถแบ่งออกเป็นสอง
พลังงานและการเคลื่อนไหว
หยดของคุณเริ่มต้นแต่ละรอบด้วยพลังงาน 100 ครั้งและไม่มีขีด จำกัด ปริมาณพลังงานที่สามารถรวบรวมได้ แต่ละรอบวิ่งเป็นรอบโดยแต่ละหยดมีตัวเลือกให้เคลื่อนที่ทิศเหนือทิศตะวันออกทิศใต้หรือทิศตะวันตกในรอบที่กำหนดหรือหยุดนิ่ง การเคลื่อนย้ายใช้พลังงาน 1 พลังงานและพลังงานนิ่งอยู่ที่ 0.25 ความยาวด้านของแผนที่คือceil(0.25 * blobCount) * 2 - 1
หน่วยอย่างน้อย 9 หน่วย Blobs ทั้งหมดเริ่มต้นที่ขอบของแผนที่โดยมีหนึ่งวางในแต่ละมุมและทุกหยดถัดไปจะถูกวางไว้ 2 หน่วยจากคนอื่น ๆ ทุกๆ 30 รอบคลื่นของเม็ดจะถูกวางในจุดสุ่มรอบแผนที่อย่างน้อย 1 หน่วยจากขอบใด ๆ แต่ละครั้งที่คลื่นของเม็ดปรากฏขึ้นปริมาณของเม็ด (แต่เดิมจำนวนสองเท่าของ blobs หรือความกว้างของแผนที่แล้วแต่จำนวนใดจะใหญ่กว่า) ในคลื่นถัดไปจะลดลง 1 โดยบังคับให้จำนวน blobs ลดลงเมื่อเวลาผ่านไป เม็ดแต่ละคืนพลังงานระหว่าง 5 และ 15 เมื่อพลังงานของหยดน้อยกว่าหรือเท่ากับ 0 มันจะตาย
การรับประทานอาหาร
หากสองคนหรือมากกว่านั้น blobs พยายามที่จะครอบครองสถานที่เดียวกันคนที่มีพลังงานมากที่สุดจะกินคนอื่น ๆ และได้รับพลังงาน หากทั้งคู่มีพลังงานเท่ากันทั้งคู่จะหายไป
การตรวจจับและข้อมูล
Blobs สามารถเห็นเม็ดหรือ blobs อื่น ๆ ในระยะ 4 หน่วย เมื่อฟังก์ชั่นของพวกเขาถูกเรียก blobs มีให้กับ:
- ความยาวด้านของแผนที่
- ตำแหน่งของหยดบนแผนที่
- ตำแหน่งของเม็ดทั้งหมดภายในรัศมีการค้นหาของพวกเขาเช่นเดียวกับค่าของพวกเขา
- ตำแหน่งของ blobs ทั้งหมดที่อยู่ในรัศมีการค้นหารวมถึงพลังงานและ UID
- พลังงาน UID และที่ตั้งของหยดที่มีการใช้งานฟังก์ชัน
- วัตถุเก็บข้อมูลที่ไม่ซ้ำกับ blob
- วัตถุหน่วยเก็บข้อมูลที่ใช้ร่วมกันโดย blobs ทั้งหมดที่เกี่ยวข้องกับ blob ผ่านการแยก
รุนแรง
หากหยดมีพลังงานมากกว่า 50 ก็สามารถเลือกที่จะแยก การแยกมีค่าใช้จ่าย 50 พลังงานและพลังงานที่เหลืออยู่ใด ๆ จะถูกแบ่งเท่า ๆ กันระหว่างสอง blobs Blobs ทั้งหมดเป็นต้นฉบับหรือสำเนาที่แยกโดยที่ทุกสำเนาจะมีการติดตามกลับไปที่ต้นฉบับ ทั้งหมดนี้รวมกันเป็น "ญาติ" ญาติทุกคนมีที่เก็บข้อมูลส่วนกลางหนึ่งชิ้น ญาติยังสามารถกินซึ่งกันและกันและสามารถแยกใช้วัตถุเก็บของตัวเองหรือเก็บพลังงานโดยไม่ส่งผลกระทบต่อผู้อื่น
การถ่ายโอนพลังงาน
หากสอง blobs อยู่ติดกัน (หลังจากเคลื่อนที่) หนึ่งในบอทสามารถถ่ายโอนพลังงานไปที่อื่นได้ นี้จะกระทำโดยการกลับSendNorth(amt)
, SendEast(amt)
, SendSouth(amt)
หรือSendWest(amt)
มีamt
เป็นจำนวนคิดเป็นจำนวนเงินที่ส่ง นี่อาจเป็นจำนวนเท่าใดก็ได้ที่ผู้ส่งสามารถทำได้รวมถึงพลังงานทั้งหมดของพวกเขา ขอแนะนำให้หยดที่ได้รับพลังงานบอกว่ายังคงอยู่ในที่เก็บข้อมูลของชุมชนเพื่อไม่ให้เคลื่อนที่เมื่อพลังงานถูกถ่ายโอน (แม้ว่าพลังงานจะไม่ถูกหักออกจากยอดรวมของผู้ส่งในกรณีนี้)
ฟังก์ชั่นการจัดเก็บและ UID
เพื่อให้มีพฤติกรรมการเรียนรู้ที่ซับซ้อนยิ่งขึ้น Blobs ทั้งหมดจะได้รับ UID จำนวนเต็ม (Unique Identifer) UID เหล่านี้จะถูกสร้างแบบสุ่มในแต่ละแผนที่ป้องกันกลยุทธ์ตามเป้าหมายแต่ละเป้าหมาย เมื่อเรียกใช้ฟังก์ชันของหยดมันจะส่งผ่านอาร์กิวเมนต์สี่ตัว:
- ความยาวด้านของแผนที่เป็นจำนวนเต็ม
- วัตถุที่สองอาร์เรย์: และ
pellets
blobs
อาร์เรย์ทั้งสองมีวัตถุทั้งสองมีคุณสมบัติที่มีเม็ดหรือตำแหน่งหยดของรูปแบบเป็นpos
[x,y]
เม็ดจะมีenergy
คุณสมบัติในขณะที่ blobs จะมีuid
คุณสมบัติและenergy
คุณสมบัติ - วัตถุที่มีคุณสมบัติต่างๆของหยดมันก็จะผ่านไปที่:
energy
, และuid
อาร์เรย์มีรูปแบบเป็นpos
pos
[x,y]
- วัตถุที่มีวัตถุหน่วยเก็บข้อมูลสองแห่งของหยด
self
คุณสมบัติมีวัตถุของแต่ละบุคคลการจัดเก็บข้อมูลที่สามารถปรับเปลี่ยนได้ แต่หยดเห็นสมควร (โดยการจัดการกับคุณสมบัติของวัตถุที่ถูกส่งผ่าน) และcommunal
คุณสมบัติที่สามารถแก้ไขได้โดยญาติ ๆ
Blobs จะไม่ถูกเคลื่อนย้ายทันทีเพื่อป้องกันการเปลี่ยนก่อนหน้า / หลังที่มีความได้เปรียบ การเคลื่อนไหวทั้งหมดจะถูกประมวลผลเป็นกลุ่ม (การชน / กินทั้งหมดจากนั้นเม็ดทั้งหมดจากนั้นจึงแยก ฯลฯ ) หากหยดหยดลงบนเม็ดหรือหยดเล็กและในกระบวนการใช้พลังงานสุดท้ายของหยดจะยังคงกินเม็ด / พลังงานที่ไม่ขึ้นกับว่าจะนำพลังงานทั้งหมดมารวมเป็น 0 หรือไม่
เพื่อให้ Blob ญาติรู้จักกันการจัดเก็บข้อมูลชุมชนจะต้องใช้สำหรับแต่ละหยดเพื่อบันทึก UID ของมันในอาร์เรย์หรือผ่านระบบอื่น ๆ
คืนค่า
ในการย้ายหรือแยกจะใช้ค่าส่งคืนของฟังก์ชัน ก่อนความหมายของทิศทางสำคัญในแง่ของพิกัด:
- ทิศเหนือ = -Y
- ตะวันออก = + X
- ใต้ = + Y
- ตะวันตก = -X
โปรดทราบว่า[0,0]
เป็นมุมซ้ายด้านบนและ Y เพิ่มขึ้นเมื่อคุณลงไป ค่าที่ส่งคืนของฟังก์ชันควรเป็นไปตามกฎเหล่านี้:
- เมื่อต้องการทำสิ่งใด:ส่งคืนสิ่งใด, 0, null, ไม่ได้กำหนด, เท็จหรือค่าอื่นใดที่เท่ากับเท็จ
- เมื่อต้องการย้าย:ส่งกลับหนึ่งในสี่ตัวแปรทั่วโลก: เหนือ, ตะวันออก, ใต้หรือตะวันตกซึ่งเท่ากับ "เหนือ", "ตะวันออก", "ใต้" หรือ "ตะวันตก" (ซึ่งสามารถใช้เป็นค่าตอบแทนได้)
- ในการแยก:ส่งคืนตัวแปรโกลบอล SplitNorth, SplitEast, SplitSouth หรือ SplitWest ทิศทางที่ระบุตำแหน่งที่จะวาง blob ใหม่
หากคำสั่ง split ถูกส่งคืนและปริมาณพลังงานที่ต้องการมากกว่าหรือเท่ากับพลังงานของหยดจะไม่มีอะไรเกิดขึ้น Blobs จะไม่สามารถออกจากแผนที่ได้
ฟังก์ชั่นห้องสมุดที่กำหนดไว้ล่วงหน้า
มีฟังก์ชั่นพื้นฐานบางอย่างที่มีอยู่โดยค่าเริ่มต้นเพื่อประหยัดเวลา:
taxiDist (pt1, pt2)
ส่งคืนระยะห่างจากรถแท็กซี่ระหว่างสองจุด (ระยะทาง X บวกระยะทาง Y)
taxiDist([0, 0], [2, 2]) //4
taxiDist([3, 4], [1, 5]) //3
taxiDist([1.25, 1.3], [1.3, 1.4]) //0.15
taxiDist([0, 0], [5, 2.5], 2.5) //3
taxiDist([0, 0], [2, 4], 2.5) //2.4
hypotDist (pt1, pt2)
ส่งคืนระยะห่างระหว่างสองจุดตามทฤษฎีบทพีทาโกรัส
hypotDist([0, 0], [5, 12]) //13
hypotDist([4, 6], [8, 9]) //5
hypotDist([0, 1], [2, 1]) //2
hypotDist([1, 1], [2, 2]) //sqrt(2)
modDir (dir, amt)
รับทิศทางที่ป้อนเข้าหมุนตามเข็มนาฬิกา 90 องศาamt
จากนั้นส่งคืนค่าใหม่
modDist(North, 1) //East
modDist(East, 2) //West
modDist(West, 3) //South
modDist(South, 4) //South
ตัวอย่างหยด
หยดนี้จะไม่เคลื่อนที่จนกว่าจะพบเม็ดที่อยู่ใกล้เคียง จากนั้นมันจะเคลื่อนที่ไปในทิศทางที่คิดว่าน่าจะให้รางวัลมากที่สุด หากพลังงานของมันมากกว่า 150 มันจะแตก
function(map, near, me, storage) {
if (me.energy > 150)
return SplitNorth;
if (!near.pellets.length)
return null;
var dirs = [0, 0, 0, 0];
for (let p, i = 0; i < near.pellets.length; i++) {
p = near.pellets[i];
dirs[0] += me.pos[1] - p.pos[1];
dirs[1] += p.pos[0] - me.pos[0];
dirs[2] += p.pos[1] - me.pos[1];
dirs[3] += me.pos[0] - p.pos[0];
}
return [North, East, South, West][dirs.indexOf(Math.max(...dirs))];
}
กฎระเบียบ
- ห้ามมีช่องโหว่มาตรฐาน ยังไม่มีช่องโหว่ที่ไม่เป็นมาตรฐาน
- ไม่มีหยดอาจพยายามแก้ไขหรืออ่านข้อมูลใด ๆ ที่ไม่ได้ส่งผ่านพารามิเตอร์
- ไม่มี Blob ที่อาจพยายามแก้ไขตัวแปร return-value เพื่อก่อวินาศกรรม blobs อื่น ๆ
- รอบนานจนกว่า blobs ที่เหลืออยู่เท่านั้นที่เป็นญาติ
- หยดไม่สามารถแก้ไขข้อมูลโดยการฉีดฟังก์ชั่นเป็นพารามิเตอร์ที่แก้ไขค่าโดยใช้
this
คำหลัก - การส่งทั้งหมดจะต้องเป็น Javascript หรือภาษาที่ไม่แตกต่างจาก Javascript (Python เป็นต้น) คำตอบทั้งหมดจะถูกแปลงเป็น Javascript สำหรับการแข่งขัน
- ผู้ชนะคือหยดที่รวบรวมพลังงานได้สูงสุดในทุกรอบ (จากเม็ดหรือก้อนเล็ก ๆ ที่ไม่ใช่ญาติ)
ผู้ควบคุม: https://gist.github.com/RedwolfPrograms/1facc0afe24c5dfd3ada8b8a2c493242
ห้องแชท: https://chat.stackexchange.com/rooms/93370/hungry-blobs-koth