Latar Belakang
Game Morra adalah game sederhana. Dalam versi "asli", beberapa pemain secara bersamaan membuang angka 0-5 dengan tangan mereka sambil menebak jumlah total tangan semua orang. Versi yang akan saya gunakan di sini telah dimodifikasi untuk meningkatkan potensi strategi non-sepele, dan dijelaskan di bawah ini:
- Ada dua pemain.
- Seperti di gunting batu-kertas, para pemain bergerak secara bersamaan.
- Setiap belokan, setiap pemain memilih angka 0-5 dan juga menebak pilihan lawan mereka 0-5. Ini berarti bahwa dua angka adalah output setiap belokan. Untuk memperjelas, kedua angka keluaran harus dalam kisaran 0-5, inklusif.
- Jika Anda menebak pilihan lawan dengan benar tetapi lawan Anda tidak menebak dengan benar, Anda memenangkan sejumlah poin yang sama dengan jumlah dari dua angka yang dimainkan. Misalnya, jika angka yang dimainkan adalah 3 dan 5, tebakan yang benar akan bernilai 8 poin.
- Jika kedua atau kedua pemain menebak dengan benar, tidak ada poin yang diberikan.
- Orang dengan poin terbanyak setelah 1000 putaran memenangkan permainan itu.
Turnamen
Turnamen akan dilakukan dengan gaya round-robin dan akan dijalankan dengan menciptakan setiap pasangan yang memungkinkan dari kontestan. Untuk setiap kemenangan, kontestan memperoleh 2 poin kemenangan. Setiap pertandingan menghasilkan 1 poin kemenangan. Tidak ada poin kemenangan yang diperoleh karena kekalahan.
Secara intuitif, pemenang turnamen adalah kontestan dengan poin kemenangan terbanyak melawan yang lain.
Cara Masuk
Akan ada dua metode pengiriman bot untuk bersaing. Metode pertama, dan banyak disukai, adalah untuk mengimplementasikan antarmuka Java yang disediakan oleh pengontrol. Metode kedua adalah menulis program independen.
Mari kita bahas metode Java terlebih dahulu. Antarmuka Anda akan perlu untuk mengimplementasikan adalah Player
dan mendefinisikan dua metode: public String getName()
mengidentifikasi bot Anda, dan public int[] getMove(String[] args)
mengambil args
sebagai array dari enam senar, mychoices myguesses myscore opponentchoices opponentguesses opponentscore
. Contohnya adalah sebagai berikut:
042 045 0 324 432 6
Ini berarti bahwa saya memilih 0 pada ronde pertama dan menebak bahwa lawan saya akan melempar 0. Lawan saya melempar 3 dan menebak saya akan melempar 4. Pada ronde ketiga, lawan saya membuat tebakan yang benar bahwa saya akan melempar a 2, artinya dia mendapatkan 2 + 4 = 6 poin.
Metode Anda akan mengembalikan array dua bilangan bulat, yang merupakan pilihan dan tebakan Anda masing-masing. Contohnya adalah {4,2}
untuk pilihan 4 dan menebak 2.
Berikut adalah contoh bot Java lengkap yang ditulis sebagai metode. Jika Anda mau, kiriman Anda hanya perlu memasukkan apa yang ada di dalam getMove
metode.
import java.util.Random;
/**
* A simple example Morra bot to get you started.
*/
public class ExampleBot implements Player
{
public String getName()
{
return "ExampleBot";
}
public int[] getMove(String [] args)
{
//easiest way I know to break down to create a move history
//(just contains their throw history)
char[] theirThrowsC = args[3].toCharArray();
int[] theirThrows = new int[theirThrowsC.length];
for(int i = 0; i < theirThrowsC.length; i++)
{
theirThrows[i] = Integer.parseInt(Character.toString(theirThrowsC[i]));
}
//get my score
int myScore = Integer.parseInt(args[2]);
Random r = new Random();
int guess = r.nextInt(6);
if(theirThrows.length > 0)
{
guess = theirThrows[theirThrows.length-1];
}
//throws a random number, guesses what they threw last
return new int[] {r.nextInt(6),guess};
}
public static int otherMethod(int example) //you can write additional static methods
{
return 0;
}
}
Sebagai Program Independen
Saat ini saya terbatas dalam mendukung bahasa tambahan. Selain Java, saya dapat menerima program yang ditulis dalam Python 3.4, Perl 5, atau Ruby 2.1.5. Jika ada bahasa yang tampaknya diinginkan beberapa orang, saya akan berusaha sebaik mungkin untuk menambahkannya.
Input ke program Anda akan menjadi argumen di baris perintah. Itu bisa terlihat seperti ini:
perl awesomebot.plx 042 045 0 324 432 6
Output dari program Anda harus menjadi pilihan Anda diikuti oleh tebakan Anda, masing-masing diikuti oleh spasi.
Harap sertakan dalam jawaban Anda perintah tepat yang diperlukan untuk menjalankannya. Ingatlah bahwa saya menjalankan Windows 8.1.
Aturan Ekstra
Menyimpan Status dan Timeout
Program Anda akan diizinkan untuk membuat satu file teks di direktori lokal, tempat Anda dapat menyimpan informasi. Informasi ini akan disimpan sepanjang turnamen tetapi dihapus setelahnya. Beri nama file yang bisa saya identifikasi.
Ada batas waktu 500 milidetik untuk kode Anda merespons. Kegagalan untuk merespons dalam batas waktu (atau memberikan langkah yang tidak valid) akan mengakibatkan kehilangan pertandingan tersebut. Pengiriman Java saat ini memiliki batas waktu pasif (yang saya dapat tingkatkan ke aktif), sedangkan pengiriman non-Jawa memiliki batas waktu aktif di mana proses mereka dihentikan setelah 500 milidetik.
Lebih banyak aturan pengiriman
- Anda diizinkan beberapa kali kiriman, asalkan mematuhi aturan dan tidak memberi tag tim.
- Setiap entri harus unik. Anda tidak dapat membuat salinan persis dari logika bot lain dalam bahasa yang berbeda.
- Bot tidak dapat berinteraksi satu sama lain (untuk membentuk tim apa pun).
- Anda tidak dapat menggunakan logika bot lain di dalam bot Anda untuk, katakanlah, mengidentifikasi pesaing Anda dan memprediksi tindakannya. Anda bisa, tentu saja, mencoba menentukan strategi lawan Anda.
- Jangan berusaha mengacaukan controller, kontestan lain, atau komputer saya. Jangan terhubung ke sumber informasi eksternal.
Pengendali
Versi pengontrol saat ini ditemukan di sini . Ini ditulis dalam Java 8. File "Tournament" adalah pengontrol utama, yang juga berisi daftar pesaing (jika Anda ingin meng-host kompetisi Anda sendiri).
Papan peringkat
Saya belum benar-benar dapat memperbarui papan peringkat sangat sering. Saya agak sibuk akhir pekan ini. Dengan "agak sibuk" Maksudku tidak ada akses ke komputer dari 6:30 pagi hingga 9:30 malam. Berikut adalah skor setelah 5 kali berjalan. Bot "Echo" terus hangus karena suatu alasan (mungkin salah saya, saya belum menyelidiki).
170 - Quinn and Valor
158 - Historian
142 - DeltaMax
140 - MorraCowbell
132 - Extrapolator
115 - Rainbolt
102 - Popularity
100 - Interpolator
83 - CounterBot
80 - Basilisk
76 - Erratica
65 - Trendy
63 - Scholar
62 - RandomGuesser
60 - KingFisher
59 - NullifierBot
55 - EvolvedBot
48 - Confused
Kredit
Banyak terima kasih kepada Rainbolt dan Peter Taylor untuk bantuan mereka dengan controller.
sumber
Jawaban:
Morra Cowbell
Bagi siapa pun yang mencari arti penting dalam nama bot ini, nama Morra membuat saya berpikir tentang Space Italian , jadi saya rasa saya membutuhkan nama yang dimainkan pada itu. Kandidat lain termasuk Morra menipu Anda dan Morra untuk saya .
Ini adalah kelas penuh yang mengimplementasikan
Player
antarmuka. Penjelasan di bawah ini.Penjelasan
Saya mulai dengan menganalisis game dengan lebih sedikit jari. Yang non-sepele yang paling sederhana memungkinkan panggilan
0
atau1
dan memiliki tabel hadiah berikut (nilai adalah hadiah untuk pemain baris):The
(0,0)
Strategi didominasi oleh(0,1)
, sehingga kita dapat mengurangi meja untukSekarang
(1,0)
strategi didominasi oleh(0,1)
, sehingga kita dapat mengurangi tabelDan sekarang
(1,1)
didominasi oleh(0,1)
, jadi kita berakhir denganKarena itu selalu bermain
(0,1)
adalah keseimbangan Nash. Tetapi yang aneh adalah bahwa itu bukan satu-satunya. Ini adalah permainan zero-sum simetris, jadi hadiah yang diharapkan adalah 0, dan setiap strategi campuran digabungkan(0,1)
dan di(1,0)
mana(0,1)
diambil setidaknya 50% dari waktu mencapai hasil itu. Jadi kita memiliki ruang satu dimensi dari kesetimbangan Nash.Tampaknya memang demikian, meskipun saya belum membuktikannya, bahwa
n
jari kaki Morra memilikin
polytope -dimensional Nash equilibria yang merupakan strategi campuran antaran+1
(pick, guess)
pasangan - pasangan yang dengannyapick + guess = n
.Angka-angka ajaib dalam kode di atas mengkodekan 32 simpul dari 5-dimensi polytope dari Nash equilibria. Saya menemukan mereka dengan membuat contoh pemrograman linier yang mewakili polytope dan kemudian menggunakan fungsi objektif acak. Alasan untuk meng-encode semua 32 daripada memilih satu adalah sederhana: hasil yang diharapkan adalah 0, jadi saya harus melakukan lebih baik dari yang diharapkan untuk mendapatkan kemenangan. Saya pada dasarnya berasumsi bahwa pemain lain menggunakan strategi campuran dan memperkirakan distribusi berdasarkan riwayat pilihan mereka. Kemudian saya memilih vertex polytope yang memaksimalkan keuntungan yang saya harapkan terhadap perkiraan distribusi.
QuinnAndValor menunjukkan kerentanan asumsi bahwa pemain lain menggunakan strategi campuran. Dengan mendeteksi seorang pemain yang menggunakan strategi dari Nash equilibria, ia dapat beralih ke mode jalan acak di mana, dengan memainkan strategi non-ekuilibrium, rata-rata kemungkinan ia akan kalah, tetapi ia hanya perlu mendapatkan petunjuk sekali dan kemudian itu dapat kembali ke pasangan bermain yang
pick + guess = n
. Jadi ekuilibria Nash untuk satu game tidak bisa digeneralisasi secara sepele ke ekuilibria Nash untuk game berulang, yang memungkinkan strategi yang lebih kompleks.sumber
Quinn dan Valor (Diperbarui)
Quinn dan Valor adalah tim ranger elit. Dengan panah dan cakar, mereka merobek setiap lawan yang berani menantang mereka.
Mereka hampir selalu menang melawan semua solusi Java di mesin saya.
Edit:
Saya akui Quinn dan Valor gagal duel Sejarawan, tetapi saya masih memiliki itikad baik untuk memenangkan turnamen.
Prinsip saya adalah, untuk solusi apa pun
choice + guess == 5
, juga bermain denganchoice + guess == 5
penerima untuk menjaga keuntungan Anda.Memperbarui:
Yah ... semuanya jadi rumit.
sumber
Sarjana
Cendekia mencoba belajar dari gerakan lawannya, memilih yang lawannya tidak bisa ditebak dan menebak yang lawannya paling banyak digunakan. Tapi teori bukanlah segalanya, jadi Cendekiawan tidak melakukan dengan sangat baik ...
sumber
DeltaMax
(Diperbarui untuk tidak menggunakan file dan menambahkan bagian baru. Juga dimodifikasi untuk tidak lagi macet mengikat di bagian pertama.)
Terdiri dari beberapa strategi yang mulai sederhana kemudian menjadi lebih kompleks - jika Anda menghapus satu, itu memindahkan Anda ke bagian berikutnya.
{0, 5}
secara konsisten(choice, guess)
pasangan yang akan memiliki harapan terbaik, tertimbang sehingga putaran terakhir lebih pentingUntuk mengetahui strategi yang digunakan pada akhirnya, batalkan komentar pada
baris.
Permintaan maaf untuk Jawa yang mengerikan, saya menghabiskan sore saya mengumpulkan bit bersama dan belajar kembali bahasa :)
sumber
private int strat;
cukup baik.Sejarawan
(Diperbarui: logika yang sama, kode lebih pendek dan 100 kali lebih cepat tetapi Anda hanya dapat menggunakan satu bot Sejarawan di sebuah turnamen.)
Menggunakan pembobotan acak untuk memilih pasangan lemparan-tebak berdasarkan efektivitas hanya menggunakan pasangan itu terhadap sejarah lawan sebelumnya. Bobot adalah kuadrat dari skor yang dapat dicapai.
Ketukan
Quinn and Valor
(tidak lagi) dan kalahMorra Cowbell
. Dalam turnamen dengan sebagian besar botHistorian
datang keduaQuinn and Valor
.sumber
Morra Cowbell
. Mengedit pos. Anda dapat menghapus komentar jika itu menjadi usang.Extrapolator (v1.1)
Ekstrapolasi ekstrem dari salah satu kesetimbangan Nash dari permainan yang lebih sederhana.
Saya mendukung format jawaban singkat! (Dalam gaya python.)
Tampaknya terikat dengan Sapi Sihir (Morra Cowbell) dan mengalahkan entri lain yang saya periksa.
sumber
Trendi
Trendy melihat gerakan masa lalu lawan, menimbangnya dengan kebaruan. Menebak yang paling berat, dan mengambil satu bergeser sedikit dari itu. Ini dia, dengan segala kemuliaan:
Satu-satunya hal yang dapat saya bandingkan dengan sekarang adalah Cowbell. Sebagian besar waktu hilang dengan margin kecil, tetapi muncul di atas cukup sering sesuai dengan keinginan saya. Kita akan lihat bagaimana hasilnya dengan lebih banyak pesaing.
sumber
Tebak Acak
Ini sangat mudah. Ini secara efektif menggulung d6, dan menambahkan gulungan lain ke gulungan sebelumnya untuk tebakannya. Itu tidak akan menang, tetapi itu akan memberikan tolok ukur yang bagus.
sumber
Bingung, Python 3
Entri rumit yang tidak perlu. Bahkan saya tidak tahu apa fungsinya.
Meskipun algoritme canggih ini tampaknya berkinerja lebih buruk daripada acak di turnamen ini, dan menggunakan memori dan run-time yang signifikan, namun hasilnya menakjubkan untuk nilai 5 ;-)
sumber
Rainbolt
Membawa perbedaan antara dua angka terakhir yang ditebak lawan kami, menambahkannya ke tebakan terbaru lawan kami, menemukan modulus, dan menghindari memilih nomor itu dengan cara apa pun. Misalnya, jika Anda menebak {5,4,3} (berkurang satu) maka kami akan menghindari memilih 2 di semua biaya.
Membawa perbedaan antara dua angka terakhir yang dipilih lawan kita, menambahkannya ke pilihan terakhir lawan kita, dan menebak angka itu. Misalnya, jika Anda menebak {1,4,5,2} (bertambah tiga kali lipat) maka kami akan menebak 5.
Menghindari roll yang tidak berguna atau sangat dekat.
sumber
getMove()
metode Anda statis. Anda tidak dapat menerapkan metode non-statis seperti itu (setidaknya tidak di Java 8).Bot Berkembang
Saya mengembangkan bot ini menjadi bot berbasis acak terbaik.
sumber
Popularitas, Python 3
Hitung tebakan berdasarkan angka populer yang digunakan di masa lalu oleh lawan. Angka yang digunakan baru-baru ini memiliki bobot lebih. Pilihan angka seringkali sama dengan tebakan.
sumber
Interpolator
(Beralih ke Java sejak Python menyebabkan masalah)
Gunakan interpolasi polinomial pada 10 pilihan lawan terakhir untuk mencari tahu nomor lawan berikutnya, kemudian lakukan hal yang sama dengan pilihannya sendiri dan hindari memilih nomor itu. Selain itu, Interpolator memiliki sedikit bias terhadap pemilihan 0 atau 5, dan pilihannya terkadang dipengaruhi oleh tebakannya:
sumber
CounterBot
Tidak melawan siapa pun melainkan menghitung melalui 0-5 dalam lingkaran (
0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4 ...
)sumber
Basilisk, Python
Menurut legenda, The Basilisk adalah raja ular. ( sumber ) Saya pikir itu nama yang tepat untuk bot yang memainkan "The Noble Game Of Kings" dan ditulis dengan python. = D Bot ini menyerang ketakutan ke jantung bot lain, dan menyebabkan kematian dengan sekali pandang.
Ini berjalan pada strategi yang cukup sederhana. Saya tidak berharap untuk menang, tapi itu menyenangkan untuk ditulis. Ini juga tantangan KoTH pertama saya, jadi saya senang melihat seberapa baik kinerjanya.
Bagaimana ia mengambil langkah selanjutnya.
Basilisk selalu melakukan langkah yang paling tidak bisa ditebak lawannya. Dalam kasus dasi, ia akan memilih nomor yang lebih kecil. (untuk meminimalkan jumlah poin lawan.)
Bagaimana ia mengambil tebakan berikutnya.
Basilisk akan memilih respons yang paling mungkin untuk perkiraan sebelumnya. Misalnya, Jika terakhir kali, ia menebak 3, ia akan kembali melalui semua waktu sebelumnya bahwa ia telah menebak 3, dan kemudian mengembalikan gerakan lawan paling umum yang muncul setelah tebakan 3. Dalam kasus seri , ia akan memilih jumlah yang lebih besar (untuk memaksimalkan jumlah poin yang bisa dihasilkannya.)
Pada catatan teknis, apakah ini akan berjalan dengan benar? Apakah print () cukup, atau haruskah saya menggunakan sesuatu seperti sys.stdout.write () seperti yang dilakukan oleh Pythonista lainnya?
sumber
Dito
Ini berubah menjadi lawan, tetapi dibelakang dengan satu tebakan / pilihan.
sumber
NullifierBot, Java
Selalu melempar 0 untuk meminimalkan kemenangan lawan. Jika lawan pernah menebak nomor saya, mereka hanya mendapatkan apa yang mereka lemparkan.
Selalu tebak 5 untuk memaksimalkan kemenangan saya. Karena saya tidak bisa mendapatkan poin dari lemparan saya, saya ingin mendapatkan banyak dari lawan. Saya bisa menebak secara acak, tapi di mana kesenangannya?
sumber
Erratica, Jawa
Tidak hebat, tetapi pada awalnya dirancang untuk sebagian besar acak, sampai nilai tukar muncul pada saya. Berhasil kehilangan secara konsisten vs. Counter Bot> _ <
sumber
Echo, Ruby
Mainkan drama terakhir yang dibuat lawan, berdasarkan teori bahwa siapa pun dapat membuat bot yang tidak dapat mereka prediksi. Tebakan berdasarkan nilai ekspektasi menggunakan sampel seratus langkah.
sumber
echo.rb:3:in
<main> ': metode yang tidak ditentukansize' for nil:NilClass (NoMethodError)
. Tampaknya hanya terjadi di babak pertama, ketika tidak ada riwayat bergerak.if (mychoices.size > 990 && myscore == '0') nextchoice = rand(1..5)
bagian itu?RAJA NELAYAN
Orang ini terdiri dari alghoritma tebakan buruk yang kebanyakan menggunakan array berbobot.
sumber
Uh uh. Saya tahu apa yang Anda pikirkan. "Apakah dia akan memilih lima atau yang lain?" Ya, sejujurnya dalam semua kegembiraan ini, saya agak tidak yakin, tetapi karena ini adalah metode .44, metode yang paling kuat di dunia dan akan membebani tumpukan Anda dengan segera, Anda harus bertanya pada diri sendiri satu pertanyaan : "Apakah saya merasa beruntung?"
Nah, lakukan ya, punk?
sumber