King of the Hill: Bank Heist

15

Contoh run ditambahkan 4/11

Klarifikasi Aturan 4/8: Semua pengiriman akan bersaing dalam satu turnamen gratis untuk semua raksasa yang terdiri dari sebanyak pertandingan yang dapat dilakukan oleh komputer saya dalam 48 jam.

Siapa pun yang menghabiskan waktu menonton streaming di Twitch menyadari prevalensi DeepBot , dan mungkin bahkan akrab dengan permainan taruhan Bank Heist- nya. Turnamen King of the Hill ini langsung terinspirasi oleh game itu. Tapi jangan khawatir. Saya pikir saya telah melemparkan cukup ketegaran ekstra ke versi ini untuk menjaga hal-hal menarik.

Contoh cepat

#####GAME 13: 16 players######

Round 1:
gunHeCK bet 0.
PassivePanga bet 69.
SnitcherKing bet 1.
Lurker bet 0.
OC'sRandomTpyos bet 1.
MonisAddiction bet 69.
RaysFive01K bet 28.
LimeadeSneaktar bet 1.
KaylorrCriterion bet 0.
HardHatUmar bet 0.
HeCKuSumer bet 185.

Round 2
HeCKuSumer decided to !guncheck.
LimeadeSneaktar decided to double cross.
MonisAddiction decided to all in.
OC'sRandomTpyos decided to acquire intel.
RaysFive01K decided to deposit.
SnitcherKing decided to finger.
PassivePanga decided to !guncheck.

Results
PassivePanga failed. :(
SnitcherKing failed. :(
OC'sRandomTpyos was successful, and may gain ¥0
MonisAddiction failed. :(
RaysFive01K was successful, and may gain ¥0
LimeadeSneaktar was successful, and may gain ¥1
HeCKuSumer failed. :(

Results:
0. KaylorrCriterion: 3600
1. Lurker: 3600
2. gunHeCK: 3600
3. SnitcherKing: 3586
4. PassivePanga: 2634
5. LimeadeSneaktar: 2496
6. HeCKuSumer: 1909
7. HardHatUmar: 490
8. RaysFive01K: 255
9. OC'sRandomTpyos: 170
10. MonisAddiction: 0

(In this round, 7 players joined the heist, but the dice only rolled right for 3 of them. Of those, only LimeadeSneaktar brought any home--having stolen it from OcsRandomTpyos. RaysFive01K won significantly more, but deposited it all at the bank before leaving. At this point, the players who did not heist are doing well, living off their day jobs.)

#####GAME 14: 231 players######

Round 1:
Lurker bet 0.
HeCKuSumer bet 190.
KaylorrCriterion bet 0.
HardHatUmar bet 0.
MonisAddiction bet 0.
OC'sRandomTpyos bet 1.
gunHeCK bet 0.
LimeadeSneaktar bet 1.
RaysFive01K bet 25.
PassivePanga bet 69.
SnitcherKing bet 1.

Round 2
PassivePanga decided to !guncheck.
OC'sRandomTpyos decided to buy guard.
HeCKuSumer decided to !guncheck.
SnitcherKing decided to finger.
RaysFive01K decided to deposit.
LimeadeSneaktar decided to double cross.

Results
HeCKuSumer failed. :(
OC'sRandomTpyos failed. :(
LimeadeSneaktar failed. :(
RaysFive01K failed. :(
PassivePanga failed. :(
SnitcherKing failed. :(

Results:
0. KaylorrCriterion: 3840
1. Lurker: 3840
2. gunHeCK: 3840
3. SnitcherKing: 3825
4. PassivePanga: 2805
5. LimeadeSneaktar: 2495
6. HeCKuSumer: 1959
7. HardHatUmar: 490
8. MonisAddiction: 240
9. RaysFive01K: 229
10. OC'sRandomTpyos: 161

Six players heisted--but should have been paying more attention to the rabble and backed out, because the probabilities dropped too low to win, and all failed.


#####GAME 15: 300 players######

Round 1:
OC'sRandomTpyos bet 1.
Lurker bet 0.
SnitcherKing bet 1.
MonisAddiction bet 69.
LimeadeSneaktar bet 1.
gunHeCK bet 0.
HardHatUmar bet 0.
RaysFive01K bet 22.
KaylorrCriterion bet 0.
HeCKuSumer bet 195.
PassivePanga bet 69.

Round 2
HeCKuSumer decided to !guncheck.
OC'sRandomTpyos decided to buy guard.
MonisAddiction decided to all in.
PassivePanga decided to !guncheck.
LimeadeSneaktar decided to double cross.
RaysFive01K decided to deposit.
SnitcherKing decided to finger.

Results
OC'sRandomTpyos failed. :(
SnitcherKing failed. :(
MonisAddiction was successful, and may gain ¥0
LimeadeSneaktar failed. :(
RaysFive01K failed. :(
HeCKuSumer failed. :(
PassivePanga failed. :(

And here, the probabilities dropped too low to win again--except for MonisAddiction, who went all in, and therefore avoided the probability modification incurred by the rabble backing out. No winnings are listed here, because a player who wins going all in immediately adds all winnings to its holdings without any possible modification by other players' actions.

Aturan Game

Struktur Turnamen / Game

  • Turnamen ini akan terdiri dari sejumlah game yang dipilih secara seragam secara acak antara 1000 dan 1100, di mana setiap pengiriman serius akan bersaing secara bersamaan dalam gratis-untuk-semua.
  • Setiap pemain memulai gim pertama dengan 240 kredit dan setiap gim berikutnya dengan jumlah kredit pada akhir gim sebelumnya.
  • Setiap pertandingan berlangsung dalam 2 putaran, dan dalam setiap putaran, pemain dipanggil dalam urutan yang ditentukan secara seragam secara acak untuk membuat satu keputusan:
    • Di babak pertama, seorang pemain dapat membayar jumlah bilangan bulat kredit antara 0 dan kepemilikan kredit saat ini untuk partisipasi saham dalam pencurian bank.
    • Di babak kedua, setiap pemain yang terpilih untuk berpartisipasi dalam pencurian dengan bertaruh setidaknya satu kredit (selanjutnya disebut "heister") dapat memutuskan untuk membiarkan taruhannya naik (dan, saat melakukannya, mungkin melakukan beberapa tindakan lain), menyisih dari pencurian, atau pergi all-in. (Opsi ini dijelaskan lebih lanjut di bawah ini.)
  • Berdasarkan jumlah heister dan jumlah kredit yang mereka bayar, satu dari lima bank dipilih untuk melakukan pencurian. Pilihan ini memengaruhi probabilitas kemenangan individu dan kemungkinan penentuan pembayaran. (Bank-bank dijelaskan di bawah ini.)
  • Setiap heister yang tidak memilih keluar akan, dengan probabilitas bank (dimodifikasi), memenangkan taruhannya dikalikan dengan peluang taruhan bank (dimodifikasi) (dibulatkan ke bawah), atau kehilangan taruhannya. Perhatikan bahwa keberhasilan atau kegagalan setiap pemain ditentukan secara individual - beberapa akan berhasil ketika yang lain gagal.
  • Semua pemain, apakah mereka berpartisipasi atau tidak, berhasil atau gagal, kemudian menerima gaji (dengan pengecualian yang diuraikan di bawah).
  • Perhatikan bahwa tidak mungkin meninggalkan game secara permanen. Paling buruk, seorang pemain mungkin harus menunggu permainan untuk menerima gaji berikutnya.
  • Setelah semua 1000-1100 pertandingan, pemain dengan jumlah kredit terbesar akan dinyatakan sebagai pemenang turnamen itu.
  • Turnamen akan diulang beberapa kali tidak ditentukan (sebanyak yang dapat dihitung dalam 48 jam) dan penghasilan pemain di semua turnamen dijumlahkan untuk menentukan pemenang keseluruhan dari kontes ini.

Babak Taruhan Kedua

  • Setiap pemain yang bertaruh positif pada putaran pertama dapat ikut serta dalam putaran kedua.
  • Di babak ini, pemain dapat:
    • balas dengan string "mundur" untuk membatalkan taruhannya. Ini akan menetapkan taruhannya ke nol untuk pencurian saat ini dan juga sedikit mengurangi kemungkinan para pemain yang tersisa dalam pencurian akan berhasil. Dengan mengambil opsi ini, seorang pemain lupa pembayaran gaji 240 kredit yang mengikuti pencurian sebagai hukuman karena menempatkan para menteri yang tersisa dalam bahaya. (Sisa-sisa heisters akan berhasil dengan probabilitas sama dengan probabilitas bank dikalikan dengan fraksi heisters yang tidak "mundur".)
    • balas dengan string "serba ada" untuk meledakkan seluruh kepemilikan kreditnya - dan mengambil pinjaman gaji pada 240 cek kredit berikutnya - untuk membeli semua peralatan dan intel terbaik untuk pencurian dan masuk sendiri, meriam, tanpa senjata mengandalkan siapa pun. Probabilitas kemenangan pemain seperti itu tidak dapat dipengaruhi oleh heister lain yang keluar dari pencurian, juga kemenangannya tidak dapat dicuri oleh crosser ganda. Pembayaran yang menang akan ditentukan seolah-olah taruhannya adalah seluruh kepemilikan kredit ditambah 240, sementara kerugian akan mengatur kepemilikannya menjadi nol.
    • Balas dengan string lain (termasuk string kosong) untuk tetap dengan taruhan sebelumnya dan melanjutkan dengan pencurian seperti biasa. (Jawaban yang disarankan: "! Guncheck"). Balasan tertentu akan memiliki efek samping tambahan:
      • Balasan "ganti pekerjaan" akan menyebabkan pemain berhenti dari pekerjaannya. Mulai babak ini, pada akhir setiap putaran, pemain akan memiliki peluang 5% untuk dipekerjakan di posisi baru. Jika ini berhasil, pemain tersebut disewa dan segera menerima gaji pertamanya. Setiap pekerjaan baru dijamin untuk membayar tepat 5% lebih dari yang terakhir (dibulatkan ke bawah). Tindakan ini akan berhasil apakah pencurian berhasil atau tidak.
      • Balasan "memperoleh intel" akan, jika pencurian berhasil, menyebabkan pemain menghabiskan semua kemenangannya dari pencurian itu untuk mendapatkan 0,00001 ekstra per kredit sehingga dihabiskan untuk peluang bank yang hanya mendapatkan pemain itu saja . Modifikasi peluang ini bersifat permanen. Sebagai contoh, jika seorang pemain memilih tindakan ini ketika mengambil bank 1 dan memenangkan 6969 kredit dalam pencurian, peluang bank 1 untuk pemain itu akan meningkat secara permanen sebesar 0,06969 dan pemain tidak akan menerima apa pun dari pencurian itu.
      • Balasan "penjaga pembelian" akan menyebabkan pemain membeli salah satu penjaga keamanan di bank yang sedang diajak. Sebagai imbalan untuk pengurangan permanen 1 kredit pada gaji pemain itu (suap reguler penjaga), pemain akan menerima "peningkatan" kemungkinan kemenangan yang meningkat secara permanen di bank itu (karena penjaga "lupa menyebutkan" pemain itu kepada polisi ketika tanya). Probabilitas akan meningkat tepat 1% dari perbedaan antara probabilitas kemenangan pemain saat ini di bank itu dan 100%. Tindakan ini akan berhasil bahkan jika pencurian gagal. CATATAN: Jika suatu saat, seorang pemain tidak memiliki kredit yang cukup untuk membayar semua suap penjaga, segera dan "secara permanen" kehilangan bonus probabilitas sebanyak jumlah suap yang tidak dapat dibayar,
      • Balasan "setoran" akan, jika pencurian berhasil, meninggalkan seluruh kemenangan pemain dalam akun di bank heisted. Kredit tidak akan dapat diakses untuk tujuan apa pun atau diperhitungkan terhadap skor pemain sampai ditarik. Akun ini akan membayar bunga pada tingkat 0,14% per game.
      • Balasan "penarikan" akan, jika pencurian berhasil, menambah kemenangan pemain seluruh isi akunnya di bank heisted. Akun akan menjadi nol sebagai hasilnya. Perhatikan bahwa kemenangan tambahan ini dapat dicuri oleh penyilang ganda.
      • Balasan "silang ganda" akan melakukan satu dari dua hal:
        • Jika jumlah heister yang memainkan "double cross" paling banyak 1/10 (dibulatkan ke bawah) dari jumlah total heister non-rakyat jelata yang memutuskan untuk melanjutkan dengan pencurian (atau tepatnya satu jika ada kurang dari 10 pemain seperti itu) ), pemain akan menerima kemenangan tambahan sama dengan total kemenangan semua non-lintas ganda dibagi dengan jumlah lintas ganda (dibulatkan ke bawah). Semua non-double-crosser dalam hal ini menerima 0 kredit dari pencurian. Dengan kata lain, pelintas ganda mencuri kredit orang lain dan membaginya secara merata di antara mereka sendiri.
        • Jika jumlah heister yang memainkan "double cross" melebihi ambang batas, pemain tidak akan menerima kemenangan (jika pencuriannya berhasil), potong gajinya menjadi dua, dan dipecat dari pekerjaannya. (Lihat "ganti pekerjaan".) Semua yang bukan pelintas ganda (termasuk rakyat jelata) dalam hal ini akan menerima pembayaran bonus dari total kemenangan semua pelintas ganda dibagi dengan jumlah total pelintas bukan-ganda. Dengan kata lain, konspirasi menjadi terlalu besar untuk dirahasiakan, para konspirator dicabut dan dikeluarkan dari pencurian, dan semua orang membagi taruhannya untuk hukuman - dan reputasi mereka untuk urusan kotor kehilangan pekerjaan mereka juga.
      • Sebuah jawaban dari "jari" (seperti dalam "meraba tikus bajingan lintas ganda") akan, jika pencurian berhasil, memberikan pemain delapan peluang (menggambar secara seragam dengan penggantian dari set non-rakyat jelata heisters) untuk mengidentifikasi dua crosser yang belum diidentifikasi .
        • Setiap double-crosser yang diidentifikasi dengan cara ini akan segera membayar jari 25% dari kepemilikan kredit saat ini (dibulatkan) sebagai pengganti ditembak, kehilangan pekerjaannya dan memotong gajinya menjadi dua (karena bos tidak akan mentolerir perilaku buruk) , dan kehilangan 5% dari kemungkinan kemenangannya di bank yang sedang diajak (karena para pengembara lainnya sangat curiga di masa depan dan cenderung membuangnya di bawah bus jika keadaan menjadi lebih buruk). Double-crosser yang diidentifikasi dengan cara ini tidak memengaruhi apakah double-cross berhasil untuk double-crosser lainnya, tetapi mereka tidak menerima kredit yang dicuri dari double-cross, dan mengatakan kredit curian akan didistribusikan kembali ke non-cross-cross. lintas ganda.
        • Jika tidak ada pelintas ganda yang diidentifikasi dengan cara ini, snitch akan mendapatkan jahitan karena membuang waktu semua orang - dan juga membayar setengah kemenangannya dari pencurian saat ini, ambil potongan 5% pada gajinya (bos memotong jam tattletale), dan kehilangan 5% dari peluang taruhannya di bank saat ini (karena para heister lainnya kecil kemungkinannya untuk bermurah hati / adil dengan kemenangan mereka di masa depan). Setengah dari kemenangannya yang hilang akan didistribusikan kepada pelintas-ganda yang tidak terikat jika pelari-ganda berhasil, atau pelintas-non-ganda (termasuk rakyat jelata) jika pelintas-ganda gagal.

Bank

Bank dipilih menggunakan indeks numheisters + int(totalamountbet/100000), di mana angka adalah jumlah pemain yang bertaruh dengan taruhan positif di babak 1 dan totalamountbet adalah jumlah taruhan dari semua pemain tersebut. Dengan kata lain, seratus ribu kredit sama bagusnya dengan 1 heister tambahan. Berdasarkan indeks ini, salah satu bank berikut akan dipilih, bank dengan ambang tertinggi yang dipenuhi atau dilampaui indeks:

Bank             Index Threshold   Victory Prob.  Bet Odds
----             ---------------   -------------  --------
0:Municipal                    0           0.540      0.80
1:City                        20           0.488      1.10
2:State                       40           0.425      1.30
3:National                    60           0.387      1.65
4:Federal Reserve             80           0.324      1.95

Perhatikan bahwa saat turnamen berlanjut, kemungkinan mencapai level bank tertinggi akan meningkat, karena jumlah setiap pemain dapat mempertaruhkan tren ke atas. Perhatikan juga bahwa ini hanya peluang dan probabilitas awal , sebelum dimodifikasi oleh tindakan "mendapatkan intel" atau "beli penjaga". Dengan probabilitas dan peluang awal, hanya City dan National bank yang mengharapkan kemenangan melebihi kerugian yang diharapkan.

Kericuhan

  • Turnamen ini juga berisi 500 pemain lain, yang disebut "rakyat jelata", yang berpartisipasi sebagai pemain biasa dalam perampokan tetapi pada akhirnya tidak mendapat skor. Ini berfungsi untuk membuat setiap permainan berbeda dan agak kurang dapat diprediksi, dan memungkinkan untuk mencapai bank yang berisiko / lebih menguntungkan bahkan dengan hanya beberapa pemain "nyata".
  • Setiap permainan akan menyertakan beberapa himpunan bagian dari rakyat jelata untuk berpartisipasi dipilih secara seragam secara acak di semua bagian dari rakyat jelata.
  • Semua rakyat jelata menggunakan strategi berikut:
    • Secara acak memilih untuk bertaruh dengan probabilitas sama dengan probabilitas berhasil di bank yang akan dipilih berdasarkan keputusan para pemain yang telah membuat keputusan pada putaran ini .
    • Jika bertaruh dalam jumlah yang tidak nol, pilih yang terbesar dari jumlah berikut yang tidak akan melebihi kepemilikannya saat ini: 69, 420, 6969, 80085.
    • Di babak kedua, "mundur" dengan probabilitas sama dengan 5% ditambah 50% dari proporsi petaruh yang sudah mundur, jika tidak pencurian seperti biasa. (Perhatikan bahwa ini berarti pemain awal di babak kedua yang mundur dapat memiliki efek cascading besar di antara rakyat jelata - perhatikan dan bersiaplah untuk pencurian runtuh sebelum bahkan dimulai.)

Masukan dan keluaran

Dalam kedua putaran, program akan diberikan informasi berikut, dalam urutan yang tepat ini, sebagai argumen baris perintah . Kecuali dinyatakan sebaliknya, semua nilai adalah bilangan bulat yang tidak mengandung desimal.

  1. Nomor gim saat ini (diindeks nol)
  2. Jumlah putaran dari game saat ini (1 atau 2)
  3. Jumlah pemain dalam game saat ini (termasuk rakyat jelata).
  4. Jumlah pemain yang telah bergantian putaran ini.
  5. Jumlah penyembuh yang telah melakukan taruhan positif sejauh ini. (Di babak kedua, ini benar-benar akan menjadi jumlah total heisters yang membeli di babak pertama.)
  6. Jumlah total kredit yang diinvestasikan sejauh ini. (Di babak kedua, ini sebenarnya akan menjadi jumlah total kredit yang diinvestasikan di babak pertama - khususnya, itu tidak termasuk lebih dari taruhan awal "semua dalam" heisters dan tidak termasuk taruhannya "mundur" heisters.)
  7. Jumlah penyembuh yang telah dikonfirmasi di babak kedua (yaitu tidak "mundur"). Ini akan menjadi nol selama putaran pertama.
  8. Jumlah (nol-indeks) dari bank yang akan dicuri (selama putaran pertama, bank yang akan dicuri jika tidak ada orang lain bertaruh)
  9. Jumlah kredit saat ini tersedia untuk pemain.
  10. Jumlah kredit taruhan pemain di babak pertama. (Ini selalu nol di babak pertama.)
  11. Jumlah kredit yang akan diterima pemain dalam gajinya di akhir setiap pertandingan.
  12. 1 jika pemain saat ini menerima gaji, 0 jika pemain menganggur
  13. Peringkat pemain di papan peringkat (tidak termasuk rakyat jelata) pada akhir pertandingan sebelumnya, diindeks 1. (Didefinisikan sebagai 1 + jumlah pemain dengan kredit yang lebih banyak pada waktu itu. Misalnya selama pertandingan pertama, semua pemain memiliki peringkat 1.)
  14. Jumlah rata-rata kredit yang dipegang oleh semua pemain (tidak termasuk rakyat jelata) (direpresentasikan sebagai angka desimal)
  15. Penyimpangan absolut rata-rata dalam jumlah kredit yang dimiliki oleh semua pemain (tidak termasuk rakyat jelata) (diwakili sebagai angka desimal)
  16. Jumlah maksimum kredit yang dimiliki oleh pemain mana pun (yaitu jumlah kredit yang dimiliki oleh pemain peringkat 1, tidak termasuk rakyat jelata)
  17. Jumlah kredit yang disimpan pemain di rekening bank 0
  18. Rekening bank 1
  19. Rekening bank 2
  20. Rekening bank 3
  21. Rekening bank 4
  22. Peluang kemenangan individu pemain di bank 0
  23. Probabilitas bank 1
  24. Probabilitas bank 2
  25. Probabilitas 3 Bank
  26. Probabilitas Bank 4
  27. Peluang pembayaran individu pemain pada pencurian yang sukses di bank 0
  28. Peluang bank 1
  29. Peluang bank 2
  30. Peluang bank 3
  31. Peluang bank 4

Di babak pertama permainan, program pemain harus mencetak untuk menentukan bilangan bulat antara 0 dan jumlah total kredit di akun pemain itu. Setiap jumlah taruhan lebih besar dari saldo kredit yang tersedia dianggap sebagai taruhan maksimal. Output lain (atau kondisi kesalahan) akan ditafsirkan sebagai taruhan nol.

Di babak kedua permainan, program pemain harus mencetak untuk menghentikan string seperti yang dijelaskan di bagian "Putaran Taruhan Kedua" di atas. Kondisi kesalahan di sini dianggap sebagai tindakan default: lanjutkan dengan pencurian seperti biasa.

Pengendali

Turnamen akan dijalankan menggunakan pengontrol ini . Contoh bot di sana juga. Masih diuji. Lebih banyak kode yang akan datang. Jangan ragu untuk mengirimkan perbaikan bug (di github). Akan diperbarui jika ada aturan yang berubah juga.

Untuk menjalankan satu turnamen di mesin Anda sendiri, tambahkan baris ke pesaing.txt dan kemudian gunakan:

python bankheist.py 1000

Peraturan Kontes

  • Pemain dapat mengirimkan sejumlah program pemain dalam bahasa apa pun yang tersedia secara bebas yang programnya dapat menerima argumen baris perintah.
  • Kiriman harus menyertakan instruksi yang cukup eksplisit untuk cara mengkompilasi program dan menjalankannya di PC saya, termasuk nama-nama alat yang diperlukan dan perintah yang tepat untuk dikeluarkan. Pengajuan harus menyertakan setidaknya satu perintah yang menjalankan program dan mungkin argumen baris perintah ditambahkan langsung ke sana.
  • Kiriman juga harus memiliki nama unik untuk mengidentifikasinya (yang tidak mengandung spasi).
  • Program harus berjalan dalam waktu yang cukup singkat. (Saya tidak menetapkan batas atas pada apa yang dianggap masuk akal. Sebaliknya, saya hanya akan menyarankan pencipta entri apa pun yang tampaknya memiliki waktu eksekusi yang sangat besar untuk mempercepatnya.)
  • Program mungkin tidak membaca atau menulis ke file. Mereka juga tidak dapat menggunakan metode lain untuk menyimpan informasi di antara proses. Inti dari tantangan ini adalah untuk membuat keputusan yang kompleks berdasarkan informasi yang terbatas / diringkas.
  • Setiap dan semua aturan ini dapat berubah sewaktu-waktu jika perlu. Sebuah pesan akan ditambahkan di bagian atas posting ini yang mengindikasikan perubahan tersebut.
  • Kontes ini berakhir tidak lebih dari satu minggu setelah pengguna terakhir mengirimkan kiriman untuk kiriman pertamanya . Modifikasi dari kiriman yang ada diizinkan setiap saat hingga kontes berakhir. Saya akan melakukan yang terbaik untuk menjaga tenggat waktu saat ini diperbarui dalam pesan di bagian atas posting ini.
  • Kontes ini berakhir tidak lebih dari satu minggu setelah peraturan terakhir kali diubah, jika ada. Saya akan melakukan yang terbaik untuk meninggalkan komentar untuk setiap pengguna yang terpengaruh oleh perubahan aturan.
  • Anda lebih baik bertaruh saya akan berpartisipasi dalam kontes ini sendiri. ;)
kuintopia
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Dennis
Mungkin karena saya tidak terbiasa dengan permainan berkedut atau pencurian tetapi ada banyak aturan yang sebaiknya ditunjukkan dengan contoh kecil yang dikerjakan. Saat ini tampaknya tidak terlalu mudah didekati.
Moogie
Raja Bukit? Saya belum pernah mendengar nama itu selama bertahun-tahun.
Beta Decay

Jawaban:

6

Beberapa contoh program "buruk".

Ini adalah beberapa bot yang saya tulis untuk menguji controller. Sebagian besar, mereka hanya melakukan hal minimum yang diperlukan untuk menguji satu jenis tindakan tertentu. Tergantung pada tingkat partisipasi dalam KotH ini, di mana saja dari beberapa hingga semua ini akan dimasukkan dalam turnamen final, karena banyak strategi dalam permainan akan datang dari berurusan dengan perilaku banyak bot yang berbeda.

Saya menyertakan semuanya di sini sebagian besar sebagai contoh "penggunaan".

Lurker

Tidak pernah bertaruh Jika Anda tidak mengalahkan ini, pikirkan kembali strategi Anda.

print 0

PassivePanga

Selalu bertaruh 69.

import sys


round = int(sys.argv[2])
myyattas = int(sys.argv[9])
if round == 1:
    if myyattas > 69:
        print "69"
    else:
        print "0"
else:
    print "!guncheck"

Kriteria Kaylorr

Buat taruhan Kelly jika dan hanya jika Kriteria Kelly terpenuhi. Karena ini jarang terjadi dengan melakukan beberapa "memperoleh intel" dan "membeli penjaga" terlebih dahulu, ini umumnya mendapatkan hasil yang sama dengan Lurker.

import sys
import ast
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

def get_bank(bettors,credits):
    selector = min(4,int(bettors+int(credits/100000.)/20))
    return bankprobs[selector],bankodds[selector]



if round == 1:
    if alreadyplayed < 0.37*numplayers or numbet==0:
        print 0
        #sys.stderr.write("1: %d,%d\n"%(alreadyplayed,numbet))
    else:
        ratiosofar = numbet/float(alreadyplayed)
        bettors = ratiosofar * numplayers
        ratesofar = yattasbet/float(numbet)
        credits = bettors*ratesofar
        p,b = get_bank(bettors,credits)
        f = (p*(b+1)-1)/b
        print max(int(f*myyattas),0)
        #sys.stderr.write("2: %d,%d\n"%(p,b))
else:
    if alreadyplayed < 0.37*numbet or numbet==0:
        print "!guncheck"
    else:
        p,b = get_bank(numbet,yattasbet)
        realp = p*numready/float(alreadyplayed)
        f = (realp*(b+1)-(1-240./(myyattas+240.)))/b
        print "!guncheck" if f>0 else "back out"

gunHeCK

Buat taruhan Kelly jika dan hanya jika jumlah heister terlihat sejauh ini mengindikasikan bahwa taruhan akan memenuhi kriteria Kelly (tapi jangan mundur jika salah). Biasanya tidak lebih buruk dari Lurker

import sys
import ast
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

def get_bank(bettors,credits):
    selector = min(4,int(bettors+int(credits/100000.)/20))
    return bankprobs[selector],bankodds[selector]

if round == 1:
    if alreadyplayed < 0.37*numplayers or numbet==0:
        print 0
        #sys.stderr.write("1: %d,%d\n"%(alreadyplayed,numbet))
    else:
        ratiosofar = numbet/float(alreadyplayed)
        bettors = ratiosofar * numplayers
        ratesofar = yattasbet/float(numbet)
        credits = bettors*ratesofar
        p,b = get_bank(bettors,credits)
        f = (p*(b+1)-1)/b
        print max(int(f*myyattas),0)
        #sys.stderr.write("2: %d,%d\n"%(p,b))
else:
    print "!gunHeCK"

Adiksi Moni

Go "all in" kecuali sudah menang.

import sys
import random


round = int(sys.argv[2])
myrank = int(sys.argv[13])
mybet = int(sys.argv[10])

if round == 1:
    if random.random()<0.1:
        print 1
    else:
        print 69
else:
    if myrank>1:
        print "all in"
    else:
        if mybet==1:
            print "back out"
        else:
            print "!guncheck"

HeCKuSumer

Taruhan selalu pecahan kecil konstan.

import sys

round = int(sys.argv[2])
myyattas = int(sys.argv[9])

if round==1:
    print int(0.1*myyattas)
else:
    print "!guncheck"

OC'sRandomTpyos

Berganti pekerjaan banyak di turnamen awal. Habiskan semua uang itu untuk meningkatkan probabilitas dan peluang. Kemudian habiskan beberapa game terakhir untuk semua. Ini mungkin akan melakukan jauh lebih baik tanpa pergi semua kecuali sudah di posisi teratas.

import sys
import ast
import random

game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round == 1:
    if game<800 or myrank>3:
        print 1
    else:
        print myyattas/4
else:
    if game<800:
        if hired:
            print "change jobs"
        else:
            print random.choice(["acquire intel","buy guard"])
    else:
        if myrank>3:
            print "all in"
        else:
            print "!guncheck"

HardHatUmar

Ubah pekerjaan jika memungkinkan untuk sebagian besar turnamen. Hindari bertaruh lebih dari minimum yang diperlukan. Sangat bagus, tapi tidak bagus.

import sys

game = int(sys.argv[1])
round = int(sys.argv[2])
hired = int(sys.argv[12])

if round==1:
    if game < 900 and hired:
        print 1
    else:
        print 0
else:
    print "change jobs"

LimeadeSneaktar

Ganti pekerjaan jika memungkinkan selama bagian pertama turnamen. Habiskan setiap permainan crossing ganda. Apakah sopan bahkan melawan SnitcherKing. Mungkin akan ongkos lebih buruk setelah banyak bot lain bersilangan dan meraba. Jika tidak - aturan mungkin perlu diubah.

import sys
import ast

game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])
bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round==1:
    print 1
else:
    if hired and game<900:
        print "change jobs"
    else:
        print "double cross"

SnitcherKing

Selalu bertaruh minimum, dan selalu jari. Cukup bagus di turnamen kecil yang menyertakan LimeadeSneaktar.

import sys

round = int(sys.argv[2])

if round == 1:
    print 1
else:
    print "finger"

RaysFive01K

Sedikit lebih rumit - dan karena itu sebenarnya cukup bagus. Sebagian besar keuntungannya berasal dari mendepositkan semua kemenangan di turnamen awal (melindungi mereka dari crosser ganda) sambil meningkatkan probabilitas kemenangannya (dan mengubah pekerjaan untuk membayar semua penjaga dan perampok itu), kemudian menarik semuanya pada akhir pertandingan ( begitu mereka mendapatkan bunga yang serius dan kemungkinan gagal untuk menarik cukup rendah - meskipun di sini kerugian untuk pelintas ganda adalah risiko yang serius). Ini pasti akan ada di turnamen, dan mungkin atau mungkin bukan pesaing serius.

import sys
import ast
import random
game,round,numplayers,alreadyplayed,numbet,yattasbet,numready,bankid,myyattas,mybet,mypayment,hired,myrank,mu_yattas,sigma_yattas,max_yattas = map(ast.literal_eval,sys.argv[1:17])

bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round ==1:
    if game < 900:
        print myyattas/10
    else:
        print 1
else:
    if game < 500 and hired:
        print random.choice(["change jobs","finger","buy guard"])
    elif game < 900:
        print "deposit"
    elif bankholdings[bankid]>0:
        print "withdraw"
    else:
        if alreadyplayed/float(numplayers)<0.5:
            print "finger"
        else:
            print "back out"
kuintopia
sumber
Saya menyetujui nama-nama ini <masukkan Twitch & Panga meme>
CAD97
2

Lone John

import sys
import ast

game,round,numplayers,alreadyplayed,numbet,creditsbet,numready,bankid,mycredits,mybet,mypayment,hired,myrank,mu_credits,sigma_credits,max_credits = map(ast.literal_eval,sys.argv[1:17])

bankholdings = map(int,sys.argv[17:22])
bankprobs = map(float,sys.argv[22:27])
bankodds = map(float,sys.argv[27:32])

if round == 1:
    if mycredits > 100 or hired:
        print(int(mycredits)/2)
    else:
        print(0)
else:
    if bankprobs[int(bankid)] > 0.6:
        print("all in")
    elif int(mypayment) > 50 :
        print("buy guard")
    elif int(mycredits) > 200 and int(game) < 900 and hired == "1":
        print("change jobs")
    elif bankprobs[int(bankid)] * (float(numready)+1)/(float(alreadyplayed)+1) < 0.30:
        print "withdraw"
    else:
        print "!guncheck"

Suap menjaga sampai dia memiliki kemungkinan untuk menang, lalu masuk semuanya. Sendiri.

Berganti pekerjaan ketika dia membutuhkan lebih banyak uang untuk menyuap penjaga.

MegaTom
sumber
apa nama pemain ini?
kuintopia
@quintopia ops! Saya lupa saya bisa mempostingnya! Nama dan eksplorasi ditambahkan.
MegaTom
Bagus. Sama seperti tip, Anda tidak perlu melakukan semua typecast itu. Semuanya sudah jenis yang tepat dari yang benar langsung dari kelelawar. Yang berarti bahwa kondisinya hired == "1"akan selalu salah dan tidak akan pernah berganti pekerjaan.
kuintopia
Saya hanya menjalankannya dalam satu ronde melawan semua yang saya buat. Datang di tempat terakhir. Nasib buruk :(
kuintopia