Dalam tantangan ini, Anda akan menulis bot yang memainkan dilema tahanan. Inilah intinya: Anda tidak akan memiliki akses ke sejarah game sebelumnya. Sebaliknya, Anda akan memiliki akses ke lawan itu sendiri. Dalam versi ini, kedua pemain mendapat +2 poin jika mereka berdua bekerja sama, +1 poin jika mereka berdua cacat, dan jika satu bekerja sama tetapi satu cacat, pembelot mendapat +3 sementara yang lain tidak mendapat poin. Setiap pengiriman akan dimainkan melawan setiap pengiriman lainnya, termasuk pengiriman itu sendiri, 10 kali. Pemenangnya adalah pengajuan dengan poin paling total.
Pengontrol : Anda harus menulis fungsi javascript, dalam formulir
function submissionName(them) {
/* Your code here */
}
Pengontrol menggunakan name
properti fungsi untuk menampilkan hasil, jadi jika tidak dalam format ini (dan sebaliknya f = x => ...
atau f = function() { ... }
) itu akan sulit untuk melihat skor Anda dan Anda tidak akan dapat mengakses fungsi Anda sendiri.
Fungsi akan menerima satu parameter: them
yang merupakan fungsi lawan. Kemudian dapat memanggil fungsi itu untuk melihat apa reaksi lawan akan diberikan fungsi tertentu sebagai input. Berdasarkan data itu, Anda harus mengembalikan 'C' atau 'D' untuk bekerja sama atau cacat masing-masing.
Contoh (akan bersaing):
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'));
}
Kontroler tersedia di sini
Aturan :
- Anda tidak akan dapat melihat kode lawan itu sendiri. Semua fungsi dibungkus sehingga mereka terlihat sama ketika
toString()
dipanggil. Satu-satunya cara untuk memeriksa lawan (yang bisa menjadi diri sendiri) adalah dengan menguji mereka. - Fungsi Anda tidak harus bersifat deterministik. Anda hanya dapat menyimpan status dengan menyetel properti pada fungsi Anda sendiri, seperti
submissionName.state = {};
. Namun, di antara pertandingan (bahkan di antara pertandingan dari pemain yang sama), status dibersihkan dengan memanggiltoString()
daneval
. Karena itu, tidak ada memori dari pertandingan sebelumnya. - Urutan fungsi yang dipanggil pertama dalam setiap pertandingan secara acak.
- Jika kode Anda membuat kesalahan, itu akan diperlakukan seolah-olah Anda bekerja sama saat lawan Anda membelot. Jika Anda adalah orang pertama yang menjalankan, kode lawan bahkan tidak akan dipanggil. Ini terjadi bahkan jika kesalahan terjadi pada kode lawan saat Anda menelepon
them
. Waspadai kesalahan stack overflow, terutama jika kode Anda memanggilthem(wrap(submissionName))
, karena mereka mungkin melakukan hal yang sama. - Anda mungkin tidak mengakses variabel
self
, atau variabel lain apa pun yang berada dalam lingkup ketikaeval
disebut KECUALI fungsiwrap
. Fungsi ini memungkinkan Anda untuk memanggil lawan dengan cara yang tidak dapat dibedakan dari cara pengontrol memanggil suatu fungsi. Anda tidak boleh menulis keMath
,,window
dll. (Anda dapat menggunakan fungsi, sepertiMath.random()
, namun). - Anda tidak dapat mengakses jejak tumpukan dengan membuat
Error
atau dengan beberapa metode lain.
Catatan untuk waktu yang terlalu lama: harap jangan terjebak dalam a while
lingkaran selamanya. Waktu gabungan kedua pesaing tidak boleh lebih dari 1 detik dalam setiap babak yang diberikan. Untuk menegakkan ini, batas waktu acak antara 1000 ms dan 2000 ms dipilih (ini adalah untuk menghindari permainan dengan sengaja menunggu jumlah waktu yang diketahui), dan jika pekerja membutuhkan waktu lebih lama dari itu untuk mengeksekusi, kesalahan akan terjadi. Jika ini terjadi, penyebab kesalahan akan ditentukan sebagai berikut: eksekusi akan dijeda pada saat acak setelah 1000 ms, dan tumpukan panggilan pada saat itu akan diperiksa. Pesaing yang disebut terakhir yang saat ini berada dalam satu lingkaran (atau rekursi seperti loop, dalam arti bahwa itu adalah rekursi yang diatur untuk menghindari kesalahan stack overflow) akan disalahkan. Jika pesaing yang sama disalahkan karena menyebabkan kesalahan "terlalu lama" beberapa kali, pesaing tersebut akan didiskualifikasi.
them
bersifat deterministik / mengikuti aturan? Sebagai contoh function me(them){let log=0;them(x=>{++log;return 'C';})
; return log == 0? 'D': 'C';}
StackOverflow
kesalahan dan bukan loop tak terbatas yang tidak pernah berhenti. Jika itu bisa menghasilkan StackOverflow
, pastikan Anda menambahkan pernyataan try-catch. Untuk contoh rekursi yang tidak mencapai kesalahan stackoverflow dalam 1 detik, Anda membutuhkan lebih banyak contoh yang tidak jelas seperti stackoverflow.com/q/12438786/3371119
them(() => 'C')
tidak akan menghasilkan kesalahan karena ketika lawan memanggil them
, ia memanggil () => 'C'
fungsi. Satu-satunya hal yang perlu dibungkus try-catch
adalah jika Anda memanggil them
dengan parameter dari beberapa fungsi yang memanggil them
dengan parameter dari beberapa fungsi yang memanggil them
dll. (Tanpa batas). Misalnya, them(t => t(() => 'C'))
akan memainkan apa pun yang akan dimainkan lawan jika lawan mengira mereka bermain nice
. Tidak ada kemungkinan stackoverflow
kesalahan.