Hasil akhir tersedia
pengantar
Setelah KOTH saya sebelumnya dengan tema-tema berat ( perang fantasi , pandemi di seluruh dunia ...), saya kembali dengan permainan ringan baru. Kali ini, Anda berhadapan dalam situasi "seperti permainan papan". Setumpuk koin terbalik diletakkan di tengah meja yang sangat besar, dan Anda bertekad untuk mendapatkan bagian dari jarahan Anda!
Glosarium
Koin : Token yang dapat dibalik atau tidak terbalik.
Unflipped : Koin ditempatkan di atas meja dengan nilainya menunjuk ke bawah. Ini adalah kondisi default dari koin.
Terbalik : Koin ditempatkan di atas meja dengan nilainya mengarah ke atas.
Lokal : Mengacu pada tumpukan koin Anda.
Global : Mengacu pada tumpukan koin di tengah.
Prinsip
Di awal permainan, setiap pemain mulai dengan 0 poin dan 0 koin (terbalik atau tidak terbalik). Permainan ini berbasis giliran. Selama giliran mereka, pemain dapat mengambil hingga 3 tindakan berinteraksi baik dengan tumpukan koin di tengah meja, tumpukan koin mereka sendiri atau dengan pemain lain.
Play order didefinisikan secara acak pada awal permainan. Urutan para pemain dalam daftar argumen mewakili urutan giliran, dan ia bergerak dari kiri ke kanan dalam daftar itu. "Selanjutnya" dan "Sebelumnya" merujuk masing-masing ke "di sebelah kanan dalam daftar itu" dan "di sebelah kiri dalam daftar itu" dengan satu lingkaran jika Anda adalah yang terakhir dari kedua sisi.
Permainan ini berlangsung selama 50 putaran atau sampai ada 0 koin di tengah pada akhir giliran pemain (artinya Anda akan menyelesaikan 3 tindakan Anda bahkan jika tumpukan kosong setelah aksi pertama Anda, dan Anda dapat mengembalikan koin untuk membiarkannya permainan berlanjut). Jumlah awal koin global didefinisikan secara acak dengan rumus ini:
(2 ^ nb_players) + (nb_players * 10) - random(1 + (nb_players ^ 2))`
Setiap tindakan akan memberi Anda poin (atau membuat Anda kehilangan beberapa) dan pada akhir permainan, setiap koin yang Anda miliki akan ditambahkan ke poin Anda ( -1 untuk tidak terbalik, +2 untuk dibalik ). Pemain dengan skor tertinggi menang.
Kontroler memberi Anda input melalui argumen perintah, dan program Anda harus menampilkan melalui stdout.
Sintaksis
Memasukkan
Setiap kali program Anda dipanggil, ia akan menerima argumen dalam format ini:
Round;YourPlayerId;Coins;PlayerId_Points_Flipped_Unflipped;PlayerId_Points_Flipped_Unflipped;...
Babak 1-diindeks.
Contoh input
6;2;52;1_20_3_12;0_-2_0_1;2_12_1_0
Di sini, Anda melihat itu adalah ronde ke-6 dan Anda adalah pemain 2. Ada 52 koin di tumpukan pusat. Anda memiliki 12 poin, 1 koin terbalik dan 0 koin tidak terbalik. Poin bisa negatif.
Keluaran
Anda harus menampilkan tiga karakter (tanpa spasi, tanpa pemisah), yang masing-masing sesuai dengan satu tindakan yang akan Anda ambil giliran ini. Urutan karakter menentukan urutan tindakan. Anda dapat menampilkan tindakan yang sama beberapa kali. Jika tidak ada koin yang cukup untuk menyelesaikan tindakan Anda, koin akan menggunakan maksimum koin yang tersedia dan hanya menghitung poin untuk koin yang digunakan.
N
: Tidak Melakukan apa-apa
1
: Ambil 1 koin dari tumpukan pusat [Efek: +1 tidak berbintik lokal / -1 poin / -1 tidak berbelok global]
2
: Ambil 2 koin dari tumpukan pusat [Efek: +2 tidak berbintik lokal / -2 poin / -2 global unflipped]
3
: Ambil 3 koin dari tumpukan pusat [Efek: +3 local unflipped / -3 poin / -3 global unflipped]
A
: Masukkan kembali 1 koin dari tumpukan Anda [Efek: -1 local flflipped / +1 point / +1 global unflipped]
B
: Masukkan kembali 2 koin dari tumpukan Anda [Efek: -2 poin lokal tidak terbuka / +2 poin / +2 global poin membalikkan]
C
: Masukkan kembali 3 koin dari tumpukan Anda [Efek: -3 local poin tidak terbuka / +3 poin / +3 global unflipped]
X
: Hapus 1 koin dari tumpukan Anda[Efek: -1 local unflipped / 0 point]
Y
: Hapus 2 koin dari tumpukan Anda [Efek: -2 local unflipped / 0 point]
Z
: Hapus 3 koin dari tumpukan Anda [Efek: -3 local flflipped / 0 point]
R
: Putar koin ke pemain sebelumnya [Efek: -1 poin per unflipped diterima, +2 poin per flipped diterima / berlaku untuk semua pemain]
T
: Putar koin ke pemain berikutnya [Efek: -1 poin per unflipped diterima, +2 poin per flipped diterima / berlaku untuk semua pemain]
F
: Balik 1 koin [Efek: -1 local flflipped / +1 local flipped / +2 point]
U
: Unflip 1 coin [Efek: +1 local flflt / -1 local flipped / -2 point]
Contoh output
2FF
: Mengambil dua koin dan membalik dua koin, mencetak gol -2 + 2 + 2 = 2 points
Jika output Anda salah, controller akan menganggap NNN
.
Pengendali
Anda dapat menemukan pengontrol di GitHub . Ini juga mengandung dua samplebot, ditulis dalam Java. Untuk membuatnya berjalan, periksa proyek dan buka di Java IDE Anda. Titik masuk dalam main
metode kelas Game
. Diperlukan Java 8.
Untuk menambahkan bot, pertama Anda perlu versi kompilasi untuk Java (file .class) atau sumber untuk bahasa yang ditafsirkan. Tempatkan mereka di folder root proyek. Kemudian, buat kelas Java baru dalam players
paket (Anda dapat mengambil contoh pada bot yang sudah ada). Kelas ini harus menerapkan Player
untuk mengganti metode String getCmd()
. String yang dikembalikan adalah perintah shell untuk menjalankan bot Anda. Misalnya, Anda dapat membuat Ruby bot bekerja dengan perintah ini: return "C:\Ruby\bin\ruby.exe MyBot.rb";
. Terakhir, tambahkan bot di larik pemain di bagian atas Game
kelas.
Aturan
- Bot tidak boleh ditulis untuk mengalahkan atau mendukung bot lain yang spesifik.
- Menulis ke file diperbolehkan. Silakan menulis ke "milikmu submisi.txt", folder akan dikosongkan sebelum permainan dimulai. Sumber daya eksternal lainnya tidak diizinkan.
- Kiriman Anda memiliki 1 detik untuk merespons.
- Berikan perintah untuk mengkompilasi dan menjalankan kiriman Anda.
Bahasa yang didukung
Saya akan mencoba dan mendukung setiap bahasa, tetapi harus tersedia online secara gratis. Harap berikan instruksi untuk pemasangan jika Anda tidak menggunakan bahasa "arus utama".
Sampai sekarang, saya dapat menjalankan: Java 6-7-8, PHP, Ruby, Perl, Python 2-3, Lua, R, node.js, Haskell, Kotlin, C ++ 11.
Hasil akhir
Ini adalah hasil dari 100 pertandingan (poin ditambahkan):
1. BirdInTheHand: 1017790
2. Balance: 851428
3. SecondBest: 802316
4. Crook: 739080
5. Jim: 723440
6. Flipper: 613290
7. Wheeler: 585516
8. Oracle: 574916
9. SimpleBot: 543665
10. TraderBot: 538160
11. EgoisticalBot: 529567
12. RememberMe: 497513
13. PassiveBot: 494441
14. TheJanitor: 474069
15. GreedyRotation: 447057
16. Devil: 79212
17. Saboteur: 62240
Hasil individual dari permainan tersedia di sini: http://pasted.co/63f1e924 (dengan koin awal dan jumlah putaran per game).
Hadiah 50 reputasi diberikan kepada pemenang: Bird In The Hand oleh Martin Büttner .
Terima kasih semua atas partisipasi Anda, sampai jumpa KOTH berikutnya ~
sumber
Jawaban:
Burung di Tangan, Ruby
Jika tidak ada di antara kita yang memiliki bug dalam program mereka, algoritma utama ini kemungkinan sangat mirip dengan Oracle Mathias. Berdasarkan asumsi bahwa sebelum babak final kita tidak dapat mengetahui koin yang akan kita dapatkan, kita mengevaluasi serangkaian gerakan saat ini murni berdasarkan poin yang diterima segera, mengabaikan sepenuhnya jenis koin yang akan kita dapatkan dengan. Karena hanya ada 14 3 = 2744 set gerakan yang memungkinkan, kita dapat dengan mudah mensimulasikan semuanya untuk mengetahui berapa banyak poin yang akan mereka bawa.
Namun, jika satu set gerakan mengakhiri permainan (baik karena mengurangi pot global menjadi nol, atau karena ini adalah putaran 50 dan kami yang terakhir bergerak), maka ia juga memperhitungkan koin yang dimiliki pada akhir move set untuk menentukan nilai move set. Saya pertama kali mempertimbangkan untuk mengakhiri permainan jika memungkinkan, tetapi ini akan menghasilkan langkah mengerikan
333
ketika hanya ada 9 koin yang tersisa di pot.Jika ada beberapa set gerakan yang memberikan hasil yang sama, kami memilih yang acak. (Saya mungkin mengubah ini untuk bias dalam mendukung set langkah penghentian game.)
sumber
Oracle, Python 3
Pembaruan: mengubah urutan berbagai upaya untuk memilih tumpukan koin lebih rendah daripada rotasi.
Mencoba setiap output yang mungkin dan pertahankan yang menghasilkan jumlah poin maksimum untuk giliran ini.
sumber
deepcopy
kompleksitas ruang (dengan demikian waktu [ ]) hanya dengan menjaga tetangga yang relevan. Namun, tidak yakin bagaimana itu akan berdampak pada hal-hal.filter_neighbors
dan memodifikasiinvalid_move
akun untuk klarifikasi dalam pertanyaan. Saya tidak dapat mereproduksi kesalahan:$ python oracle.py '4;7;2040;8_-28_1_10;9_-43_0_9;2_-10_4_3;6_-24_6_3;0_6_2_12;1_48_3_0;10_21_4_8;5_6_5_1;4_-12_3_7;7_10_1_3;3_1_1_0'
cetakanTTR
Rotasi Serakah, Ruby
Ini sangat mirip dengan pendekatan ArtOfCode, kecuali bahwa ini memeriksa dari tetangga mana kita bisa mendapatkan lebih banyak poin, dan itu memilih
C
daripadaF
jika kita berakhir dengan 3 atau lebih koin setelah rotasi.Setelah menulis ini, saya cukup yakin bahwa pendekatan yang lebih baik adalah hanya dengan rakus memilih yang terbaik dari semua gerakan setiap kali, mendahului rotasi dengan mengambil jika memungkinkan (alih-alih menempel pada tetap "dapatkan dibalik, memutar, menyingkirkan dari pola "tidak terbuka".
Ini juga tidak memperhitungkan poin implisit yang diwakili oleh koin yang sebenarnya dimiliki (berdasarkan asumsi bahwa permainan akan bertahan cukup lama sehingga saya mungkin tidak akan menyimpan koin saya pada akhirnya).
sumber
Sirip, Python 2
Sirip mengumpulkan koin dan mencoba untuk membalik tanpa membalik untuk membalik. Flipper bukanlah pemain yang cerdas tetapi mencoba untuk menjadi kekuatan positif dalam permainan.
Flipper hanya perlu
python flipper.py <arg>
dijalankan.sumber
SimpleBot, Python 3
SimpleBot, yah, sederhana. Dia telah menyusun satu strategi dan dia akan tetap menggunakannya.
Untuk berlari:
di mana isi
main.py
file adalah:sumber
Saldo, Lua
Balance akan mencoba untuk menjaga keseimbangan dalam tokennya, meminimalkan kerugian jika seseorang menggunakan
R
dan melakukanT
tindakan terhadapnya. Dia berpikir gaya hidup ini adalah yang benar dan harus diberlakukan kepada siapa pun yang tidak menjaga keseimbangan yang baik dari koin yang terbalik / tidak terbalik, sehingga semua orang yang dekat dengannya akan dihukum segera setelah itu bisa membuat mereka kehilangan poin.Dia membutuhkan perintah berikut untuk dijalankan:
Di mana file balance.lua berisi bagian kode berikut:
sumber
Sang Petugas Kebersihan, Python 3
Dia mencoba untuk membersihkan kekacauan yang dibuat pemain lain dengan semua koin ini dan memasukkannya kembali ke kolam.
Dia mencoba untuk mengembalikan semua koinnya yang tidak diputar, jika dia memiliki koin yang terbalik dia akan melepas koinnya dan jika dia menghilangkan semua koinnya dia akan mendapatkan koin orang lain.
sumber
Crook, R
Untuk berlari:
Rscript Crook.R
Pada dasarnya ia menukar koinnya dengan tetangganya hanya jika pertukarannya tidak seimbang. Jika tidak ada pertukaran menguntungkan yang memungkinkan, maka pertukaran koin dengan tumpukan global dengan cara yang menjaga rasio tetap utuh tetapi menghasilkan beberapa poin.
Sunting: Saya menambahkan sedikit kedalaman ke bot ini dengan membuatnya memeriksa tumpukan pemain 2 dan 3 berikutnya dan bukan hanya yang berikutnya dan memeriksa apakah, secara keseluruhan, bermanfaat untuk memutar sebanyak itu.
Sunting ke-2 : Mengikuti ide @ MartinBüttner, bot sekarang melakukan "RT", atau "TR", jika itu akan bermanfaat baginya lebih daripada tetangganya (jika saya tidak mengacaukan penerapannya :)).
sumber
RTR
sehingga Anda mendapatkan skor dari koinnya dua kali.Jim, Ruby
berdasarkan pada Greedy Rotation karya Martin Büttner .
akan berputar satu arah atau yang lain, tergantung pada apa yang akan memberinya poin terbanyak dibandingkan dengan pemain terbaik lainnya. Kemudian, ia membalik uang tunai cepat.
sumber
TraderBot
Bot ini mencoba berputar kapan pun yang mengambil poin terbanyak dalam tindakan itu. Jika tidak dapat berputar maka cobalah untuk menyingkirkan koin yang belum diubah atau mengambil beberapa koin lagi untuk mengubahnya dalam tindakan berikut.
import java.util.List;
TraderBot kelas publik {
Untuk menjalankan: Cukup tambahkan ke folder yang sama dengan bot default dan kemudian buat kelas berikut
Kemudian tambahkan kelas itu ke
Player[] players
array.sumber
Wheeler
Wheeler menghitung langkah terbaik untuk itu ketika memutar koin.
sumber
Saboteur, Python 2
Keacakan berarti itu mungkin tidak akan menyabot dengan sangat baik, tapi kemudian saya pikir saya akan menunggu sampai 'akhir' (berapa banyak putaran / koin yang tersisa) dan MAKA berputar, setelah melihat pemain terdekat yang bisa dijangkau untuk mencuri dari ... sebenarnya hanya melakukan satu rotasi tampaknya sangat buruk, mengingat orang lain juga cenderung menggunakan rotasi. Saya tidak berpikir ini akan bekerja dengan baik ...
sumber
SecondBest, Python 3
Program ini akan melewati semua kemungkinan kombinasi 3 langkah dan memilih yang terbaik kedua.
Karena jika Anda memiliki langkah yang sempurna, itu mungkin jebakan.
Edit: dihapus input komentar keluar
Sunting: Kode sedang mencetak langkah hukum acak. Sekarang seharusnya mengembalikan hasil terbaik kedua.
sumber
Devil's Bot
Meskipun outputnya hanya setengah dari angka iblis, hasilnya seharusnya cukup berbahaya. Mengambil 9 koin setiap belokan, akhirnya menghabiskan tumpukan koin. Karena bot ini tidak pernah membalik koin yang diperlukan, maka sangat buruk bagi orang lain yang duduk di sebelahnya ketika ada rotasi (-9 poin untuk setiap belokan yang diambil oleh bot ini).
Perintah:
python3 devil.py
Saya berharap untuk membuat bot nyata nanti.
sumber
Remember Me, Python 3
Program ini berisi sejumlah besar data inbuilt dari pengujian terhadap bot SecondBest yang diperbaiki.
Ini harus belajar tentang apa yang bergerak adalah yang terbaik untuk digunakan, tetapi tidak menggunakan input pemain lain.
Sunting: menghapus perhitungan poin yang tidak perlu
Sunting: input pemain yang tidak dicommentasikan
sumber