Конкурс завершено! Читайте коментарі про краплі, щоб переглянути їхні оцінки.
Цей KoTH натхненний симулятором природного відбору праймера . Ваш бот - кльош. Для того щоб вижити, ви повинні їсти гранули, щоб відновити енергію, яку використовують для переміщення. Маючи зайву енергію, краплі можуть розділитися на два.
Енергія та рух
Ваша крапля починається з кожного раунду зі 100 енергією, і вона не обмежує кількість енергії, яку може зібрати. Кожен раунд проводиться по черзі, при цьому кожен крап має можливість рухатись на північ, схід, південь чи захід у будь-який заданий поворот або стояти нерухомо. Переміщення використовує 1 енергію, а стояння використовує 0,25 енергії. Довжина сторони карти дорівнюєceil(0.25 * blobCount) * 2 - 1одиниць, мінімум 9 одиниць. Усі краплі починаються з краю карти, по одному розміщується в кожному куті, а кожен наступний крап розміщується на 2 одиниці від інших. Кожні 30 оборотів хвиля гранул розміщується у випадкових місцях навколо карти, щонайменше, на 1 одиницю від будь-якого краю. Щоразу, коли з’являється хвиля гранул, кількість гранул (спочатку вдвічі більше крапок або ширини карти, залежно від того, що більше) в наступній хвилі зменшується на 1, змушуючи кількість крапель зменшуватися з часом. Кожен гранул відновлює від 5 до 15 енергії. Коли енергія краплини менше або дорівнює 0, вона гине.
Їсть
Якщо дві або більше крапель намагаються зайняти одне і те ж місце розташування, той, що має найбільше енергії, з'їсть інших, отримуючи свою енергію. Якщо обоє мають рівну енергію, обидва зникають.
Виявлення та інформація
Краплі можуть бачити будь-які гранули або інші краплі на відстані 4 одиниць. Коли викликаються їх функції, краплі надаються:
- Бічна довжина карти
- Положення краплі на карті
- Положення всіх гранул в радіусі їх пошуку, а також їх значення
- Позиції всіх крапок в радіусі їх пошуку, а також їх енергія та UID
- Енергія, UID та місцезнаходження блобу, функція якого виконується
- Об'єкт зберігання, унікальний для краплі
- Об'єкт зберігання, який спільно використовуються всіма краплями, пов’язаними з ним, шляхом розщеплення
Розщеплення
Якщо у краплини більше 50 енергій, він може вибрати розщеплення. Розщеплення коштує 50 енергії, а будь-яка енергія, що залишилася, розподіляється рівномірно між двома краплями. Усі краплі - це оригінали, або розділені копії, причому кожна копія бере свій початок до оригіналу. Усі вони разом є "родичами". У всіх родичів є один об’єкт комунального зберігання. Родичі все ще можуть їсти один одного і можуть розбиватися, використовувати власний предмет зберігання або збирати енергію, не зачіпаючи інших.
Передача енергії
Якщо дві краплі знаходяться поруч (після переміщення), один з ботів може передавати енергію іншому. Це робиться шляхом повернення SendNorth(amt), SendEast(amt), SendSouth(amt)або SendWest(amt), з amtбути число , яке представляє суму відправки. Це може бути будь-яка сума, яку може дозволити собі відправник, включаючи всю свою енергію. Рекомендується, щоб кров, який отримує енергію, казав залишатися нерухомим через комунальне сховище, щоб він не відходив під час передачі енергії (хоча в цьому випадку енергія не була б відрахована від загальної суми відправника).
Функції, Зберігання та UID
Для того, щоб дозволити більш складну поведінку в навчанні, всі краплі отримають цілий UID (Унікальний ідентифікатор). Ці UID будуть генеровані випадковим чином на кожній карті, запобігаючи стратегіям, заснованим на окремих цілях. Коли викликається функція blob, передаються чотири аргументи:
- Довжина сторони карти як ціле число
- Об'єкт з двома масивами:,
pelletsіblobs. Обидва масиви містять об'єкти, обидва маютьposвластивість, що містить позицію гранул або блобу, відформатовану як[x,y]. Гранули матимутьenergyмайно, а краплі матимутьuidмайно таenergyмайно - Об'єкт , що містить різні властивості згустку він передається:
energy,uidіpos.posМасив в форматі[x,y] - Об'єкт, що містить два об'єкти зберігання блобу.
selfВластивість містить окремий об'єкт зберігання , який може бути змінений , однак вважає за потрібне БЛОБ (шляхом маніпулювання властивості об'єкта , який передається), іcommunalвластивість , яке може бути змінено з допомогою будь-якого родича.
Краплі не переміщуються одразу, щоб запобігти перевазі попередніх / пізніших поворотів. Всі рухи обробляються групами (Усі зіткнення / поїдання, потім усі гранули, потім розщеплення тощо). Якщо кров приземлиться на гранулу або дрібнішу крапку і, в процесі використання останньої енергії, крапля все одно буде споживати гранули / енергія, незалежна від того, чи принесла б її загальна енергія вище 0.
Для того, щоб відносні краплі розпізнавали один одного, комунальне сховище повинно використовуватись для кожного блобу для запису його UID в масив або через якусь іншу систему.
Повернення цінностей
Для переміщення або розділення використовується зворотне значення функції. По-перше, значення кардинальних напрямків з точки зору координат:
- Північ = -Y
- Схід = + X
- Південь = + Y
- Захід = -X
Зверніть увагу, що [0,0]це верхній лівий кут , і Y збільшується, коли ви спускаєтесь вниз. Повернене значення функції повинно відповідати цим правилам:
- Не робити нічого: повернути нічого, 0, null, undefined, false або будь-яке інше значення, яке прирівнюється до false
- Для переміщення: поверніть одну з чотирьох глобальних змінних: Північ, Схід, Південь або Захід, які прирівнюються до "північ", "Схід", "Південь" або "Захід" (що також може використовуватися як повернене значення)
- До Split: повернути глобальну змінну SplitNorth, SplitEast, SplitSouth або SplitWest, напрямок, який вказує, де розмістити нову крапку
Якщо повернути розділену команду і кількість необхідної енергії більша або дорівнює енергії краплі, нічого не відбудеться. Краби не зможуть залишити карту.
Заздалегідь визначені бібліотечні функції
За замовчуванням доступно кілька основних функцій, щоб заощадити час:
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
Приклад Blob
Ця крапля не рухатиметься, поки не знайде кругу поблизу. Потім він рухатиметься в тому напрямку, який, на його думку, найімовірніше нагородить. Якщо його енергія колись перевищить 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))];
}
Правила
- Стандартні лазівки заборонені. Також немає жодних нестандартних лазів.
- Жодна крапка не може намагатися змінювати чи читати будь-які дані, не передані їй за допомогою своїх параметрів
- Жодна крапка не може намагатися змінити змінну поверненого значення на саботаж інших крапок
- Раунд триває до тих пір, поки єдині залишилися краплі не будуть родичами
- Жодна крапка не може змінювати дані, вводячи функції в її параметри, які змінюють значення за допомогою
thisключового слова - Усі подання повинні бути або в Javascript, або в мові, яка не надто відрізняється від Javascript (наприклад, Python). Усі відповіді будуть перетворені на Javascript для проведення змагань.
- Переможець - це крапля, яка зібрала найбільшу кількість енергії в цілому за всі раунди (від гранул або споживання дрібних крапель, які не є родичами)
Контролер: https://gist.github.com/RedwolfPrograms/1facc0afe24c5dfd3ada8b8a2c493242
Чат: https://chat.stackexchange.com/rooms/93370/hungry-blobs-koth