Mafia (juga dikenal sebagai Werewolf) adalah gim pesta yang bermain kira-kira seperti ini:
- Permainan dimulai pada hari ke 0. Setelah setiap hari
n
datang malamn
. Setelah setiap malamn
datang seharin+1
. yaituD0, N0, D1, N1, D2, N2
... - Pada dini hari 0, tuan rumah diam-diam memilih pemain untuk mengisi peran tertentu:
- Sejumlah pemain menjadi mafia. Setiap malam, setiap mafioso memilih pemain. Pada subuh keesokan harinya, pemain yang dipilih oleh sebagian besar mafiosos terbunuh. Mereka secara permanen dihapus dari permainan dan peran mereka diungkapkan kepada publik. Selaras mafia.
- Beberapa pemain menjadi polisi. Setiap malam, setiap polisi memilih pemain. Pada subuh keesokan harinya, polisi menjadi sadar akan keselarasan para pemain itu. Village-aligned.
- Sejumlah pemain menjadi dokter. Setiap malam, setiap dokter memilih pemain. Jika pemain ini adalah pemain yang sama dengan yang dipilih mafia untuk dibunuh, tindakan mafia untuk malam itu dibatalkan. Village-aligned.
- Semua pemain yang tidak dipilih untuk peran lain adalah penduduk desa. Penduduk desa tidak memiliki kemampuan yang tidak dimiliki oleh seluruh kota. Village-aligned.
- Setiap hari kecuali hari 0, seluruh kota (yaitu, semua pemain yang hidup) memberikan suara untuk seorang pemain. Pada akhirnya, pemain itu dikeluarkan dari permainan dan peran mereka diungkapkan. (Pada hari 0, semua orang hanya kedinginan sampai malam hari.)
- Jika, pada titik mana pun, tidak ada mafiosos yang tersisa, permainan berakhir dengan semua pemain yang selaras dengan desa menang (termasuk yang mati).
- Jika, pada titik mana saja, pemain yang selaras dengan desa tidak melebihi jumlah pemain yang selaras mafia, permainan berakhir dengan semua pemain yang selaras mafia menang (termasuk yang mati).
Untuk tantangan ini, tujuan Anda adalah menulis bot untuk mengalahkan bot lain di Mafia!
Cara membuat bot yang berfungsi
Yang harus Anda berikan untuk saya adalah file bernama run
. Di dalam struktur direktori tempat tantangan ini terjadi, bot Anda akan tinggal di sini:
start
controller/
tmp/
players/ # You are here!
some_bot/ # Let's pretend you're some_bot.
to_server
from_server
players
run # This is what you give me
mafia-game-bot/
skynet/
The run
berkas, ketika dijalankan, akan membuat bot Anda melakukan hal tersebut. Penting untuk dicatat bahwa file ini tidak boleh memerlukan argumen baris perintah atau apa pun. Ini akan dijalankan persis seperti ./run
. Jika Anda perlu dieksekusi dengan cara yang berbeda, Anda harus mengatasinya dengan melakukan sesuatu seperti ini:
real_bot.py
#!/bin/python2
# code goes here
run
#!/bin/bash
./real_bot.py --flags --or --whatever
Satu hal penting yang perlu diperhatikan adalah bahwa semua input yang diterima bot Anda akan ditemukan dalam file from_server
dan program kontrol akan mencari output bot Anda to_server
. Saya memilih untuk melakukannya dengan cara ini sehingga bahasa apa pun yang dapat melakukan file I / O dapat berpartisipasi. Jika bahasa Anda membuatnya lebih mudah untuk bekerja dengan stdin dan stdout daripada file I / O, Anda mungkin ingin menulis run
file yang terlihat seperti ini:
#!/bin/bash
./real_bot.py < from_server > to_server
Ini akan membuatnya sehingga stdin berasal dari from_server
file dan stdout langsung menuju to_server
.
Bot Anda tidak akan tetap berjalan selama permainan. Sebaliknya, itu akan dijalankan ketika perlu membuat keputusan. Demikian juga, itu tidak akan diinformasikan ketika sudah mati, itu tidak akan berjalan lagi. Rencanakan ini dengan menyimpan apa pun yang ingin Anda ingat ke file dan membacanya nanti. Anda dapat membuat, menulis atau membaca dari file apa pun di folder bot Anda, tetapi Anda tidak boleh menulis atau membaca di mana pun di luar folder itu, termasuk akses jaringan atau apa pun . Jika bot Anda mengetahui sesuatu yang tidak diceritakan dari dalam folder, atau jika menyentuh apa pun yang tidak ada di dalam folder itu, bot Anda didiskualifikasi.
Cara membuat bot fungsional
Hari
Di awal permainan, file players
akan diisi dengan daftar semua pemain dalam game yang dibatasi-baris baru. Itu tidak akan diperbarui karena pemain meninggalkan permainan.
Pada dini hari 0, semua pemain akan menemukan pesan ini di from_server
file mereka :
Rise and shine! Today is day 0.
No voting will occur today.
Be warned: Tonight the mafia will strike.
Jika Anda adalah polisi, garis You are the cop
ditambahkan ke akhir. Dokter melihat You are the doctor
. Mafia melihat You are a member of the mafia.\nYour allies are:
dan daftar anggota mafia yang dibatasi baris baru, tidak termasuk pemain yang membaca pesan.
Di awal hari-hari lainnya, pesan ini akan muncul:
Dawn of day `day_number`.
Last night, `victim` was killed. They were `victim_role`.
Investigations showed that `cop_target` is `target_alignment`-aligned.
These players are still alive: `remaining_players`
dayNumber
diganti dengan jumlah hari. victim
diganti dengan nama korban tadi malam, dan victim_role
merupakan salah satu dari:
a villager
a mafioso
the cop
the doctor
cop_target
adalah nama pemain yang diselidiki polisi tadi malam, dan target_alignment
entah itu village
atau mafia
. Akhirnya, remaining_players
adalah daftar pemain yang masih hidup dalam format ini:player1, player2, player3
Baris kedua dihilangkan jika tidak ada pembunuhan tadi malam, dan baris ketiga hanya ditampilkan kepada polisi.
Sebagai contoh,
Dawn of day 42.
Last night, Xyzzy was killed. They were a villager.
Investigations showed that Randy is mafia-aligned.
These players are still alive: Randy, CopBot, JohnDoe, Steve
Setelah pesan ini keluar dari jalan, hari dimulai! Setiap bot dapat melakukan 50 aksi sepanjang hari, di mana "aksi" memberikan suara untuk pemain atau mengatakan sesuatu dengan keras.
Untuk memilih pemain, tulis vote player_name
ke to_server
file Anda dan akhiri. Untuk memilih untuk tidak membunuh siapa pun, tulis vote no one
. Saat Anda memilih, semua pemain (termasuk Anda) akan melihat your_bot votes to kill your_selection
. Suara diabaikan pada hari ke 0.
Sejumlah pesan yang telah ditentukan dapat dikirim ke semua pemain. Id dari setiap pesan yang mungkin tercantum di sini:
0: No
1: Yes
2: I am the cop
3: I am the doctor
4: I am a normal villager
5: I trust this player:
6: I think this player is suspicious:
7: I think this player is the cop:
8: I think this player is the doctor:
9: I think this player is a normal villager:
10: I think this player is mafia:
11: Do you think this player is mafia?
12: I tried to save this player:
13: I successfully saved this player:
14: I investigated this player and found that they were mafia-aligned:
15: I investigated this player and found that they were village-aligned:
16: Will you please use your power on this player tonight?
Semua pesan ini kecuali lima yang pertama mengacu pada pemain tertentu. Untuk mengatakan salah satu pesan itu, tulis say message_id player_name
. Untuk salah satu dari lima pesan pertama, cukup tulis say message_id
. Anda dapat menambahkan argumen ketiga opsional untuk keduanya, menentukan nama pemain yang Anda ajak bicara (semua pemain masih bisa membacanya, tetapi mereka akan tahu siapa penerima yang dimaksud).
Ketika bot Anda mengatakan pesan, semua pemain membaca your_bot says "message"
, di mana message
pesan itu terkait dengan id yang Anda tulis. Jika pesan menyertakan subjek, satu karakter spasi dan subjek dimasukkan langsung setelah akhir pesan. Jika itu termasuk penerima, nama mereka, satu titik dua dan satu karakter spasi dimasukkan segera sebelum pesan.
Pada akhirnya, semua pemain yang hidup dijalankan untuk terakhir kalinya untuk melihat hasil pemungutan suara. Jika seorang pemain dipilih, ini ditulis:
The town has killed player_name!
They were a villager
... atau a mafioso
, atau the cop
, atau the doctor
.
Jika tidak ada pemain yang dipilih, ini ditulis sebagai gantinya:
The town opted to lynch no one today.
Ketika controller mengirim pesan-pesan ini, ia mengabaikan respons dari pemain. Hari sudah berakhir.
Malam
Pada malam hari, semua orang kecuali penduduk desa bisa menggunakan kekuatan mereka.
Mafia:
Anda akan membaca It is night. Vote for a victim.
. Ketika ini terjadi, keluarkan nama pemain yang ingin Anda bunuh.
Polisi:
Anda akan membaca It is night. Who would you like to investigate?
. Ketika ini terjadi, keluarkan nama pemain yang ingin Anda periksa.
Dokter:
Anda akan membaca It is night. Who would you like to save?
. Ketika ini terjadi, keluarkan nama pemain yang ingin Anda lindungi.
Setelah ini, hari berikutnya dimulai seperti biasa.
Anda dapat menyelamatkan diri hanya sekali per game.
Informasi Umum
- Game tidak akan berjalan tanpa 6 pemain atau lebih.
- Sepertiga pemain, dibulatkan ke bawah, akan menjadi mafia. Satu pemain akan menjadi dokter, dan satu pemain akan menjadi polisi. Semua pemain lain adalah penduduk desa.
- Ikatan dalam pemungutan suara desa atau mafia semalam diselesaikan secara acak.
- Nama bot harus + tanda hubung alfanumerik dan garis bawah.
- Dilarang menggunakan pengetahuan kode lawan secara langsung. Secara teori, saya harus bisa menempatkan bot Anda melawan bot yang belum pernah Anda lihat sebelumnya dan membuatnya tampil sebanding.
- Sayangnya, jika saya tidak bisa menjalankan program Anda menggunakan perangkat lunak bebas (seperti bir), saya harus membatalkannya.
- Saya berhak untuk mendiskualifikasi pengajuan jika saya yakin itu berbahaya. Ini termasuk, tetapi tidak terbatas pada penggunaan waktu, memori, atau ruang untuk menjalankan yang berlebihan. Saya sengaja membiarkan batasnya lunak, tetapi ingat: Saya menjalankan ini di komputer rumah saya, bukan komputer super, dan saya tidak ingin mendapatkan hasil yang membutuhkan waktu satu tahun. Saya tidak berharap harus menggunakan ini, karena standar saya cukup rendah. Ini pada dasarnya "jika saya pikir Anda sengaja menjadi penipu", dan jika Anda bisa meyakinkan saya kalau tidak saya akan membalikkan keputusan saya.
Mencetak gol
Setiap putaran, 100 permainan akan dijalankan (ini dapat meningkat karena lebih banyak bot bergabung untuk menjaga ukuran sampel cukup besar, tetapi secara teori itu tidak akan mempengaruhi apa pun). Saya akan mencatat berapa kali setiap bot menang sebagai penduduk desa dibandingkan dengan berapa kali bot bermain sebagai penduduk desa, dan sama untuk mafia. Bot villager_ratio
adalah number of games won as villager / number of games played as villager
, dan mafia_ratio
sama tetapi s/villager/mafia/g
. Skor bot adalah (villager_ratio - mean villager_ratio) + (mafia_ratio - mean mafia_ratio)
.
Contoh bot
Randy the Robot bukanlah pemain mafia yang baik. Randy mengabaikan hampir semua hal, secara acak memilih apa yang akan dikatakan, siapa yang harus dipilih, dan siapa yang harus ditargetkan dengan kekuatan malam.
run.sh
:
#!/bin/bash
./randy.py < from_server > to_server
randy.py
:
#!/usr/bin/env python
import random
with open('players') as f:
p = f.read().split() + ['no one']
day = True
try:
line = raw_input()
if line.endswith(('?', 'victim.')):
day = False
if not day:
print random.choice(p)
else:
if random.random() > 0.5:
if random.random() > 0.5:
print 'vote {}'.format(random.choice(p))
else:
id = random.randint(0, 17)
print 'say {}{}'.format(id, (' ' + random.choice(p)) if id > 4 else '')
except: pass
Pengendali
@undergroundmonorail menulis program kontrol untuk tantangan ini, tersedia di sini .
Anda memiliki satu bulan untuk kode dan menyerahkan jawaban, saya akan memberikan bot yang menang (pemecah dasi tingkat menang tertinggi adalah suara) setidaknya 50 reputasi hadiah (tergantung pada berapa banyak rep yang bisa saya dapatkan dalam sebulan)
Berikut ini skrip wrapper, dibuat oleh @Blacksilver, untuk digunakan dengan bahasa yang dikompilasi:
#!/bin/bash
run="./a.out"
compile="gcc bot.c"
if [ -e $run ]; then
$run
else
$compile
$run
fi
Menempatkan ini dalam run
.
Posting ini ditulis oleh @undergroundmonorail (saya membuat beberapa suntingan).
Dia memberikannya di sini kepada siapa saja yang ingin menyelesaikan dan mempostingnya.
sumber
Jawaban:
Zulu
run
Tidak semua yang saya harapkan akan terjadi. Saya mungkin akhirnya mengubah-ubahnya sesekali.
Cara kerjanya v1.0
Catat nomor hari, siapa yang masih hidup, siapa yang mati, siapa mafia, siapa yang sejajar desa, peran, suara / pesan hari ini, dan suara / pesan keseluruhan.
Malam
Sebuah. Mafia - Pilih warga desa yang memilih mafia (secara acak) jika memungkinkan, jika tidak, warga desa acak.
b. Cop - Selidiki siapa pun yang memiliki garis yang tidak diketahui.
c. Dokter - Selamatkan diri, belok pertama, kemudian selamatkan polisi jika diketahui (saya rasa ini tidak akan pernah bisa diketahui sampai sekarang), selamatkan penduduk desa jika diketahui (mungkin juga tidak tahu ini), jika tidak selamatkan orang secara acak.
Hari
Sebuah. Jika ada yang mengucapkan pesan secara langsung kepada diri sendiri, balaslah (kemungkinan tanggapan terbatas).
b. Mafia - Voting untuk penduduk desa yang memiliki suara terbanyak.
c. Penduduk desa dengan mafia hidup yang selaras - dikenal memilih mafioso.
d. Penduduk desa yang hanya diketahui mati selaras dengan Mafia - memilih bot acak yang tidak pernah memilih mafioso.
e. Penduduk desa dengan Cop diketahui - memberikan suara untuk bot acak yang dipilih oleh polisi.
f. Penduduk desa dengan desa yang diketahui sejajar - pilih bot acak yang memilih mati.
g. Penduduk desa dengan suara menentang pemilihan sendiri untuk bot non-desa terpilih tertinggi saat ini.
sumber
Kode contoh tidak berfungsi untuk saya, saya menggunakan Python 3, jadi saya mengubah
main.py
file untuk membuatnya berfungsi.Jadi di sini adalah versi tetap saya untuk Python 3, saya tidak pernah diprogram dalam Python sebelumnya jadi mungkin itu adalah kode yang mengerikan tetapi berfungsi :)
run.sh
:randy.py
:Beberapa hal yang saya pelajari ketika saya membuat karya ini (dan itu tidak jelas bagi saya dalam uraian)
print
tidak melakukan apa pun dengan permainan itu seperticonsole.log
di jsinput()
memblokir program yang sedang berjalan itu bisa baik untuk langkah demi langkah debuggingfrom_server
danto_server
dibersihkan setiap putaran.Ctrl+C
kombinasi, yang menjengkelkan.sumber
run.sh
.< from_server > to_server
perlu karena saya nama file kode sulit dalam kode. mesin game hanya memanggil./run
tanpa pipa. begituinput()
danprint()
tidak bekerja dengan game.mayn.py
baris 57:os.system('./run')
randy.py
ditulis dalam Python 2 , yang menyebabkan masalah../start
dari folder asli atau Anda memerlukan versi python 3main.py
Ahli Logika
Fancy, banyak sekali kode python yang tidak akan saya jelaskan (walaupun bukan golf), selain itu ia menyimpan daftar "teman" dan "musuh" yang awalnya dihuni berdasarkan kesempatan dan / atau penyelidikan polisi . Peringatan: jangan berbaring di hadapan ahli logika.
sumber
run.sh
standar Anda (melakukan beberapa pengujian)Survivalist (v 1.0)
Ringkasan
Survivalist hanya secara brutal selamat dari permainan dengan memarahi siapa pun yang berani menuduhnya, terlepas dari apakah dia mafia atau tidak.
Logika
Jika Anda bertahan hingga akhir pertandingan, Anda menang bagaimanapun caranya. Karena itu, Anda tetap bertahan dengan segala cara.
Cerita belakang
Pasukan berbaris melalui hutan yang gelap dan lembab.
"Letnan, di mana kita berbaris?" Rekrut muda itu rupanya tidak mengeraskan dirinya pada kekejaman, pikir komandan itu. Baiklah. Dia menjawab dengan kasar "untuk menghancurkan musuh".
Di desa, komandan musuh sedang minum-minum dan tertawa bersama dengan perwira lain di klub ketika seorang pengintai mengikuti berita. "Ada satu kolom, beberapa ratus meter panjangnya, berbaris di sepanjang hutan Yulin untuk kita! Rally pasukannya!"
Komandan musuh, jelas mabuk, berkata tiba-tiba, "Saya tidak punya laporan dari pengintai lain." Si pramuka (kemudian Survivalist) berpikir, maka aku harus mengumpulkan pasukan sendiri . Setelah menceritakan kisah itu kepada sesama pengintai, mereka kembali bersama, semua mengatakan bahwa mereka telah melihat pasukan musuh. Komandan masih tidak percaya, mengatakan, "Saya memerintahkan Anda untuk menghentikan kepramukaan. Tidak ada pasukan musuh".
Para pengintai memutuskan untuk mengambil senjata mereka untuk menyelamatkan komunitas. Mereka berhasil mencapai posisi mereka tepat ketika musuh tiba di desa dengan paksa. "BIAYA!" teriak komandan penyergapan. "BURN RUMAH! BURN RUMAH! BUNUH SEMUA ORANG, TERMASUK WANITA DAN ANAK-ANAK! "
Para pengintai menyelamatkan seluruh pasukan mereka. Mereka mengharapkan promosi, penghargaan, dan medali. Sebagai gantinya, mereka mendapat pengadilan militer yang dicurangi karena pemberontakan, hukuman, 10 tahun penjara, pemecatan tidak terhormat dari militer dan pengasingan.
Ada seorang penatua tua di dewan kota Salem, Massachusetts. Legenda mengatakan bahwa ia mendirikan kota. Ketika Anda bertemu dengannya di pondok terpencil di hutan, jangan biarkan binar di matanya membuat Anda berpikir dia damai. Jika Anda menuduhnya, dia akan menghancurkan Anda di depan kota.
Veteran
Kode (Saya pemula dengan python, tidak yakin apakah kodenya bagus)
sumber
or
alih-alih||
? Apakah Anda mengujinya? Juga, Anda mungkin harus menunjukkan bahwa itu adalah Python 2.Avatar
Avatar "secara acak" memilih satu pemain di awal dan tanpa henti memfokuskan mereka untuk sisa putaran.
Ini bukan referensi ke acara TV animasi yang bernama serupa.
Unduh tar semua file yang diperlukan
Changelog
stdout
, hanya untukstderr
.Untuk menekan
stderr
juga, tambahkan2>/dev/null
ke akhirrun
file.Ini membutuhkan
mafia.c
danmafia.h
, perpustakaan yang saya tulis, di direktori yang sama.Ini termasuk dalam unduhan, bersama dengan Makefile dan skrip run.
MELAKUKAN
Sementara saya di sini, saya akan mengirimkan non-bot, Steve:
sumber
avatar
,erebus
,leviathan
, danragnarok
from_server
File bot saya tidak sedang ditulis. Apakah Anda harus menetapkan izin khusus atau sesuatu?Raksasa
Leviathan mengulangi semua pemain dalam
players
file dan menargetkan mereka satu per satu.Unduh
Seperti halnya Avatar, itu membutuhkan
mafia.c
danmafia.h
di direktori yang sama.Ini termasuk dalam unduhan, bersama dengan Makefile dan skrip run.
sumber