Cuộc thi kết thúc! Đọc bình luận trên các đốm màu để xem điểm của họ.
KoTH này được lấy cảm hứng lỏng lẻo từ Mô phỏng chọn lọc tự nhiên của Primer . Bot của bạn là một blob. Để sống sót, bạn phải ăn viên để lấy lại năng lượng, được sử dụng để di chuyển. Với năng lượng bổ sung, các đốm màu có thể chia thành hai.
Năng lượng và chuyển động
Blob của bạn bắt đầu mỗi vòng với 100 năng lượng, và nó không có giới hạn về lượng năng lượng mà nó có thể thu thập. Mỗi vòng được chạy theo lượt, với mỗi đốm màu có tùy chọn di chuyển Bắc, Đông, Nam hoặc Tây trong bất kỳ lượt nào, hoặc đứng yên. Di chuyển sử dụng 1 năng lượng, và đứng yên sử dụng 0,25 năng lượng. Chiều dài bên của bản đồ làceil(0.25 * blobCount) * 2 - 1
đơn vị, với tối thiểu 9 đơn vị. Tất cả các đốm màu bắt đầu ở rìa bản đồ, với một đốm được đặt ở mỗi góc và mỗi đốm màu tiếp theo được đặt cách xa bất kỳ đơn vị nào khác. Cứ sau 30 lượt, một làn sóng viên được đặt vào các điểm ngẫu nhiên trên bản đồ, ít nhất 1 đơn vị từ bất kỳ cạnh nào. Mỗi khi một làn sóng xuất hiện, số lượng viên (ban đầu gấp đôi số lượng đốm hoặc chiều rộng của bản đồ, tùy theo số lượng lớn hơn) trong sóng tiếp theo sẽ giảm đi 1, buộc số lượng đốm sáng giảm theo thời gian. Mỗi viên phục hồi từ 5 đến 15 năng lượng. Khi năng lượng của một blob nhỏ hơn hoặc bằng 0, nó sẽ chết.
Ăn
Nếu hai hoặc nhiều đốm màu cố gắng chiếm cùng một vị trí, người có nhiều năng lượng nhất sẽ ăn những người khác, nhận năng lượng của họ. Nếu cả hai có năng lượng bằng nhau, cả hai đều biến mất.
Phát hiện và thông tin
Blobs có thể nhìn thấy bất kỳ viên hoặc các đốm màu khác trong khoảng cách 4 đơn vị. Khi các chức năng của chúng được gọi, các đốm màu được cung cấp với:
- Chiều dài bên của bản đồ
- Vị trí của blob trên bản đồ
- Vị trí của tất cả các viên trong bán kính tìm kiếm của chúng, cũng như các giá trị của chúng
- Vị trí của tất cả các đốm màu trong bán kính tìm kiếm của họ, cũng như năng lượng và UID của họ
- Năng lượng, UID và vị trí của blob có chức năng đang được thực thi
- Một đối tượng lưu trữ duy nhất cho blob
- Một đối tượng lưu trữ được chia sẻ bởi tất cả các đốm màu liên quan đến blob thông qua việc chia tách
Tách
Nếu một đốm màu có hơn 50 năng lượng, nó có thể chọn tách. Tách 50 chi phí năng lượng, và bất kỳ năng lượng còn lại được chia đều giữa hai đốm màu. Tất cả các đốm màu đều là bản gốc hoặc bản sao tách, với mỗi bản sao truy nguyên về bản gốc. Tất cả những thứ này cùng nhau là "họ hàng". Tất cả người thân có một đối tượng lưu trữ chung. Người thân vẫn có thể ăn thịt lẫn nhau và có thể chia tách, sử dụng đối tượng lưu trữ của riêng họ hoặc thu thập năng lượng mà không ảnh hưởng đến người khác.
Chuyển giao năng lượng
Nếu hai đốm màu nằm cạnh nhau (sau khi di chuyển), một trong các bot có thể truyền năng lượng cho nhau. Này được thực hiện bằng cách quay SendNorth(amt)
, SendEast(amt)
, SendSouth(amt)
, hay SendWest(amt)
, với amt
việc một số đại diện cho số tiền gửi. Đây có thể là bất kỳ số tiền nào mà người gửi có thể đủ khả năng, bao gồm tất cả năng lượng của họ. Chúng tôi đề nghị rằng các blob đang nhận năng lượng được yêu cầu ở yên trong kho lưu trữ chung, để nó không bị mất đi khi năng lượng được truyền đi (mặc dù năng lượng sẽ không được khấu trừ khỏi tổng số của người gửi trong trường hợp này).
Chức năng, lưu trữ và UID
Để cho phép các hành vi học tập phức tạp hơn, tất cả các đốm màu sẽ được cung cấp một UID số nguyên (Định danh duy nhất). Các UID này sẽ được tạo ngẫu nhiên mỗi bản đồ, ngăn chặn các chiến lược dựa trên các mục tiêu riêng lẻ. Khi hàm blob được gọi, nó được truyền bốn đối số:
- Độ dài cạnh của bản đồ là một số nguyên
- Một đối tượng có hai mảng:
pellets
vàblobs
. Cả hai mảng đều chứa các đối tượng, cả hai đều có một thuộcpos
tính chứa vị trí của viên hoặc blob được định dạng là[x,y]
. Pellets sẽ có mộtenergy
tài sản, trong khi các đốm màu sẽ có mộtuid
tài sản và mộtenergy
tài sản - Một đối tượng có chứa các thuộc tính khác nhau của blob nó sẽ chuyển qua:
energy
,uid
, vàpos
. Cácpos
mảng được định dạng như[x,y]
- Một đối tượng chứa hai đối tượng lưu trữ của blob. Một thuộc
self
tính chứa một đối tượng lưu trữ riêng lẻ có thể được sửa đổi tuy nhiên blob thấy phù hợp (bằng cách thao tác các thuộc tính của đối tượng được truyền) và một thuộccommunal
tính có thể được sửa đổi bởi bất kỳ người thân nào.
Blobs không được di chuyển ngay lập tức để ngăn chặn các lượt trước / sau có lợi thế. Tất cả các chuyển động được xử lý theo nhóm (Tất cả các va chạm / ăn, sau đó tất cả các viên, sau đó tách ra, v.v.) Nếu một đốm rơi vào một viên hoặc các đốm nhỏ hơn và, trong quá trình sử dụng năng lượng cuối cùng của nó, blob vẫn sẽ tiêu thụ viên / năng lượng độc lập cho dù điều đó sẽ mang lại tổng năng lượng của nó trên 0.
Để các đốm tương đối nhận ra nhau, bộ lưu trữ chung phải được sử dụng cho mỗi đốm để ghi UID của nó trong một mảng hoặc thông qua một số hệ thống khác.
Giá trị trả về
Để di chuyển hoặc phân chia, giá trị trả về của hàm được sử dụng. Đầu tiên, ý nghĩa của các hướng hồng y về mặt tọa độ:
- Bắc = -Y
- Đông = + X
- Nam = + Y
- Tây = -X
Lưu ý rằng đó [0,0]
là góc trên cùng bên trái và Y tăng khi bạn đi xuống. Giá trị trả về của hàm phải tuân theo các quy tắc sau:
- Không làm gì: Trả về không có gì, 0, null, không xác định, sai hoặc bất kỳ giá trị nào khác tương đương với false
- Di chuyển: Trả về một trong bốn biến toàn cầu: Bắc, Đông, Nam hoặc Tây, tương đương với "bắc", "đông", "nam" hoặc "tây" (cũng có thể được sử dụng làm giá trị trả về)
- To Split: Trả về biến toàn cục SplitNorth, SplitEast, SplitSouth hoặc SplitWest, hướng cho biết nơi đặt blob mới
Nếu một lệnh tách được trả về và lượng năng lượng cần thiết lớn hơn hoặc bằng năng lượng của blob, sẽ không có gì xảy ra. Blobs sẽ không thể rời khỏi bản đồ.
Chức năng thư viện được xác định trước
Có một số chức năng cơ bản có sẵn theo mặc định, để tiết kiệm thời gian:
taxiDist (pt1, pt2)
Trả về khoảng cách taxi giữa hai điểm (khoảng cách X cộng với khoảng cách 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)
Trả về khoảng cách giữa hai điểm theo định lý pythagore
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)
Thực hiện hướng nhập, xoay 90 độ theo chiều kim đồng hồ amt
, sau đó trả về giá trị mới.
modDist(North, 1) //East
modDist(East, 2) //West
modDist(West, 3) //South
modDist(South, 4) //South
Ví dụ Blob
Blob này sẽ không di chuyển cho đến khi nó tìm thấy một viên gần đó. Sau đó, nó sẽ di chuyển theo hướng mà nó nghĩ là có khả năng thưởng cho nó nhất. Nếu năng lượng của nó vượt quá 150, nó sẽ phân tách.
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))];
}
Quy tắc
- Lỗ hổng tiêu chuẩn bị cấm. Ngoài ra, không có lỗ hổng không chuẩn.
- Không có blob nào có thể cố gắng sửa đổi hoặc đọc bất kỳ dữ liệu nào không được truyền cho nó thông qua các tham số của nó
- Không có blob nào có thể cố gắng sửa đổi biến giá trị trả về để phá hoại các đốm màu khác
- Một vòng kéo dài cho đến khi các đốm màu còn lại là người thân
- Không có blob nào có thể sửa đổi dữ liệu bằng cách đưa các hàm vào các tham số của nó để sửa đổi các giá trị bằng
this
từ khóa - Tất cả các bài nộp phải bằng Javascript hoặc ngôn ngữ không quá khác so với Javascript (ví dụ: Python). Tất cả các câu trả lời sẽ được chuyển đổi thành Javascript cho cuộc thi.
- Người chiến thắng là blob đã thu được lượng năng lượng cao nhất trong tổng số tất cả các vòng (từ các viên hoặc tiêu thụ các đốm nhỏ hơn không phải là họ hàng)
Trình điều khiển: https://gist.github.com/RedwolfPrograms/1facc0afe24c5dfd3ada8b8a2c493242
Phòng chat: https://chat.stackexchange.com/rooms/93370/hungry-blobs-koth