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.
sumber
them
bersifat deterministik / mengikuti aturan? Sebagai contohfunction 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 menghasilkanStackOverflow
, 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/3371119them(() => 'C')
tidak akan menghasilkan kesalahan karena ketika lawan memanggilthem
, ia memanggil() => 'C'
fungsi. Satu-satunya hal yang perlu dibungkustry-catch
adalah jika Anda memanggilthem
dengan parameter dari beberapa fungsi yang memanggilthem
dengan parameter dari beberapa fungsi yang memanggilthem
dll. (Tanpa batas). Misalnya,them(t => t(() => 'C'))
akan memainkan apa pun yang akan dimainkan lawan jika lawan mengira mereka bermainnice
. Tidak ada kemungkinanstackoverflow
kesalahan.Jawaban:
BoomBot
Jika lawan dijalankan terlebih dahulu dan menyebutnya tanpa
try..catch
, bot ini secara otomatis memenangkan 3 poin. Nol poin dalam hal lain.sumber
Archaeopteryx
cooperate
, maka meniru gerakan lawan melawandefect
.defect
atau dengannice
, maka cacat.Apa yang membuat ini strategi yang bagus? Saya tidak punya ide. Saya membuatnya menggunakan algoritma evolusi, dilatih sebagian pada pengiriman saat ini.
Tiktaalik
cooperate
, maka balikkan gerakan lawan melawandefect
.defect
, maka cacat.notNice
.Strategi lain yang dihasilkan secara evolusioner.
sumber
WhatWouldBotDoBot
WhatWouldBotDoBot cukup sederhana; itu hanya menguji lawannya untuk apa yang akan dilakukannya terhadap program kondisi mapan. Jika bot lebih suka bekerja sama jika mungkin, WWBDB juga akan lebih suka kerja sama (jadi itu akan bekerja sama dengan bot yang bagus). WWBDB sendiri tidak menyukai kerja sama.
sumber
Periksa status
Jika mereka memohon saya, maka mereka mungkin benar-benar mereka. Kami bertindak sebagai pembelot. Jika mereka tidak memohon saya, maka mereka mungkin menjadi tester terbungkus. Kami akan bertindak sebagai lebih baik.
Di atas adalah jawaban asli. Dan mungkin saya harus membuat diri saya bekerja sama untuk mendapatkan lebih banyak poin.
Periksa stateful dengan self-coop
sumber
RandomBot
Karena mengapa tidak.
sumber
Kompleksitas
Tes kompleksitas untuk melihat apakah bot bekerja sama atau rusak. Jika ya, itu bekerja sama, tetapi jika tidak, itu cacat. Semua bot saat ini yang menguji lawan mereka menggunakan fungsi sederhana untuk menguji respon, jadi Kompleksitas hanya akan berpura-pura bekerja sama dalam kasus tersebut.
sumber
Cara saya ingin ini bekerja adalah selalu cacat, kecuali saat bermain melawan diri sendiri. Ia mencoba melakukannya dengan melewati fungsi "tester" yang tidak dibungkus dengan mereka, dan mencoba mendeteksi apakah "mereka" bernama tester. Jika ini bernama tester, ini akan mengubah variabel statis yang diaktifkan menjadi true, lalu kembali bekerja sama. Tapi itu tidak berhasil. Saya tidak terlalu terbiasa dengan javascript, dan saya mungkin akan membuat beberapa perubahan lagi.
sumber
tester
fungsi: DTidak baik
Meniru reaksi lawan terhadap defleksi
sumber
NotNice 2
Versi NotNice by FatalError versi Boom-proof .
sumber
Akal sehat
Penafian: Saya agak tidak tahu javascript.
Jika Anda bisa mendapat untung dari orang yang baik, lakukanlah. Kalau tidak, kembalikan apa yang akan mereka kembalikan jika mereka menghadapi diri mereka sendiri untuk bekerja sama (setidaknya, itulah yang saya pikirkan ).
sumber
Dan Anda ke mana Anda pergi? (Terinspirasi oleh tegangan dalam buku hutan)
sumber
this
sama dengan diri. Saya pikir Anda ingin mengatakannyareturn them(yourself)
.this
bukan variabel, itu adalah kata kunci, dan dalam konteks fungsithis!=self
.self
akan berarti objek jendela danthis
fungsinya sendiri (selalu merujuk pada konteksnya, itulah mengapa ia tidak dianggap sebagai variabel). Itulah sebabnya mengapavar self = this;
pada awal banyak contoh kode dapat dianggap menyesatkan. Versi tambahan tanpa "ini"this
Tidak mengacu pada fungsi.yourself
danyourself_no_this
jalankan berbeda-beda.this
pada dasarnya tidak pernah merujuk pada fungsi dalam javascript. Lihat: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Menghukum Inspektur
Berikan bot beberapa kode dan lihat apakah itu menjalankannya. Jika dijalankan lebih dari sekali, bot adalah inspektur jahat, dan kita harus membelot! Jika dijalankan tepat satu kali, mainkan bot tidak bagus. Jika tidak pernah berjalan, bekerja sama.
Sejarah
Apa yang bot terakhir yang saya lihat lakukan vs lawan ini?
Hasil untuk turnamen 10.000 putaran:
sumber
Mal mencoba menentukan apakah itu di dalam simulasi atau tidak. Jika demikian, ia mengasumsikan pada akhirnya akan melewati kode asli untuk
them
, dan mencoba berbagai strategi untuk meyakinkan mereka untuk bekerja sama.Jika tidak tahu pasti, ia memeriksa apakah dapat cacat secara gratis, atau jika tidak, mencoba menyalin apa yang
them
akan dilakukan ketika diberi kooperator.sumber
TrickyBot
Cobalah untuk tidak dapat diprediksi
sumber
diri sendiri
Tidak yakin apakah itu masuk akal, tetapi tampaknya menarik! Lakukan untuk Anda seperti yang Anda lakukan untuk diri sendiri, ulangi untuk menangkap keacakan. Jika itu tidak berhasil, bersikaplah baik.
Belum teruji, dan kode javascript pertama saya, dan lebih kompleks dari yang saya harapkan.
sumber
selfapply(selfapply)
panggilanselfapply(selfapply)
!RandomAlternate
Jadi saya belajar cara menggunakan properti untuk keadaan ...
sumber
Bot Pembunuhan # 1
Menyebabkan loop tak terbatas di mana lebih mungkin bahwa lawan akan disalahkan.
sumber
Bot Aturan Platinum
Aturan Platinum menyatakan "Perlakukan orang lain dengan cara yang mereka inginkan." Bot saya mengakomodasi itu. Apa pun yang akan mereka lakukan untuk diri mereka sendiri, yang kita asumsikan adalah bagaimana mereka ingin diperlakukan, kita lakukan untuk mereka. Jika mereka melakukan kesalahan, kami menganggap mereka ingin bekerja sama.
sumber
TheGolfedOne (nama fungsi:)
a
, 63 byteKode golf sulit dibaca. Karena itu,
them
akan pecah.Saya tidak sepenuhnya memahami mekanisme di bawah KotH ini, tapi saya kira jika lawan tidak memiliki kewarganegaraan, saya hanya perlu mematahkannya saat saya membelot.
Hasil pertandingan pertamanya (saya tidak repot menggunakan semua bot, maaf)
Dia tidak melakukan hal yang buruk seperti yang saya pikirkan, tempat ketiga (di antara mereka) pertama kali mencoba.
Percobaan kedua,
a
mendapat 260 lagi, ke-3 lagi, di belakangonlyTrustYourself
dandefect
lagi. Mungkin akan konsisten pada akhirnya :)PS: Saya tidak begitu baik dalam bermain golf sehingga lebih untuk lelucon daripada apa pun. Di sini saya hanya memperpendek nama variabel, nama fungsi, dan menghapus spasi sebanyak mungkin.
sumber
Karma
Jika lawan mau bekerja sama dengan kami, maka kami akan bekerja sama. Jika mereka mencoba untuk membelot ketika kita bekerja sama, kita juga akan membelot.
sumber