Trong thử thách này, bạn sẽ viết một bot chơi trò tiến thoái lưỡng nan của tù nhân. Đây là một nhược điểm: bạn sẽ không có quyền truy cập vào lịch sử của các trò chơi trước đó. Thay vào đó, bạn sẽ có quyền truy cập vào chính đối thủ. Trong phiên bản này, cả hai người chơi đều được +2 điểm nếu cả hai hợp tác, +1 điểm nếu cả hai đều khiếm khuyết và nếu một người hợp tác nhưng một khuyết điểm, kẻ đào ngũ được +3 trong khi người kia không có điểm. Mỗi lần gửi sẽ được chơi với mọi lần gửi khác, bao gồm chính nó, 10 lần. Người chiến thắng là bài nộp với tổng số điểm cao nhất.
Trình điều khiển : Bạn nên viết một hàm javascript, dưới dạng
function submissionName(them) {
/* Your code here */
}
Bộ điều khiển sử dụng thuộc tính của hàm name
để hiển thị kết quả, vì vậy nếu nó không ở định dạng này (và thay vào đó f = x => ...
hoặc f = function() { ... }
), sẽ rất khó để xem điểm của bạn và bạn sẽ không thể truy cập vào chức năng của chính mình.
Hàm sẽ chấp nhận một tham số: them
đó là chức năng của đối thủ. Sau đó, nó có thể gọi hàm đó để xem phản ứng của đối thủ sẽ được đưa ra một số chức năng nhất định làm đầu vào. Dựa trên dữ liệu đó, bạn phải trả lại 'C' hoặc 'D' cho sự hợp tác hoặc khiếm khuyết tương ứng.
Ví dụ (sẽ cạnh tranh):
function cooperate(them) {
return 'C';
}
function defect(them) {
return 'D';
}
function nice(them) {
// Do whatever they would do when faced with a cooperator
return them(wrap(_ => 'C'));
}
Bộ điều khiển có sẵn ở đây
Quy tắc :
- Bạn sẽ không thể nhìn thấy mã của đối thủ. Tất cả các chức năng được bọc để chúng trông giống nhau khi
toString()
được gọi. Cách duy nhất để kiểm tra một đối thủ (có thể là chính bạn) là kiểm tra họ. - Chức năng của bạn không phải là xác định. Bạn chỉ có thể lưu trạng thái bằng cách đặt thuộc tính trên chức năng của riêng bạn, chẳng hạn như
submissionName.state = {};
. Tuy nhiên, giữa các trận đấu (thậm chí giữa các trận đấu của cùng một người chơi), trạng thái sẽ bị xóa bằng cách gọitoString()
vàeval
. Do đó, không có bộ nhớ của các trận đấu trước. - Thứ tự của hàm được gọi đầu tiên trong mỗi trận đấu được chọn ngẫu nhiên.
- Nếu mã của bạn gây ra lỗi, nó sẽ được xử lý như thể bạn đã hợp tác trong khi đối thủ của bạn đào thoát. Nếu bạn là người đầu tiên chạy, mã của đối thủ thậm chí sẽ không được gọi. Điều này xảy ra ngay cả khi lỗi xảy ra trong mã của đối thủ trong khi bạn đang gọi
them
. Hãy cảnh giác với các lỗi tràn ngăn xếp, đặc biệt là nếu mã của bạn gọithem(wrap(submissionName))
, vì chúng có thể làm tương tự. - Bạn không thể truy cập vào biến
self
hoặc bất kỳ biến nào khác có trong phạm vi khieval
được gọi là EXCEPT hàmwrap
. Chức năng này cho phép bạn gọi đối thủ theo cách không thể phân biệt với cách bộ điều khiển gọi một chức năng. Bạn không được ghi vàoMath
,window
v.v. (Math.random()
Tuy nhiên, bạn có thể sử dụng các chức năng, chẳng hạn như ). - Bạn không thể truy cập theo dõi ngăn xếp bằng cách tạo một
Error
hoặc bằng một số phương pháp khác.
Một lưu ý về việc mất quá nhiều thời gian: xin vui lòng tránh bị mắc kẹt trong một while
vòng lặp mãi mãi. Thời gian kết hợp của cả hai đối thủ không được vượt quá 1 giây trong bất kỳ vòng nào. Để thực thi điều này, thời gian chờ ngẫu nhiên trong khoảng từ 1000 ms đến 2000 ms được chọn (điều này là để tránh chơi game bằng cách cố tình chờ một khoảng thời gian đã biết) và nếu nhân viên mất nhiều thời gian hơn để thực thi, sẽ xảy ra lỗi. Nếu điều này xảy ra, nguyên nhân gây ra lỗi sẽ được xác định như sau: việc thực thi sẽ bị tạm dừng tại một thời điểm ngẫu nhiên sau 1000 ms và ngăn xếp cuộc gọi tại thời điểm đó sẽ được kiểm tra. Đối thủ được gọi gần đây nhất hiện đang trong một vòng lặp (hoặc đệ quy giống như vòng lặp, theo nghĩa đó là một đệ quy được thiết lập để tránh lỗi tràn ngăn xếp) sẽ bị đổ lỗi. Nếu cùng một đối thủ cạnh tranh bị đổ lỗi vì gây ra lỗi "mất quá nhiều thời gian" nhiều lần, thì đối thủ đó sẽ bị loại.
them
có tính xác định / tuân theo các quy tắc không? Ví dụ: function me(them){let log=0;them(x=>{++log;return 'C';})
return log == 0? 'D': 'C';}
StackOverflow
lỗi và không phải là một vòng lặp vô hạn không bao giờ thoát. Nếu nó có thể dẫn đến một StackOverflow
, hãy đảm bảo bạn thêm một câu lệnh thử. Để có ví dụ về đệ quy không gặp lỗi stackoverflow trong vòng 1 giây, bạn cần các ví dụ khó hiểu hơn như stackoverflow.com/q/12438786/3371119
them(() => 'C')
sẽ không gây ra lỗi vì khi đối thủ gọi them
, nó sẽ gọi () => 'C'
hàm. Điều duy nhất cần được gói gọn try-catch
là nếu bạn gọi them
với một tham số của một số chức năng gọi them
với một tham số của một số chức năng gọi, them
vv (vô hạn). Ví dụ, them(t => t(() => 'C'))
sẽ chơi bất cứ thứ gì đối thủ sẽ chơi nếu đối thủ nghĩ rằng họ đang chơi nice
. Không có khả năng stackoverflow
xảy ra lỗi.