KOTH: Pandemi di seluruh dunia


82

Hasil akhirnya ada di sini!

pengantar

Pada tahun 2042, dunia telah menjadi kelebihan penduduk. Globalisasi, kepadatan penduduk, gaya hidup baru dan kurangnya kebersihan global telah menyebabkan penyebaran pandemi baru. Selama masa-masa sulit itu, para pemimpin negara harus mengelola situasi. Anda tidak bisa membiarkan populasi Anda dihancurkan, tetapi mungkin Anda bisa mendapat manfaat dengan membiarkan tetangga Anda mati ...

Glosarium

Sehat : Orang yang tidak terinfeksi
Terinfeksi : Orang yang dapat meninggal akibat pandemi.
Mati : Jumlah tubuh, tidak ada efek khusus (hanya skor)
Tingkat Infeksi : Jumlah Sehat yang akan Terinfeksi setiap belokan
Tingkat Penularan : Persentase Terinfeksi yang akan mengubah Sehat menjadi Terinfeksi setiap belokan
Tingkat Lethality : Persentase Terinfeksi yang akan mati setiap belokan
Tingkat Migrasi : Persentase Sehat dan Terinfeksi yang akan beremigrasi / berimigrasi setiap belokan
Lokal: Hanya memengaruhi negara Anda
Global : Mempengaruhi setiap negara bagian

Prinsip

Masing-masing pemain akan mengelola satu kota, dimulai dengan 100 orang . Sayangnya, di antara mereka ada satu yang terinfeksi .

Permainan ini berbasis giliran. Giliran terdiri dari tujuh fase , yang terakhir bersifat interaktif (meminta bot untuk perintah). Urutan pemain secara acak setiap belokan. Fase berikutnya dimulai ketika fase sebelumnya telah dieksekusi oleh setiap kota (Turn 1: Player 1, Player 2, Player 3 ...; Turn 2: Player 3, Player 2, Player 1 ...):

1. Mutation                                 - AUTOMATED
2. Reproduction                             - AUTOMATED
3. Migration                                - AUTOMATED
4. Infection                                - AUTOMATED
5. Contagion                                - AUTOMATED
6. Extinction                               - AUTOMATED
7. Players Turn                             - INTERACTIVE

Kontroler memberi Anda input melalui argumen perintah, dan program Anda harus melakukan output melalui stdout.

Sintaksis

Memasukkan

Setiap kali program Anda dipanggil, ia akan menerima argumen dalam format ini:

Round;YourPlayerId;PlayerId_Healthy_Infected_Dead_InfectionRate_ContagionRate_LethalityRate_MigrationRate;PlayerId_Healthy_Infected_Dead_InfectionRate_ContagionRate_LethalityRate_MigrationRate;...

Babak 1-diindeks.

Contoh input

6;2;1_106_23_9_2_4_13_5;0_20_53_62_16_20_35_5;2_20_53_62_16_20_35_5

Di sini, Anda melihat itu adalah putaran ke-6 dan Anda adalah pemain 2. Anda memiliki 20 yang sehat, 53 terinfeksi, 62 mati, tingkat infeksi 16%, tingkat penularan 20%, tingkat kematian 35%, dan tingkat migrasi 5%.

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.

N: Apakah N othing
M: Penelitian M icrobiology [Efek: Mengurangi lokal Tingkat Infeksi oleh 4%]
E: Penelitian E pidemiology [Efek: Mengurangi lokal Contagion Tingkat sebesar 8%]
I: Penelitian Saya mmunology [Efek: Mengurangi lokal Lethality Tingkat 4%]
V: penelitian V accination [Efek: mengurangi lokal Tingkat Infeksi oleh salah satu, mengurangi lokal Contagion Tingkat sebesar 4%, mengurangi lokal Lethality Tingkat 2%]
C: Berikan C ure [Efek: Mengkonversi 10 lokal Terinfeksi untuk Sehat ]
Q: Q uarantine [Efek: Hapus 30 lokal Terinfeksi ]
O: O pen Borders [Efek: Meningkatkan lokal Tingkat Migrasi sebesar 10%]
B: Tutup B pesanan [Efek: Menurunkan lokal Tingkat Migrasi sebesar 10%]
T: Bio T errorism [Efek: Mengkonversi 4 global Healthy to Infected ]
W: W eaponization [Efek: Meningkatkan Tingkat Infeksi global hingga 1, meningkatkan Tingkat Kesetaraan global sebesar 2%]
D: Penerbitan D [Efek: Meningkatkan Tingkat Infeksi globalsebesar 1, meningkatkan Tingkat Penularan global sebesar 2%]
P: P enifikasi [Efek: Mengurangi Tingkat Infeksi global sebesar 1, menurunkan Tingkat Penularan global sebesar 1%, menurunkan Tingkat Kesetaraan global sebesar 1%]

Gameplay

Semua fase

Perintah tidak valid = Tidak Ada
Persentase ditambahkan seperti bilangan bulat, yaitu 10% - 4% = 6%. Ketika persentase diterapkan dalam formula, hasilnya adalah lantai.

Fase 1: Mutasi

Pandemi menjadi lebih kuat. Setiap belokan, ia secara acak mendapatkan salah satu dari atribut ini (mutasi ini memengaruhi semua pemain sekaligus):

  • Tingkatkan Tingkat Infeksi global sebesar 2
  • Tingkatkan Tingkat Penularan global sebesar 5%
  • Meningkatkan Tingkat Lethality global sebesar 5%

Fase 2: Reproduksi

Setiap lima putaran (putaran 5, 10, 15 ...), warga baru akan lahir. Setiap pasangan Sehat akan membuat satu Sehat (23 Sehat menghasilkan 11 Sehat baru ). Setiap pasangan terinfeksi akan membuat satu terinfeksi .

Fase 3: Migrasi

Setiap belokan, persentase Sehat dan Terinfeksi akan meninggalkan status, tergantung pada Tingkat Migrasi mereka (10 Sehat akan meninggalkan negara dengan 100 Tingkat Migrasi Sehat dan 10% ). Kemudian, para migran akan didistribusikan di setiap negara bagian, sekali lagi tergantung pada Tingkat Migrasi . (Tarif masing-masing negara bagian tertimbang dan migran kemudian didistribusikan sesuai dengan itu).

Fase 4: Infeksi

Sehat setiap negara dikonversi menjadi Terinfeksi , sesuai dengan Tingkat Infeksi .

Fase 5: Penularan

Sehat setiap negara dikonversi menjadi Terinfeksi , sesuai dengan Tingkat Penularan . Angka tersebut dihitung dengan mengalikan Infeksi dengan Tingkat Penularan .

Fase 6: Kepunahan

Terinfeksi dikonversi menjadi Mati , menurut Lethality Rate . Jumlahnya dihitung dengan mengalikan Infected oleh Lethality Rate .

Fase 7: Giliran pemain

Setiap pemain menerima input dan harus mengeluarkan tiga tindakan, yang dieksekusi sesuai urutannya.

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 satu detik untuk merespons (per kota).
  • Berikan perintah untuk mengkompilasi dan menjalankan kiriman Anda.

Kemenangan

Pemenang adalah yang paling sehat setelah 50 putaran. Jika seorang pemain adalah yang terakhir hidup (lebih dari 0 Sehat atau Terinfeksi ) permainan berhenti dan dia menang. Jika beberapa pemain memiliki jumlah Sehat yang sama , pemain dengan Infeksi terbanyak akan menang, maka pemain dengan Dead s lebih sedikit .

Pengendali

Anda dapat menemukan pengontrol di GitHub . Ini juga mengandung tiga samplebot, ditulis dalam Java.
Untuk membuatnya berjalan, periksa proyek dan buka di Java IDE Anda. Titik masuk dalam mainmetode 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 playerspaket (Anda dapat mengambil contoh pada bot yang sudah ada). Kelas ini harus menerapkan Playeruntuk 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";. Akhirnya, tambahkan bot dalam playersarray di bagian atas Gamekelas.

Hasil Akhir (2016-03-04 08:22 GMT)

Global (100 reputasi):

100 hasil pertandingan: http://pasted.co/942200ff

1. EvilBot (24, 249, 436)
2. Triage (23, 538, 486)
3. WICKED (23, 537, 489)
4. Israel (23, 40, 240)
5. InfectedTown (22, 736, 482)
6. ZombieState (22, 229, 369)
7. Mooch (22, 87, 206)
8. InfectedHaven (21, 723, 483)
9. Crossroads (16, 9, 136)
10. TheKeeper (3, 4, 138)
11. Terrorist (0, 595, 496)
12. InfectionBot (0, 511, 430)
13. FamilyValues (0, 6, 291)
14. UndecidedBot (0, 0, 20)
15. XenoBot (0, 0, 26)
16. Researcher (0, 0, 33)
17. Strategist (0, 0, 42)
18. TheCure (0, 0, 55)
19. Socialist (0, 0, 67)
20. TrumpBot (0, 0, 77)
21. CullBot (0, 0, 81)
22. BackStabber (0, 0, 87)
23. BlunderBot (0, 0, 104)
24. RemoveInfected (0, 0, 111)
25. PFC (0, 0, 117)
26. BioterroristBot (0, 0, 118)
27. PassiveBot (0, 0, 118)
28. Smaug (0, 0, 118)
29. WeaponOfMassDissemination (0, 0, 119)
30. AllOrNothing (0, 0, 121)
31. Obamacare (0, 0, 122)
32. DisseminationBot (0, 0, 123)
33. CureThenQuarantine (0, 0, 125)
34. Madagascar (0, 0, 129)
35. OpenAndClose (0, 0, 129)
36. ThePacifist (0, 0, 130)
37. MedicBot (0, 0, 131)
38. Medic (0, 0, 133)
39. Salt (0, 0, 134)
40. Piecemeal (0, 0, 136)
41. Graymalkin (0, 0, 137)
42. PureBot (0, 0, 140)
43. MadScienceBot (0, 0, 144)
44. BipolarBot (0, 0, 149)
45. RedCross (0, 0, 151)

Kiamat-kurang (200 reputasi):

100 hasil pertandingan: http://pasted.co/220b575b

1. FamilyValues (5708, 14, 2)
2. BlunderBot (5614, 12, 3)
3. Graymalkin (5597, 17, 4)
4. PureBot (5550, 12, 5)
5. Crossroads (5543, 11, 4)
6. Salt (5488, 24, 7)
7. CureThenQuarantine (5453, 13, 7)
8. Piecemeal (5358, 121, 23)
9. TrumpBot (5355, 12, 5)
10. CullBot (5288, 12, 9)
11. AllOrNothing (5284, 13, 10)
12. Madagascar (5060, 180, 35)
13. TheKeeper (4934, 165, 44)
14. WICKED (4714, 25, 5)
15. Strategist (2266, 25, 5)
16. BackStabber (2180, 1327, 596)
17. RemoveInfected (2021, 33, 27)
18. OpenAndClose (1945, 667, 394)
19. Triage (1773, 401, 80)
20. TheCure (1465, 46, 26)
21. Obamacare (1263, 525, 247)
22. Mooch (1103, 546, 269)
23. Israel (1102, 580, 292)
24. RedCross (1086, 1700, 727)
25. ThePacifist (1069, 636, 580)
26. Researcher (1035, 113, 37)
27. UndecidedBot (825, 219, 93)
28. PassiveBot (510, 990, 567)
29. MedicBot (411, 1474, 667)
30. Medic (392, 1690, 619)
31. Socialist (139, 63, 90)
32. XenoBot (0, 82, 170)

Terima kasih semuanya atas partisipasi Anda. Saya harap Anda bersenang-senang mendesain dan mengkode bot Anda seperti halnya saya menjalankan permainan.


9
Bisakah kita mendapatkan perintah E xecute yang membunuh X jumlah yang terinfeksi (mengubahnya langsung menjadi mati)? Mungkin bukan metode yang layak untuk menang, tetapi tindakan yang tampaknya sah. Kecuali kalau itu yang dilakukan Karantina (tidak jelas).
Draco18s

3
Catatan tata bahasa cepat: "Sane" berarti "mental stabil"; kata yang Anda (mungkin) cari di sini adalah "sehat." (Apakah saya benar dengan menebak bahwa bahasa pertama Anda adalah bahasa Spanyol, di mana "sano" berarti "sehat," atau sesuatu yang berhubungan erat?)
Mason Wheeler

5
@MasonWheeler catatan terminologi nitpicking: Catatan kamu adalah terminologi atau kosakata catatan karena tidak ada tata bahasa yang terlibat;)
Jan

3
@Thrax Cara belokan saat ini ditangani (secara acak di awal, urutan yang sama sejak saat itu), memberi pemain yang datang kemudian di urutan giliran keuntungan besar, yang membuat hasil akhirnya varian liar. Mungkin jika Anda 1) secara acak urutan putaran setiap putaran, atau 2) membuat semua orang melihat keadaan yang sama selama giliran mereka dan menerapkan perubahan untuk semua orang secara bersamaan di akhir putaran, maka hasilnya mungkin lebih seimbang, dan didasarkan lebih lanjut tentang kualitas pengajuan. Saya menguji opsi pertama, dan hasilnya jauh lebih konsisten.
Mwr247

7
@ Thrax Saat ini ada banyak sekali bot yang ada hanya untuk "menghancurkan dunia". Walaupun ini bisa menjadi tantangan yang menyenangkan, itu pada titik di mana bot yang sebenarnya berusaha untuk bersaing tidak bisa lagi melawannya secara efektif, dan kami akan pergi dengan bot apa pun yang diprogram untuk "Cure X 3" pada akhirnya sebagai pemenang. Saya ingin menyarankan perubahan peraturan di mana untuk dipertimbangkan untuk KOTH, bot harus setidaknya mampu berakhir dengan "sanes" positif dalam pertandingan 1 lawan 1 melawan PassiveBot? Tantangannya lebih menyenangkan ketika strategi benar-benar berpengaruh.
Mwr247

Jawaban:


12

Nilai Keluarga, Node (ES6)

// Process input
var data = process.argv[2].split(';');
var round = data.shift()*1;
var id = data.shift()*1;
var playerCount = data.length;
var local = data.find(function(v) {
  return !v.indexOf(id+'_')}
).split('_');
local = {
  sane: local[1]*1,
  infected: local[2]*1,
  dead: local[3]*1,
  infectionRate: local[4]*1,
  contagionRate: local[5]*1,
  lethalityRate: local[6]*1,
  migrationRate: local[7]*1
};

// Determine response
var response = [];
for(var i=0;i<3;i++) {
  var model = {
    M: local.infectionRate,
    E: local.contagionRate * (local.sane > 0 ? 1 : 0.5),
    I: local.lethalityRate * (round > 45 ? 0 : local.sane > 0 ? 1 : 2),
    V: (local.infectionRate/4 + local.contagionRate/2 + local.lethalityRate/2) * (round > 45 ? 0 : 1),
    C: local.infected / Math.max(local.infectionRate, 1) * (round > 48 ? round : local.infectionRate + local.contagionRate/100 * local.infected < (3 - i) * 10 ? 1 : 0),
    B: local.migrationRate * 10
  };
  var max = 'M';
  for(k in model) {
    if (model[k] > model[max] ) {
      max = k;
    } else if(model[k] == model[max]) {
      max = [max, k][Math.random()*2|0];
    }
  }
  response.push(max);

  // Refactor priorities
  if(max == 'M') {
    local.infectionRate -= 4;
  } else if(max == 'E') {
    local.contagionRate -= 8;
  } else if(max == 'I') {
    local.lethalityRate -= 4;
  } else if(max == 'V') {
    local.infectionRate -= 1;
    local.contagionRate -= 4;
    local.lethalityRate -= 2;
  } else if(max == 'C') {
    local.infected -= 10;
  } else if(max == 'B') {
    local.migrationRate -= 10;
  }
}

// Respond with actions
process.stdout.write(response.join(''));

Nilai Keluarga berfokus pada pertahanan diri dan pertahanan, dan hanya melakukan tindakan untuk tujuan itu. Ia menggunakan sistem nilai-poin untuk menentukan tindakan terbaik yang harus diambil, dan kemudian menyesuaikan nilai statusnya sendiri untuk lebih menentukan prioritas berikutnya. Dalam hal seri, ia secara acak memilih dari antara pilihan terbaik.

EDIT: Tampaknya baik-baik saja sejauh ini:

    ********** FINISH **********
    1. FamilyValues (1143, 0, 188)
    2. Triage (582, 0, 158)
    3. Researcher (281, 0, 142)
    4. Madagascar (149, 0, 162)
    5. Mooch (148, 0, 331)
    6. MedicBot (142, 0, 161)
    7. Medic (66, 65, 211)
    8. XenoBot (0, 0, 22)
    9. WMDbot (0, 0, 218)
    10. PassiveBot (0, 0, 221)
    11. BioterroristBot (0, 0, 221)
    12. MadScienceBot (0, 0, 221)
    13. DisseminationBot (0, 0, 221)
    14. TheCure (0, 0, 222)

The Pacifist, Node

// Process input
var data = process.argv[2].split(';');
var round = data.shift()*1;

// Respond with actions
process.stdout.write(round == 1 ? 'OOO' : 'PPP');

Dengan begitu banyak fokus pada pembunuhan dan kematian, pasifis percaya bahwa kesehatan global yang kuat berarti kesehatan lokal yang kuat. Dengan demikian, mereka cukup banyak hanya berfokus pada pengurangan penyakit global, sementara membiarkan sebagian perbatasan terbuka untuk membiarkan kebaikan menyebar.


Wow, saya tidak berharap TheCure menjadi yang terakhir
justhalf

@justhalf Dengan banyak pemain ini, mereka semua akhirnya banyak bergerak di papan: jalankan saja sekarang di mana TheCure berakhir di posisi ke-3. Baik FamilyValues ​​dan Triage hampir selalu berada di dua teratas, dengan FV mendapatkan nomor 1 sebagian besar waktu.
Mwr247

Hmm, tugas itu sendiri bersifat deterministik, bukan? Jadi apakah itu karena beberapa pemain menempatkan keacakan dalam algoritme mereka?
justhalf

@justhalf Faktor terbesar sejauh ini tampaknya adalah urutan belokan, yang diacak (tetapi sama untuk setiap putaran dalam permainan). Going first berarti Anda tidak memiliki kesempatan untuk bereaksi terhadap tindakan semua orang selama belokan saat ini, sedangkan going last memungkinkan Anda untuk menyesuaikan diri dengan apa yang telah dilakukan pemain lain terhadap Anda.
Mwr247

1
@ justhalf Saya baru saja menguji pengontrol yang dimodifikasi yang mengacak urutan putaran untuk setiap putaran, dan hasilnya jauh lebih konsisten sekarang.
Mwr247

27

TrumpBot

private void sleep(String[] args) {

    round = Integer.parseInt(args[0]);
    thisTownID = Integer.parseInt(args[1]);

    states = new ArrayList<>();
    //states.add(new State(args[thisTownID+2]));

    otherStates = new ArrayList<>();


    for (int i = 2; i < args.length; i++){
        states.add(new State(args[i]));
    }

    for (State state : states){
        if (state.ownerId == thisTownID) {
            thisState = state;
        } else {
            otherStates.add(state);
        }
    }

    StringBuilder cmd = new StringBuilder();

    for (int j =0;j<3;j++){
        if (thisState.infected > 7) {
          if (thisState.infected > 25){
            cmd.append("Q");
            thisState.infected -= 30;
          }
          else {
            cmd.append("C");
            thisState.infected -= 10;
          }
        }
        else if (thisState.migrationRate > 2) {
          cmd.append("B");
          thisState.migrationRate -= 10;
        }
        else if (thisState.infectionRate > 4) {
          cmd.append("M");
          thisState.infectionRate  -= 4;
        }
        else if (thisState.contagionRate > 10 || thisState.lethalityRate > 6 || thisState.infectionRate > 0) {
          cmd.append("V");
          thisState.contagionRate  -= 4;
          thisState.lethalityRate  -= 2;
          thisState.infectionRate  -= 1;
        }

        else if (thisState.infected % 10 <= 6){
          cmd.append("T");
          thisState.infected +=4;
        }
        else cmd.append("V");
    }
    System.out.print(cmd.reverse());
}

Membuat Amerika hebat dengan menyembuhkan semua yang terinfeksi kecuali hanya ada 2 atau kurang; minoritas akan diabaikan.

Semakin sedikit infeksi membuat obat lebih murah.

Tidak memerlukan imigran - mereka hanya membawa infeksi.

Jika tidak ada yang tersisa untuk dilakukan, bom pemain lain.

Perintah perintah terbalik ke cara Amerika, bom pertama menyembuhkan orang kemudian.

Sunting: memperbaiki bug yang akan menyembuhkan spam karena jumlah yang terinfeksi tidak diturunkan setelah penyembuhan.

Naskah Trumps

Terima kasih kepada J Atkin untuk menyediakannya:

Make turn 4000000
As long as, turn larger than 1000000;:
If, refugee count > 2000000;: say "C"!
Else if, infectionRate > 200000;: say "M"!
Else if, immigration rate > 9000000;: say "B"!
Else: say "T"!
Make turn old turn - 1000000!
America is Great. 

14

AllOrNothing, R

args <- strsplit(commandArgs(TRUE),";")[[1]]
round <- as.integer(args[1])
me <- as.integer(args[2])
stats <- do.call(rbind,strsplit(args[-(1:2)],"_"))
stats <- as.data.frame(apply(stats,2,as.integer))
colnames(stats) <- c("id","Sane","Infected","Dead","InfRate","ContRate","LethRate","MigRate")
out <- ""
statme <- stats[stats$id==me,]
while(nchar(out)<3){
    if(round==1 & !nchar(out)){
        out <- paste0(out, "B")
    }else if(round%%5==4 & statme$Infected > 20){
        statme$Infected <- statme$Infected - 30
        out <- paste0(out, "Q")
    }else if(statme$Sane*statme$InfRate/100 >= 1){
        o <- ifelse(statme$Sane*statme$InfRate/100 < statme$Infected*statme$ContRate/100, "C", "M")
        if(o=="C") statme$Infected <- statme$Infected - 10
        if(o=="M") statme$InfRate <- statme$InfRate - 4
        out <- paste0(out, o)
    }else if(statme$Infected > 0){
        statme$Infected <- statme$Infected - 10
        out <- paste0(out, "C")
    }else if(median(stats$LethRate)<20){ 
        out <- paste0(out, "W")
    }else{
        out <- paste0(out, "E")     
    }
}
cat(substr(out,1,3))

Diminta oleh Rscript AllOrNothing.R.

Idenya di sini adalah di satu sisi untuk membatasi risiko infeksi secara maksimal (dengan menurunkan tingkat infeksi, menyembuhkan yang terinfeksi dan mencegah yang terinfeksi untuk berimigrasi) dan di sisi lain untuk meningkatkan kematian penyakit sehingga orang yang mendapatkan terinfeksi, mati sebelum mencemari yang lain.

Sunting: sedikit mengubah strategi.


Bagus, tampaknya melakukan yang sangat baik terhadap 21 negara lain!
Thrax

@ Thrax Memang, meskipun kadang-kadang, selama beberapa kali berjalan, masih gagal cukup mengesankan :) Tapi paling sering berhasil seperti dalam uji coba Anda.
plannapus

itu bot yang luar biasa, pekerjaan bagus
Eumel

Ini terlihat sangat mirip dengan keadaan saya akan menulis ketika saya menemukan waktu, jika tidak identik. Milik saya hanya ada di kepala saya ("jika 20ish terinfeksi, karantina mereka, jika 10ish, menyembuhkan mereka, dll") pekerjaan yang sangat baik.
Draco18s

13

Medis

Tenaga medis itu selalu ... bermasalah , oleh karena itu, oleh orang-orang tanpa obat. Dia suka praktek kedokteran, jadi hanya itu yang dia lakukan. Dia juga suka ular sanca, jadi dia menulis kodenya dengan Python. Semua masuk akal, jika Anda memikirkannya. Tidak, sebenarnya tidak. Sebenarnya, itu agak ...

from random import *
commands = ""
while len(commands) < 3:
    chance = random()
    if chance < .5: commands += "V"
    elif chance < .66: commands += "I"
    elif chance < .84: commands += "E"
    else: commands += "M"

print(commands)

Saya di sini untuk membantu.

Saya di sini untuk membantu.


4
Ular seperti pada tongkat Asclepius? Atau seperti staf Hermes? Ini masuk akal ...
Bukan berarti Charles

3
Antara! Kedua! Kenapa tidak? Itu semua masuk akal!
Conor O'Brien

7
++ 1; untuk TF2: D
kucing

11

Obatnya

Ini tampaknya agak terlalu sederhana, tetapi juga sepertinya metode yang cukup bagus untuk menjaga tingkat infeksi / kematian. Di setiap belokan, keluaran MCQ:

  • Mengurangi tingkat infeksi
  • Sembuhkan beberapa yang terinfeksi
  • Karantina beberapa sisanya terinfeksi

Itu dia!

public class TheCure{
    public static void main(String[]a){
        System.out.println("MCQ");
    }
}

Saya mungkin dapat meningkatkan ini dengan mengeluarkan lebih banyak M(atau B) jika saya tidak terinfeksi dan tidak menyembuhkan dan mengkarantina, tetapi saya ingin melihat seberapa baik ini dilakukan terlebih dahulu. Sayangnya, satu efek samping dari posting pertama adalah sulit untuk mengukur efektivitas:


9

DITETAPKAN, Kotlin

Ingat, WICKED itu bagus.

package wicked

import java.util.*

fun clamp(value : Double, floor : Double, ceil : Double = Double.POSITIVE_INFINITY) = Math.max(Math.min(value, ceil), floor)
fun clamp(value : Int, floor : Int, ceil : Int = Integer.MAX_VALUE) = Math.max(Math.min(value, ceil), floor)

data class Player(
        val id            : Int,
        var healthy          : Int,
        var infected      : Int,
        var dead          : Int,
        var infectionRate : Int,
        var contagionRate : Double,
        var lethalityRate : Double,
        var migrationRate : Double)

class Game(val players : List<Player>) {

    fun doAction(playerId: Int, a: Char) {
        val player = players.first { it.id == playerId }
        with(player) {
            when (a) {
                'N' -> {}
                'M' -> infectionRate = clamp(infectionRate - 4, 0)
                'E' -> contagionRate = clamp(contagionRate - .08, 0.0, 1.0)
                'I' -> lethalityRate = clamp(lethalityRate - .04, 0.0, 1.0)
                'V' -> {
                    infectionRate = clamp(infectionRate - 1, 0)
                    contagionRate = clamp(contagionRate - .04, 0.0, 1.0)
                    lethalityRate = clamp(lethalityRate - .02, 0.0, 1.0)
                }
                'C' -> {
                    val cured = Math.min(infected, 10)
                    infected -= cured
                    healthy += cured
                }
                'Q' -> infected = clamp(infected - 30, 0)
                'O' -> migrationRate = clamp(migrationRate + .1, 0.0, 1.0)
                'B' -> migrationRate = clamp(migrationRate - .1, 0.0, 1.0)
                'T' -> {
                    players.forEach {
                        val infected = Math.min(it.healthy, 4)
                        it.healthy -= infected
                        it.infected += infected
                    }
                }
                'W' -> {
                    players.forEach {
                        it.infectionRate++
                        it.lethalityRate = clamp(it.lethalityRate + .02, 0.0, 1.0)
                    }
                }
                'D' -> {
                    players.forEach {
                        it.infectionRate++
                        it.contagionRate = clamp(it.contagionRate + .02, 0.0, 1.0)
                    }
                }
                'P' -> {
                    players.forEach {
                        it.infectionRate = clamp(it.infectionRate - 1, 0)
                        it.contagionRate = clamp(it.contagionRate - .01, 0.0, 1.0)
                        it.lethalityRate = clamp(it.lethalityRate - .01, 0.0, 1.0)
                    }
                }
                else -> throw IllegalArgumentException("Invalid action: $a")
            }
        }
    }

    fun copy() = Game(players.map { it.copy() })

    fun migration() {
        var migratingHealthy = 0
        var migratingInfected = 0
        var totalMigratingWeight = 0.0

        players.forEach {
            migratingHealthy += (it.healthy * it.migrationRate).toInt()
            migratingInfected += (it.infected * it.migrationRate).toInt()
            totalMigratingWeight += it.migrationRate

            it.healthy = (it.healthy * (1 - it.migrationRate)).toInt()
            it.infected *= (it.healthy * (1 - it.migrationRate)).toInt()
        }

        players.forEach {
            it.healthy += (migratingHealthy * it.migrationRate / totalMigratingWeight).toInt()
            it.infected += (migratingInfected * it.migrationRate / totalMigratingWeight).toInt()
        }
    }

    fun infection() {
        players.forEach {
            val infected = it.infectionRate //Allow negative healthy.
            it.healthy -= infected
            it.infected += infected
        }
    }

    fun contagion() {
        players.forEach {
            val infected = (it.infected * it.contagionRate).toInt()
            it.healthy -= infected
            it.infected += infected
        }
    }

    fun extinction() {
        players.forEach {
            val killed = (it.infected * it.lethalityRate).toInt()
            it.infected -= killed
            it.dead += killed
        }
    }

    operator fun get(playerId : Int) = players.first { it.id == playerId }

    fun calculateBenefit(action : Char, myId: Int) : Int {

        val copy1 = copy()
        copy1.doAction(myId, action)

        copy1.migration()
        copy1.infection()
        copy1.contagion()
        copy1.extinction()

        return copy1[myId].healthy
    }

}

fun main(args : Array<String>) {
    @Suppress("NAME_SHADOWING")
    val args = args[0].split(';')

    val round = args[0].toInt()
    val myId = args[1].toInt()

    val players : MutableList<Player> = ArrayList()

    for ( i in 2..args.size-1) {
        val data = args[i].split('_')
        players.add(Player(data[0].toInt(), data[1].toInt(), data[2].toInt(), data[3].toInt(), data[4].toInt(), data[5].toDouble() / 100, data[6].toDouble() / 100, data[7].toDouble() / 100))
    }

    val currentGame = Game(players)

    if (round == 50) {
        println("CCC")  //Extra 30 at end of game.
        return
    }

    for (i in 1..3) {
        val action = determineBestAction(currentGame, myId)
        currentGame.doAction(myId, action)
        print(action)
    }
}

fun determineBestAction(game : Game, myId : Int) : Char {

    if (game[myId].lethalityRate > .02) {        //Save the executives!!!
        return 'I'
    } else if (game[myId].lethalityRate > 0) {
        return 'V'
    }

    val bestAction = "NMEIVQCOBP".maxBy { game.calculateBenefit(it, myId) }!!

    return bestAction

}

Kompilasi dengan: kotlinc WICKED.kt
Jalankan dengan:kotlin wicked.WICKEDKt

PFC, Kotlin

Upaya untuk melepaskan penyakit pada semua orang.

package pfc

import java.util.*

fun clamp(value : Double, floor : Double, ceil : Double = Double.POSITIVE_INFINITY) = Math.max(Math.min(value, ceil), floor)
fun clamp(value : Int, floor : Int, ceil : Int = Integer.MAX_VALUE) = Math.max(Math.min(value, ceil), floor)

data class Player(
        val id            : Int,
        var healthy          : Int,
        var infected      : Int,
        var dead          : Int,
        var infectionRate : Int,
        var contagionRate : Double,
        var lethalityRate : Double,
        var migrationRate : Double)

class Game(val players : List<Player>) {

    fun doAction(playerId: Int, a: Char) {
        val player = players.first { it.id == playerId }
        with(player) {
            when (a) {
                'N' -> {}
                'M' -> infectionRate = clamp(infectionRate - 4, 0)
                'E' -> contagionRate = clamp(contagionRate - .08, 0.0, 1.0)
                'I' -> lethalityRate = clamp(lethalityRate - .04, 0.0, 1.0)
                'V' -> {
                    infectionRate = clamp(infectionRate - 1, 0)
                    contagionRate = clamp(contagionRate - .04, 0.0, 1.0)
                    lethalityRate = clamp(lethalityRate - .02, 0.0, 1.0)
                }
                'C' -> {
                    val cured = Math.min(infected, 10)
                    infected -= cured
                    healthy += cured
                }
                'Q' -> infected = clamp(infected - 30, 0)
                'O' -> migrationRate = clamp(migrationRate + .1, 0.0, 1.0)
                'B' -> migrationRate = clamp(migrationRate - .1, 0.0, 1.0)
                'T' -> {
                    players.forEach {
                        val infected = Math.min(it.healthy, 4)
                        it.healthy -= infected
                        it.infected += infected
                    }
                }
                'W' -> {
                    players.forEach {
                        it.infectionRate++
                        it.lethalityRate = clamp(it.lethalityRate + .02, 0.0, 1.0)
                    }
                }
                'D' -> {
                    players.forEach {
                        it.infectionRate++
                        it.contagionRate = clamp(it.contagionRate + .02, 0.0, 1.0)
                    }
                }
                'P' -> {
                    players.forEach {
                        it.infectionRate = clamp(it.infectionRate - 1, 0)
                        it.contagionRate = clamp(it.contagionRate - .01, 0.0, 1.0)
                        it.lethalityRate = clamp(it.lethalityRate - .01, 0.0, 1.0)
                    }
                }
                else -> throw IllegalArgumentException("Invalid action: $a")
            }
        }
    }

    fun copy() = Game(players.map { it.copy() })

    fun migration() {
        var migratingHealthy = 0
        var migratingInfected = 0
        var totalMigratingWeight = 0.0

        players.forEach {
            migratingHealthy += (it.healthy * it.migrationRate).toInt()
            migratingInfected += (it.infected * it.migrationRate).toInt()
            totalMigratingWeight += it.migrationRate

            it.healthy = (it.healthy * (1 - it.migrationRate)).toInt()
            it.infected *= (it.healthy * (1 - it.migrationRate)).toInt()
        }

        players.forEach {
            it.healthy += (migratingHealthy * it.migrationRate / totalMigratingWeight).toInt()
            it.infected += (migratingInfected * it.migrationRate / totalMigratingWeight).toInt()
        }
    }

    fun infection() {
        players.forEach {
            val infected = Math.min(it.healthy, it.infectionRate)
            it.healthy -= infected
            it.infected += infected
        }
    }

    fun contagion() {
        players.forEach {
            val infected = Math.min(it.healthy, (it.infected * it.contagionRate).toInt())
            it.healthy -= infected
            it.infected += infected
        }
    }

    fun extinction() {
        players.forEach {
            val killed = (it.infected * it.lethalityRate).toInt()
            it.infected -= killed
            it.dead += killed
        }
    }

    operator fun get(playerId : Int) = players.first { it.id == playerId }

    fun calculateBenefit(action : Char, myId: Int) : Int {

        val copy1 = copy()
        copy1.doAction(myId, action)

        copy1.migration()
        copy1.infection()
        copy1.contagion()
        copy1.extinction()

        return copy1.players.sumBy { it.infected }
    }

}

fun main(args : Array<String>) {
    @Suppress("NAME_SHADOWING")
    val args = args[0].split(';')

    @Suppress("UNUSED_VARIABLE")
    val round = args[0].toInt()
    val myId = args[1].toInt()

    val players : MutableList<Player> = ArrayList()

    for ( i in 2..args.size-1) {
        val data = args[i].split('_')
        players.add(Player(data[0].toInt(), data[1].toInt(), data[2].toInt(), data[3].toInt(), data[4].toInt(), data[5].toDouble() / 100, data[6].toDouble() / 100, data[7].toDouble() / 100))
    }

    val currentGame = Game(players)

    for (i in 1..3) {
        val action = determineBestAction(currentGame, myId)
        currentGame.doAction(myId, action)
        print(action)
    }
}

fun determineBestAction(game : Game, myId : Int) : Char {

    val bestAction = "NMEIVCQOBTWDP".maxBy { game.calculateBenefit(it, myId) }!!

    return bestAction

}

Kompilasi dengan: kotlinc PFC.kt
Jalankan dengan:kotlin pfc.PFCKt

Teroris, Kotlin

Berusaha membuat semua orang mati.

package terrorist

import java.util.*

fun clamp(value : Double, floor : Double, ceil : Double = Double.POSITIVE_INFINITY) = Math.max(Math.min(value, ceil), floor)
fun clamp(value : Int, floor : Int, ceil : Int = Integer.MAX_VALUE) = Math.max(Math.min(value, ceil), floor)

data class Player(
        val id            : Int,
        var healthy          : Int,
        var infected      : Int,
        var dead          : Int,
        var infectionRate : Int,
        var contagionRate : Double,
        var lethalityRate : Double,
        var migrationRate : Double)

class Game(val players : List<Player>) {

    fun doAction(playerId: Int, a: Char) {
        val player = players.first { it.id == playerId }
        with(player) {
            when (a) {
                'N' -> {}
                'M' -> infectionRate = clamp(infectionRate - 4, 0)
                'E' -> contagionRate = clamp(contagionRate - .08, 0.0, 1.0)
                'I' -> lethalityRate = clamp(lethalityRate - .04, 0.0, 1.0)
                'V' -> {
                    infectionRate = clamp(infectionRate - 1, 0)
                    contagionRate = clamp(contagionRate - .04, 0.0, 1.0)
                    lethalityRate = clamp(lethalityRate - .02, 0.0, 1.0)
                }
                'C' -> {
                    val cured = Math.min(infected, 10)
                    infected -= cured
                    healthy += cured
                }
                'Q' -> infected = clamp(infected - 30, 0)
                'O' -> migrationRate = clamp(migrationRate + .1, 0.0, 1.0)
                'B' -> migrationRate = clamp(migrationRate - .1, 0.0, 1.0)
                'T' -> {
                    players.forEach {
                        val infected = Math.min(it.healthy, 4)
                        it.healthy -= infected
                        it.infected += infected
                    }
                }
                'W' -> {
                    players.forEach {
                        it.infectionRate++
                        it.lethalityRate = clamp(it.lethalityRate + .02, 0.0, 1.0)
                    }
                }
                'D' -> {
                    players.forEach {
                        it.infectionRate++
                        it.contagionRate = clamp(it.contagionRate + .02, 0.0, 1.0)
                    }
                }
                'P' -> {
                    players.forEach {
                        it.infectionRate = clamp(it.infectionRate - 1, 0)
                        it.contagionRate = clamp(it.contagionRate - .01, 0.0, 1.0)
                        it.lethalityRate = clamp(it.lethalityRate - .01, 0.0, 1.0)
                    }
                }
                else -> throw IllegalArgumentException("Invalid action: $a")
            }
        }
    }

    fun copy() = Game(players.map { it.copy() })

    fun migration() {
        var migratingHealthy = 0
        var migratingInfected = 0
        var totalMigratingWeight = 0.0

        players.forEach {
            migratingHealthy += (it.healthy * it.migrationRate).toInt()
            migratingInfected += (it.infected * it.migrationRate).toInt()
            totalMigratingWeight += it.migrationRate

            it.healthy = (it.healthy * (1 - it.migrationRate)).toInt()
            it.infected *= (it.healthy * (1 - it.migrationRate)).toInt()
        }

        players.forEach {
            it.healthy += (migratingHealthy * it.migrationRate / totalMigratingWeight).toInt()
            it.infected += (migratingInfected * it.migrationRate / totalMigratingWeight).toInt()
        }
    }

    fun infection() {
        players.forEach {
            val infected = Math.min(it.healthy, it.infectionRate)
            it.healthy -= infected
            it.infected += infected
        }
    }

    fun contagion() {
        players.forEach {
            val infected = Math.min(it.healthy, (it.infected * it.contagionRate).toInt())
            it.healthy -= infected
            it.infected += infected
        }
    }

    fun extinction() {
        players.forEach {
            val killed = (it.infected * it.lethalityRate).toInt()
            it.infected -= killed
            it.dead += killed
        }
    }

    operator fun get(playerId : Int) = players.first { it.id == playerId }

    fun calculateBenefit(action : Char, myId: Int) : Int {

        val copy1 = copy()
        copy1.doAction(myId, action)

        copy1.migration()
        copy1.infection()
        copy1.contagion()
        copy1.extinction()

        return copy1.players.sumBy { it.dead }
    }

}

fun main(args : Array<String>) {
    @Suppress("NAME_SHADOWING")
    val args = args[0].split(';')

    @Suppress("UNUSED_VARIABLE")
    val round = args[0].toInt()
    val myId = args[1].toInt()

    val players : MutableList<Player> = ArrayList()

    for ( i in 2..args.size-1) {
        val data = args[i].split('_')
        players.add(Player(data[0].toInt(), data[1].toInt(), data[2].toInt(), data[3].toInt(), data[4].toInt(), data[5].toDouble() / 100, data[6].toDouble() / 100, data[7].toDouble() / 100))
    }

    if (round == 50) {
        println("TTT")  //Let's mess up the scoreboard :D
        return
    }

    val currentGame = Game(players)
    for (i in 1..3) {
        val action = determineBestAction(currentGame, myId)
        currentGame.doAction(myId, action)
        print(action)
    }
}

fun determineBestAction(game : Game, myId : Int) : Char {

    if (game[myId].lethalityRate > .02) {          //We don't want to hurt ourselves.
        return 'I'
    } else if (game[myId].lethalityRate > 0) {
        return 'V'
    }

    val bestAction = "NMEIVCQOBTWDP".maxBy { game.calculateBenefit(it, myId) }!!

    return bestAction

}

Kompilasi dengan: kotlinc Terrorist.kt
Jalankan dengan:kotlin terrorist.TerroristKt


Kompilasi memberi saya folder "jahat" dengan kelas Game, Player, dan WICKEDkt. Berjalan seperti yang Anda jelaskan mengembalikan: "kesalahan: tidak dapat menemukan atau memuat kelas utama wicked.WICKEDKt"
Mwr247

Aneh, itu bekerja di komputer saya baik-baik saja. Apakah Anda yakin file kelas WICKEDkt sebenarnya tidak bernama WICKEDKt? Juga, pastikan direktori kerja Anda tidak di dalam folder jahat.
TheNumberOne

Itu adalah WICKEDKt. Saya salah ketik di komentar.
Mwr247

@ Mwr247 Apakah Anda meninggalkan folder jahat yang dihasilkan di dalam folder pengiriman? Apakah Anda memindahkan file yang dihasilkan dari folder jahat?
TheNumberOne

WICKED itu baik ... sialan kau dan referensi Anda untuk hal-hal yang baru saja saya baca.
ArtOfCode

9

Madagaskar, Jawa

Yap, pergi rute Madagaskar. Babak pertama, kita BBBmenutup perbatasan kita. Kalau tidak, itu memberi obat, dan berfokus pada vaksin lokal.

public class Madagascar{
    public static void main(String[]args){
        Boolean bool = false;
        bool = args[0].startsWith("1;");

        if(bool) {
            System.out.println("BBB");
        }
        else {
            System.out.println("CVV");
        }
    }
}

Edit1 - I more-Madagascar'd
Edit2 - Terima kasih @Geobits untuk startsWithpengingatnya


jika Geobits benar tentang tingkat migrasi mulai dari 5 dan tidak dapat direduksi menjadi nol, B tidak melakukan apa-apa.
kuintopia

Saat ini sepertinya tidak akan dikompilasi. if (b == true)(Yang seharusnya if (b)sebagai masalah gaya) akan memberikan kesalahan karena variabel sebenarnya dipanggil bool.
Peter Taylor

tidak akan jika memeriksa terhadap putaran == 1 bekerja jauh lebih baik daripada membuat file?
Eumel

1
@TimmyD Untungnya, ronde pertama, jadi tidak banyak penguraian. Periksa apakah input dimulai dengan1;
Geobits

@Geobits Terima kasih atas startsWith()pengingatnya. JAUH lebih mudah daripada berpisah ;dan mencoba menangkap kembali dan ... Sudah kukatakan aku berkarat dengan Jawa.
AdmBorkBork

7

Garam, Kotlin

Bot ini bertahan sampai semua pemain jahat mati. Setelah itu, ia menyembuhkan populasi dan mengisi kembali kota dengan orang-orang sehat.

Bot ini memiliki 5 langkah:

  1. Tutup perbatasan.
  2. Biarkan yang terinfeksi mati, tetapi jangan terlalu cepat (menemukan seberapa cepat dan cepat itu bagian yang sulit).
  3. Cegah orang yang terinfeksi agar tidak menginfeksi orang sehat.
  4. Sembuhkan yang terinfeksi (dengan garam: P).
  5. Mereproduksi.

Ini dia:

package salt

import java.io.File
import java.util.*

data class Player(
        val id            : Int,
        var healthy       : Int,
        var infected      : Int,
        var dead          : Int,
        var infectionRate : Int,
        var contagionRate : Int,
        var lethalityRate : Int,
        var migrationRate : Int)

fun main(args : Array<String>) {
    @Suppress("NAME_SHADOWING")
    val args = args[0].split(';')

    val round = args[0].toInt()
    val myId = args[1].toInt()

    val players : MutableList<Player> = ArrayList()

    for ( i in 2..args.size-1) {
        val data = args[i].split('_')
        players.add(Player(data[0].toInt(), data[1].toInt(), data[2].toInt(), data[3].toInt(), data[4].toInt(), data[5].toInt(), data[6].toInt(), data[7].toInt()))
    }

    if (round == 50) {
        println("CCC")  //Extra 30 at end of game.
        return
    }

    var actionsLeft = 3

    val me = players.first { it.id == myId }
    val dataFile = File("Salt.txt")
    val lastRoundInfected : Int
    var roundsInHole : Int
    if (round == 1) {
        lastRoundInfected = 1
        roundsInHole = 0
    } else {
        val lines = dataFile.readLines()
        lastRoundInfected = lines[0].toInt()
        roundsInHole = lines[1].toInt()
    }

    val wantedInfected = lastRoundInfected * Math.pow(1/1.5, 1.0/5) * (if (round % 5 == 0 && round != 0) 1.5 else 1.0)

    while (me.migrationRate > 0) {
        print('B')          //Close borders
        me.migrationRate = Math.max(0, me.migrationRate - 10)
        actionsLeft--
    }

    if (me.infected <= wantedInfected) {   //Our infected are dieing too quickly
        roundsInHole++
    } else {
        roundsInHole = Math.max(0, roundsInHole - 1)
    }

    if (me.lethalityRate > 0) {
        var lethalityRateDelta = roundsInHole * 2
        while (lethalityRateDelta > 0 && me.lethalityRate > 0 && actionsLeft > 0) {
            if (lethalityRateDelta == 2 || me.lethalityRate <= 2) {
                lethalityRateDelta -= 2
                print('V')  //Research vaccines
                me.infectionRate = Math.max(0, me.infectionRate - 1)
                me.contagionRate = Math.max(0, me.contagionRate - 4)
                me.lethalityRate = Math.max(0, me.lethalityRate - 2)
                actionsLeft--
            } else {
                lethalityRateDelta -= 4
                print('I')
                me.lethalityRate = Math.max(0, me.lethalityRate - 4)
                actionsLeft--
            }
        }
    }

    dataFile.writeText("${me.infected}\n$roundsInHole")

    while (actionsLeft > 0) {
        if (me.infectionRate + me.contagionRate * me.infected / 100 <= 0) {
            break
        }
        val mWeight = Math.min(me.infectionRate, 4)
        val eWeight = Math.min(me.contagionRate, 8) * me.infected / 100
        val vWeight = Math.min(me.contagionRate, 4) * me.infected / 100 + Math.min(me.infectionRate, 1)
        if (mWeight > eWeight && mWeight > vWeight) {
            print('M')      //Research microbiology
            me.infectionRate = Math.max(0, me.infectionRate - 4)
        } else if (eWeight > vWeight){
            print('E')      //Research epidemiology
            me.contagionRate = Math.max(0, me.contagionRate - 8)
        } else {
            print('V')      //Research vaccines
            me.infectionRate = Math.max(0, me.infectionRate - 1)
            me.contagionRate = Math.max(0, me.contagionRate - 4)
            me.lethalityRate = Math.max(0, me.lethalityRate - 2)
        }
        actionsLeft--
    }

    while (actionsLeft > 0) {
        if (me.infected <= 0) {
            break
        }
        print('C')          //Cure
        val cured = Math.min(me.infected, 10)
        me.infected -= cured
        me.healthy += cured
        actionsLeft--
    }

    while (actionsLeft > 0) {
        print('N')          //Do nothing
        actionsLeft--
    }

    return
}

Kompilasi dengan: kotlinc Salt.kt
Jalankan dengan:kotlin salt.SaltKt

EDIT: Kemungkinan lebih tinggi untuk selamat sampai sebagian besar bot "akhir dunia" mati.

Contoh hasil:

1. Salt (247, 12, 280)
2. InfectedTown (30, 2016, 843)
3. ZombieState (30, 1030, 609)
4. WICKED (30, 413, 222)
5. Triage (18, 965, 706)
6. Mooch (18, 657, 597)
7. MadScienceBot (18, 305, 647)
8. TheKeeper (13, 0, 158)
9. FamilyValues (10, 110, 373)
10. Madagascar (2, 0, 271)
11. Terrorist (0, 1358, 651)
12. InfectionBot (0, 1217, 830)
13. Medic (0, 27, 340)
14. MedicBot (0, 1, 200)
15. UndecidedBot (0, 0, 33)
16. Researcher (0, 0, 63)
17. TheCure (0, 0, 71)
18. TrumpBot (0, 0, 88)
19. WeaponOfMassDissemination (0, 0, 137)
20. Strategist (0, 0, 142)
21. PassiveBot (0, 0, 149)
22. DisseminationBot (0, 0, 152)
23. PassiveBot (0, 0, 155)
24. Crossroads (0, 0, 164)
25. InfectedHaven (0, 0, 170)
26. Socialist (0, 0, 172)
27. BioterroristBot (0, 0, 175)
28. XenoBot (0, 0, 184)
29. ThePacifist (0, 0, 199)
30. CullBot (0, 0, 294)
31. AllOrNothing (0, 0, 327)

Strategi yang sangat bagus. Saya suka Anda memanfaatkan sifat mematikan dengan cara yang "baik"!
Thrax

Kerja bagus mengakhiri bot "akhir dunia"! Namun, Salt mungkin akan roboh jika ada beberapa bot lagi, saya tidak yakin. Kemampuan untuk bertahan yang sudah sangat mengesankan, pria yang baik!
busukxuan

@busukxuan Seperti saat ini, beberapa bot harus memaksimalkan tingkat kematian sebelum mereka bisa membunuh ini, bunuh diri dalam prosesnya.
TheNumberOne

7

PureBot (Haskell)

PureBot membenci satu hal: Efek samping!
Ini akan mencoba untuk menangani semua efek samping, dan jika semuanya berjalan dengan baik, itu akan mengurangi jumlah efek samping yang dihasilkan oleh dunia luar.
Ini juga mengabaikan semua efek samping dalam perhitungannya.
Ini membuatnya bermain secara signifikan lebih baik melawan musuh pasif (yang tidak mengubah tingkat global).

Jika infected, infection, contagion, lethalitydan migrationsemua nol, itu akan membantu bot lain dengan P(untuk Pure) perintah.

module Main where
import Control.Monad (void)
import Data.List (find)
import System.Environment (getArgs)
import System.Exit (exitFailure)
import Text.Parsec

-- | The world
data World = World
    { worldRound  :: Int    -- ^ The current round
    , worldTownID :: Int    -- ^ The current town ID
    , worldTowns  :: [Town] -- ^ List of all towns in the world
    }
    deriving (Show)

-- | A town in the world
data Town = Town
    { townID            :: Int -- ^ The town ID
    , townDeath         :: Int -- ^ The number of death people in the town
    , townHealthy       :: Int -- ^ The number of healthy people in the town
    , townInfected      :: Int -- ^ The number of infected people in the town
    , townInfectionRate :: Int -- ^ The infaction rate of the town
    , townContagionRate :: Int -- ^ The contagion rate of the town
    , townLethalityRate :: Int -- ^ The lethality rate of the town
    , townMigrationRate :: Int -- ^ The migration rate of the town
    }
    deriving (Show)

-- | Parse a Int
parseInt :: Parsec String () Int
parseInt = do
    sign <- option '+' $ oneOf "+-"
    numb <- read <$> many1 digit
    return $ if sign == '+'
        then numb
        else negate numb

-- | Parse a town
parseTown :: Parsec String () Town
parseTown = do
    nID <- parseInt
    void $ char '_'
    nHealthy <- parseInt
    void $ char '_'
    nInfected <- parseInt
    void $ char '_'
    nDeath <- parseInt
    void $ char '_'
    nInfectionRate <- parseInt
    void $ char '_'
    nContagionRate <- parseInt
    void $ char '_'
    nLethalityRate <- parseInt
    void $ char '_'
    nMigrationRate <- parseInt
    return Town
        { townID            = nID
        , townDeath         = nDeath
        , townHealthy       = nHealthy
        , townInfected      = nInfected
        , townInfectionRate = nInfectionRate
        , townContagionRate = nContagionRate
        , townLethalityRate = nLethalityRate
        , townMigrationRate = nMigrationRate }

-- | Parse a world
parseWorld :: Parsec String () World
parseWorld = do
    nRound <- parseInt
    void $ char ';'
    nTownID <- parseInt
    void $ char ';'
    towns <- parseTown `sepBy` char ';'
    let nTowns = length towns
    if nTowns < nTownID
        then let nExpected   = (nTownID - nTowns) in
            fail $ "expected at least " ++ show nExpected ++ " more town(s)"
        else return World
            { worldRound  = nRound
            , worldTownID = nTownID
            , worldTowns  = towns }

-- | Update a town
updateTown :: World -> Town -> String
updateTown world town = take 3 $ lastRound
                   ++ prepareForReproduction
                   ++ decreaseInfected
                   ++ decreaseMigration
                   ++ decreaseInfection
                   ++ decreaseContagion
                   ++ decreaseLethality
                   ++ decreaseWorldWide
  where
    -- | The current round number
    nRound         = worldRound world
    -- | The current number of infected
    nInfected      = townInfected town
    -- | The current lethality rate
    nLethalityRate = townLethalityRate town
    -- | The current migration rate
    nMigrationRate = townMigrationRate town
    -- | The current infection rate
    nInfectionRate = townInfectionRate town
    -- | The current contagion rate
    nContagionRate = townContagionRate town
    -- | What to do on the last round
    lastRound
        | nRound == 50 = "CCC"
        | otherwise    = ""
    -- | What to do in order to prepare for reproduction
    prepareForReproduction
        | (nRound+1) `mod` 5 == 0 = decreaseInfected
        | otherwise               = ""
    -- | What to do in order to decrease infected
    decreaseInfected
        | nInfected > 25 = "CCC"
        | nInfected > 15 = "CC"
        | nInfected > 5  = "C"
        | otherwise      = ""
    -- | What to do in order to decrease lethality
    decreaseLethality
        | nLethalityRate > 4 = "I"
        | otherwise          = ""
    -- | What to do in order to decrease migration
    decreaseMigration
        | nMigrationRate > 0 = "B"
        | otherwise          = ""
    -- | What to do in order to decrease infection
    decreaseInfection
        | nInfectionRate > 0 = "M"
        | otherwise          = ""
    -- | What to do in order to decrease contagion
    decreaseContagion
        | nContagionRate > 4 = "E"
        | otherwise          = ""
    -- | What to do if everything else has been taken care of
    decreaseWorldWide = "PPP"

-- | Update a world
updateWorld :: World -> Maybe String
updateWorld world = updateTown world <$> town
  where
    town          = find ((==worldTownID world) . townID) (worldTowns world)

-- | Main program entry point
main :: IO ()
main = do
    cmds <- concat <$> getArgs
    case parse parseWorld "stdin" cmds of
        Left err    -> print err >> exitFailure
        Right world -> case updateWorld world of
            Just cmd -> putStrLn cmd
            Nothing  -> putStrLn "Failed to update world!" >> exitFailure

jalankan dengan: runhaskell PureBot.hs


Wow, kemurnian teknis apa! Saya suka bagaimana Anda menafsirkan perintah P.
busukxuan

Saya baru saja menginstal Haskell 7.10.3, dan ketika saya mencoba menjalankan bot Anda, ia menunggu tanpa batas. Aku mencoba dengan ini: runhaskell.exe PureBot.hs 1;0;0_97_3_0_2_5_15_5;1_97_3_0_2_5_15_5. Apakah ada hal lain yang perlu saya lakukan sebelum menjalankannya?
Thrax

@Thrax Oh, maaf. Saya pikir Anda melewati perintah melalui stdin ... Jika tidak saya akan mengubah program.
YoYoYonnY

Perintah diberikan sebagai argumen. Saya akan menjalankan selanjutnya setelah Anda memperbarui bot Anda.
Thrax

@ Thrax Dalam hal ini seharusnya berfungsi sekarang.
YoYoYonnY

7

Kota Terinfeksi, Jawa

Kota yang terinfeksi tidak peduli jika orang diserang selama mereka tidak mati. Itu sebabnya itu akan menurunkan tingkat kematian lokal sebanyak mungkin.

Ketika tingkat kematian sudah sangat rendah, ia menggunakan tindakan yang tersisa untuk meningkatkan tingkat kematian global sebelum menurunkannya sendiri.

Karena berusaha menjadi kota terbesar di sekitarnya, keseimbangan imigrasi hanya bisa negatif, jadi tindakan pertamanya adalah menutup perbatasan.

Selama belokan terakhir, tingkat kematian tidak berpengaruh dan peringkat dilakukan pada jumlah orang waras di kota, sehingga menyembuhkan 30 orang dan berharap itu akan cukup.

import java.util.ArrayList;
import java.util.List;

public class InfectedTown {

    int playerID;
    State thisState;

    public static void main(String[] args){
        new InfectedTown().sleep(args[0].split(";"));
    }

    private void sleep(String[] args) {
        // Parse arguments
        int round = Integer.parseInt(args[0]);
        playerID = Integer.parseInt(args[1]);

        for (int i = 2; i < args.length; i++){
            thisState = new State(args[i]);
            if(thisState.isMine()){
                break;
            }
        }

        // Special actions on turn 1 and 50.
        String action="";
        if(round == 1){
            action = "B";
        } else if(round == 50){
            action="CCC";
        } 

        while(action.length()<3){
            if(thisState.lethalityRate<=2 && action.length()<2){
                // We still have at least one action: lets increase the 
                // lethality rate for everyone, we will decrease it with our 
                // remaining actions.
                action+="W";
                thisState.lethalityRate+=2;
            } else if (thisState.lethalityRate>=4 
                    ||(thisState.lethalityRate>0 && action.length()==2)) {
                // Don't let people die!
                action+="I";
                thisState.lethalityRate-=4;
            } else {
                // Nothing better to do, lets distract other towns by  
                // increasing some useless values
                action+="D";
            }
        }

       System.out.println(action);
    }

    private class State {
        public int ownerId;
        public int lethalityRate;

        public State(String string) {
            String[] args = string.split("_");
            ownerId = Integer.parseInt(args[0]);
            lethalityRate = Integer.parseInt(args[6]);
        }

        public boolean isMine(){
            return ownerId == playerID;
        }
    }
}

5

CullBot, Python 3

Cukup banyak bot perlindungan diri standar yang menutup perbatasan dan mencoba menurunkan tingkat infeksi di kota. Itu dilakukan dengan memusnahkan vektor hewan (karena orang yang terinfeksi tidak memiliki efek pada tingkat infeksi, itu harus ada hubungannya dengan vektor non-manusia; pada dasarnya ini adalah "Mikrobiologi penelitian"). Kadang-kadang itu "memusnahkan" manusia yang terinfeksi juga ... Anda tahu, AI membuat kesalahan juga ...

# Parsing code
from sys import argv

args = argv[1].split(";")

n = int(args[0])
pid = int(args[1])
dic = ["pid","healthy","infected","dead","infection","contagion","lethality","migration"]
players = []
for p in args[2:]:
    players += [{dic[i]:int(p.split("_")[i]) for i in range(len(p.split("_")))}]
    if int(p.split("_")[0]) == pid:
        me = players[-1]

# Bot code

actions = ""
nextInfected = me["infected"]*me["contagion"]/100 + me["infection"] + me["infected"] - me["infected"]*me["lethality"]/100
if n%5 == 4:
    nextInfected *= 1.5

if n == 1:
    actions += "BM"
    if nextInfected*1.3 > 10:
        actions += "C"
    elif me["infection"] > 6:
        actions += "M"
    elif me["infection"] > 4:
        actions += "V"
    else:
        actions += "E"
    print(actions)
    exit()
elif n == 50:
    print("CCC")
    exit()


if nextInfected*1.2 > 30:
    if me["infected"] >= 23:
        actions += "Q"
        me["infected"] -= 30
    else:
        actions += "C"
        me["infected"] -= 10
elif me["infection"] > 0:
    actions += "M"
    me["infection"] -= 4
elif me["contagion"] >= 6:
    actions += "E"
    me["contagion"] -= 8
elif me["infected"] > 0:
    actions += "C"
    me["infected"] -= 10
else:
    actions += "E"
    me["contagion"] -= 8

if me["infection"] >= 3:
    actions += "M"
    me["infection"] -= 4
elif me["infected"] >= 7 :
    actions += "C"
    me["infected"] -= 10
elif me["infection"] > 0 and me["contagion"] >= 3:
    actions += "V"
    me["infection"] -= 1
    me["contagion"] -= 4
elif me["contagion"] >= 6:
    actions += "E"
    me["contagion"] -= 8
elif me["infection"] > 0:
    actions += "M"
    me["infection"] -= 4
elif me["infected"] > 0:
    actions += "C"
    me["infected"] -= 10
else:
    actions += "E"
    me["contagion"] -= 8

if me["infection"] >= 3:
    actions += "M"
    me["infection"] -= 4
elif me["infected"] >= 7 :
    actions += "C"
    me["infected"] -= 10
elif me["infection"] > 0 and me["contagion"] >= 3:
    actions += "V"
    me["infection"] -= 1
    me["contagion"] -= 4
elif me["contagion"] >= 6:
    actions += "E"
    me["contagion"] -= 8
elif me["infection"] > 0:
    actions += "M"
    me["infection"] -= 4
elif me["infected"] > 0:
    actions += "C"
    me["infected"] -= 10
else:
    actions += "E"
    me["contagion"] -= 8

if actions[-2:] == "VV":
    actions = actions[0] + "ME"
print(actions)

1
Saya bukan orang Python, jadi saya bisa melakukan ini salah, tetapi menjalankan ini dalam Python 3.4 memberi saya "NameError: nama 'kamus' tidak didefinisikan" pada baris 9.
Mwr247

@ Mwr247 Terima kasih, ternyata saya benar-benar keluar dari pikiran ketika saya menulis kode parsing ... Ada banyak masalah lebih dari itu.
busukxuan

Sekarang ia memberi "TypeError: objek 'daftar' tidak dapat diartikan sebagai integer" pada baris 11
Mwr247

Sekarang berfungsi =)
Mwr247

@ Mwr247 Lol! Saya pikir saya sudah memperbaikinya, tetapi saya tidak menyalin dan menempelkan kode baru jadi saya kira saya melewatkan yang itu. Saya diuji, sekarang seharusnya sudah berjalan dengan baik. Kecuali saya salah paham aturan I / O.
busukxuan

5

EvilBot, Java

EvilBot tidak peduli menyembuhkan orang. Selama mereka tetap hidup (agak). Mencoba membuat seluruh dunia sakit.

Dalam pengujian lokal saya, BlunderBot melakukan jauh lebih baik sampai saya juga memperkenalkan EvilBot. Tampaknya sedikit goyang.

import java.util.ArrayList;
import java.util.List;

public class EvilBot {

int round;
int phase;
int playerID;
int thisTownID;

List<State> states;
List<State> otherStates;

State thisState;
String action = "";
int cc=0; // command count

public static void main(String[] args){
    new EvilBot().sleep(args[0].split(";"));
}

private void action(String newAction) {
    action += newAction;
    cc+= newAction.length();
    if (cc>=3) {
        System.out.println(action.substring(0, 3));
        System.exit(0);;
    }
}
private void sleep(String[] args) {

    round = Integer.parseInt(args[0]);
    thisTownID = Integer.parseInt(args[1]);

    states = new ArrayList<>();
    otherStates = new ArrayList<>();

    for (int i = 2; i < args.length; i++){
        states.add(new State(args[i]));
    }

    for (State state : states){
        if (state.isMine()) {
            thisState = state;
        } else {
            otherStates.add(state);
        }
    }

    // Round specific commands
    if (round == 1 )                                { action("B");   }
    if (round == 50)                                { action("CCC"); }

    for (int i=0;i<3;i++){
        if (thisState.getLethalityRate() >= 4)  { action("I"); thisState.lethalityRate -= 4;}
    }

    // Nothing else to do, cause trouble.
    action("DWT");
}


private class State {

    private final int ownerId;
    private int healthy;
    private int infected;
    private int dead;
    private int infectionRate;
    private int contagionRate;
    private int lethalityRate;
    private int migrationRate;

    public State(String string) {
        String[] args = string.split("_");
        ownerId = Integer.parseInt(args[0]);
        healthy = Integer.parseInt(args[1]);
        infected = Integer.parseInt(args[2]);
        dead = Integer.parseInt(args[3]);
        infectionRate = Integer.parseInt(args[4]);
        contagionRate = Integer.parseInt(args[5]);
        lethalityRate = Integer.parseInt(args[6]);
        migrationRate = Integer.parseInt(args[7]);
    }

    public int getOwnerId() {
        return ownerId;
    }

    public int getHealthy() {
        return healthy;
    }

    public int getInfected() {
        return infected;
    }

    public int getDead() {
        return dead;
    }

    public int getInfectionRate() {
        return infectionRate;
    }

    public int getContagionRate() {
        return contagionRate;
    }

    public int getLethalityRate() {
        return lethalityRate;
    }

    public int getMigrationRate() {
        return migrationRate;
    }

    public boolean isMine(){
        return getOwnerId() == thisTownID;
    }

}

}

5

Senjata Penyebaran Massal

public class WMDbot{
    public static void main(String[]a){
        System.out.println("WMD");
    }
}

Bot WMD adalah brengsek: menjaga tingkat infeksi sendiri rendah dan meningkatkan orang lain.

Bot dibuat murni untuk akronim, kemungkinan bukan pesaing yang kuat, tetapi akan membuat bidang kompetitif sedikit lebih ... menarik. Code meminjam dari TheCure dan hanya mengubah string aksinya.


Secara teknis Anda juga telah mengubah nama kelas; P
Captain Man

@DenhamCoote: Tolong jangan pergi sekitar tag bahasa menambahkan massa. Jika Anda akan mengedit posting, pastikan itu sesuatu yang lebih penting (tata bahasa, pemformatan, dll). Terima kasih.
Zach Gates

Oh Saya pernah memiliki itu sebagai satu-satunya edit ke salah satu posting saya - saya hanya mengikuti jejak orang lain ...
Denham Coote

@DenhamCoote Ini adalah salah satu dari "suntingan murah yang mudah" yang tidak menambahkan apa-apa, tetapi sebenarnya tidak dilarang. Melakukan banyak dari mereka mendapat spam.
Draco18s

Tidak yakin apa yang Anda maksud dengan 'murah' - Ini menambah keterbacaan, bagi saya ... Tantangan ini memiliki lebih banyak kode untuk dibaca daripada tantangan golf normal, dan karena itu saya pikir penyorotan sintaks akan disambut baik. Ini tidak seperti saya melakukan ini untuk poin, saya kebetulan menikmati tantangan ini.
Denham Coote

5

Graymalkin, Jawa

Fokus utama Graymalkin adalah mengurangi tingkat infeksi menjadi 0 dan menumbuhkan populasi sehatnya. Ia tidak percaya pada karantina ... kecuali dari dunia luar tentunya.

Selamat datang di post-kritik pertama saya. :)

import java.util.ArrayList;
import java.util.List;

public class Graymalkin {

    int round;
    int phase;
    int playerID;
    int thisTownID;

    List<State> states;
    List<State> otherStates;

    State thisState;

    public static void main(String[] args) {
        new Graymalkin().sleep(args[0].split(";"));
    }

    private void sleep(String[] args) {

        round = Integer.parseInt(args[0]);
        playerID = Integer.parseInt(args[1]);

        states = new ArrayList<>();
        otherStates = new ArrayList<>();

        for (int i = 2; i < args.length; i++) {
            states.add(new State(args[i]));
        }

        for (State state : states) {
            if (state.isMine()) {
                thisState = state;
            } else {
                otherStates.add(state);
            }
        }

        if (round == 50) {
            System.out.println("CCC");
            return;
        }

        String out = "";

        if (round == 1) {
            out += "B";
        }

        if (thisState.infectionRate < 10 && thisState.infected >= 10) {
            out += "C";
            thisState.infected -= 10;
        }

        while (thisState.infectionRate >= 4) {
            out += "M";
            thisState.infectionRate -= 4;
        }

        while (thisState.infectionRate > 0) {
            out += "V";
            thisState.infectionRate -= 1;
        }

        while (out.length() < 3) {
            if (thisState.infected > 0) {
                out += "C";
                thisState.infected -= 10;
            } else if (thisState.contagionRate > 0) {
                out += "E";
                thisState.contagionRate -= 8;
            } else if (thisState.lethalityRate > 0) {
                out += "I";
                thisState.lethalityRate -= 4;
            } else {
                out += "N";
            }
        }

        System.out.println(out.substring(0, 3));
    }

    private class State {

        private final int ownerId;
        private int sane;
        private int infected;
        private int dead;
        private int infectionRate;
        private int contagionRate;
        private int lethalityRate;
        private int migrationRate;

        public State(String string) {
            String[] args = string.split("_");
            ownerId = Integer.parseInt(args[0]);
            sane = Integer.parseInt(args[1]);
            infected = Integer.parseInt(args[2]);
            dead = Integer.parseInt(args[3]);
            infectionRate = Integer.parseInt(args[4]);
            contagionRate = Integer.parseInt(args[5]);
            lethalityRate = Integer.parseInt(args[6]);
            migrationRate = Integer.parseInt(args[7]);
        }

        public int getOwnerId() {
            return ownerId;
        }

        public int getSane() {
            return sane;
        }

        public int getInfected() {
            return infected;
        }

        public int getDead() {
            return dead;
        }

        public int getInfectionRate() {
            return infectionRate;
        }

        public int getContagionRate() {
            return contagionRate;
        }

        public int getLethalityRate() {
            return lethalityRate;
        }

        public int getMigrationRate() {
            return migrationRate;
        }

        public boolean isMine() {
            return getOwnerId() == playerID;
        }
    }
}

@Thrax sepertinya bot saya tidak termasuk dalam menjalankan terbaru Anda. Saya ingin tahu bagaimana hasilnya!
Penggemar teatrik

5

Triage, Jawa

import java.util.ArrayList;
import java.util.List;

public class Triage {

    int round;
    int phase;
    int playerID;

    List<State> states;
    List<State> otherStates;

    State thisState;

    public static void main(String[] args){
        new Triage().sleep(args[0].split(";"));
    }

    private void sleep(String[] args) {

        round = Integer.parseInt(args[0]);
        playerID = Integer.parseInt(args[1]);

        states = new ArrayList<>();
        otherStates = new ArrayList<>();

        for (int i = 2; i < args.length; i++){
            states.add(new State(args[i]));
        }

        for (State state : states){
            if (state.isMine()) {
                thisState = state;
            } else {
                otherStates.add(state);
            }
        }

        if (round == 50) {
          System.out.println("CCC");
          return;
        }

        String output = "";

        while( thisState.lethalityRate >= 4) {
          output += "I";
          thisState.lethalityRate -= 4;
        }

        while( thisState.lethalityRate > 0) {
          output += "V";
          thisState.lethalityRate -= 2;
          thisState.contagionRate -= 4;
          thisState.infectionRate -= 1;
        }

        while( thisState.contagionRate >= 8) {
          output += "E";
          thisState.contagionRate -= 8;
        }

        while( thisState.contagionRate > 0) {
          output += "V";
          thisState.lethalityRate -= 2;
          thisState.contagionRate -= 4;
          thisState.infectionRate -= 1;
        }

        while( thisState.infectionRate > 0) {
          output += "M";
          thisState.infectionRate -= 4;
        }

        while( output.length() < 3) {
          output += "C";
        }

        System.out.println(output.substring(0,3));

    }

    private class State {

        private final int ownerId;
        public int sane;
        public int infected;
        public int dead;
        public int infectionRate;
        public int contagionRate;
        public int lethalityRate;
        public int migrationRate;

        public State(String string) {
            String[] args = string.split("_");
            ownerId = Integer.parseInt(args[0]);
            sane = Integer.parseInt(args[1]);
            infected = Integer.parseInt(args[2]);
            dead = Integer.parseInt(args[3]);
            infectionRate = Integer.parseInt(args[4]);
            contagionRate = Integer.parseInt(args[5]);
            lethalityRate = Integer.parseInt(args[6]);
            migrationRate = Integer.parseInt(args[7]);
        }

        public int getOwnerId() {
            return ownerId;
        }

        public boolean isMine(){
            return getOwnerId() == playerID;
        }

    }

}

Pertama menjaga warganya tetap hidup, kemudian membuat mereka tidak menulari orang lain, kemudian menyembuhkan mereka.

Mooch, Jawa

import java.util.ArrayList;
import java.util.List;

public class Mooch {

    int round;
    int phase;
    int playerID;

    List<State> states;
    List<State> otherStates;

    State thisState;

    public static void main(String[] args){
        new Mooch().sleep(args[0].split(";"));
    }

    private void sleep(String[] args) {

        round = Integer.parseInt(args[0]);
        playerID = Integer.parseInt(args[1]);

        states = new ArrayList<>();
        otherStates = new ArrayList<>();

        for (int i = 2; i < args.length; i++){
            states.add(new State(args[i]));
        }

        for (State state : states){
            if (state.isMine()) {
                thisState = state;
            } else {
                otherStates.add(state);
            }
        }

        if (round == 50) {
          System.out.println("CCC");
          return;
        }

        String output = "";

        while( thisState.migrationRate < 100) {
          output += "O";
          thisState.migrationRate += 10;
        }

        while( thisState.lethalityRate >= 4) {
          output += "I";
          thisState.lethalityRate -= 4;
        }

        while( thisState.lethalityRate > 0) {
          output += "V";
          thisState.lethalityRate -= 2;
          thisState.contagionRate -= 4;
          thisState.infectionRate -= 1;
        }

        while( thisState.contagionRate >= 8) {
          output += "E";
          thisState.contagionRate -= 8;
        }

        while( thisState.contagionRate > 0) {
          output += "V";
          thisState.lethalityRate -= 2;
          thisState.contagionRate -= 4;
          thisState.infectionRate -= 1;
        }

        while( thisState.infectionRate > 0) {
          output += "M";
          thisState.infectionRate -= 4;
        }

        while( output.length() < 3) {
          output += "C";
        }

        System.out.println(output.substring(0,3));

    }

    private class State {

        private final int ownerId;
        public int sane;
        public int infected;
        public int dead;
        public int infectionRate;
        public int contagionRate;
        public int lethalityRate;
        public int migrationRate;

        public State(String string) {
            String[] args = string.split("_");
            ownerId = Integer.parseInt(args[0]);
            sane = Integer.parseInt(args[1]);
            infected = Integer.parseInt(args[2]);
            dead = Integer.parseInt(args[3]);
            infectionRate = Integer.parseInt(args[4]);
            contagionRate = Integer.parseInt(args[5]);
            lethalityRate = Integer.parseInt(args[6]);
            migrationRate = Integer.parseInt(args[7]);
        }

        public int getOwnerId() {
            return ownerId;
        }

        public boolean isMine(){
            return getOwnerId() == playerID;
        }

    }

}

Sama seperti Triage, kecuali ia memulai dengan sepenuhnya membuka perbatasannya. Hal ini memastikan populasi raksasa yang terus-menerus terinfeksi, mengganggu bot lainnya dan berpotensi berfungsi sebagai pemecah ikatan.


Triage terus menjalankan Nilai Keluarga untuk mendapatkan uangnya. Mooch, di sisi lain, terus membangun pasukan besar orang-orang sakit yang menakutkan. Sudah selesai dilakukan dengan baik!
Mwr247

Bukankah moochbot berusaha menjaga agar semua orang tidak terinfeksi? Bukankah iniState.x memodifikasi nilai Negara dan kemudian permainan mengubahnya lagi dari string memberi Anda menggandakan efek? Ide bagus pada thr CCC di babak terakhir
Eumel

Pahami kode itu sekarang dan menemukan pertanyaan kedua saya cukup bodoh
Eumel

Moochbot akhirnya mencoba untuk menciptakan populasi yang sehat, tetapi perbatasan terbuka + nol kematian memastikan bahwa populasi yang terinfeksi akan tumbuh lebih cepat.
histokrat

4

InfectedHaven, Python 3

Safehaven untuk yang terinfeksi dengan perbatasan tertutup. Berusaha untuk meminimalkan kematian. Jika diminimalkan, coba tingkatkan kematian di negara bagian lain untuk "memberi manfaat" pada orang yang terinfeksi.

# parsing code
from sys import argv
args = argv[1].split(";")

n = int(args[0])
pid = int(args[1])
dic = ["pid","healthy","infected","dead","infection","contagion","lethality","migration"]
players = []
for p in args[2:]:
    players += [{dic[i]:int(p.split("_")[i]) for i in range(len(p.split("_")))}]
    if int(p.split("_")[0]) == pid:
        me = players[-1]

# bot code

actions =""

if n == 50:
    print("CCC")
    exit()
elif n == 1:
    actions += "B"
    if me["lethality"] <= 6:
        actions += "WI"
    else:
        actions += "II"
    print(actions)
    exit()

if me["lethality"] >= 9:
    actions += "III"
elif me["lethality"] >= 3:
    actions += "WII"
else:
    actions += "WWI"
print(actions)

Modifikasi yang Anda buat akan diperhitungkan untuk proses selanjutnya. Itu masih tidak akan bersaing di run kedua, karena strategi Anda untuk membuat Safe Haven for Infected. Sangat menarik!
Thrax

2
@Thrax Lol terima kasih, ini bukan strategi. Saya hanya berpikir mereka yang terinfeksi kemungkinan akan berprasangka atau didiskriminasi oleh yang sehat, jadi dalam dunia yang kacau ini kemungkinan akan memicu pembentukan negara "untuk sesama yang terinfeksi". Sejujurnya ini adalah bot yang hanya untuk bersenang-senang, tetapi kemudian saya melihat sedikit potensi di dalamnya sehingga saya menyerah.
busukxuan

@Thrax maaf jika ini merepotkan, tapi saya baru tahu saya salah perhitungan kondisi di bagian bawah jadi saya perbarui lagi.
busukxuan

4

Persimpangan, Python2

Crossroads adalah negara yang demokratis dengan fokus pada nilai-nilai ilmiah futuristik. Seperti kebanyakan negara demokrasi, sebagian besar keputusan dibuat oleh komite yang tidak terlatih, egois, dan disfungsional, yang sering kali membuat keputusan yang sangat aneh dan miskin - yang tampaknya acak, bahkan acak. Namun, pemerintah pada akhirnya bekerja untuk kebaikan bersama rakyat dan umat manusia.

import sys
import random
import itertools
def sample_wr(population, k):
    "Chooses k random elements (with replacement) from a population"
    n = len(population)
    _random, _int = random.random, int  # speed hack
    return [population[_int(_random() * n)] for i in itertools.repeat(None, k)]
a = sys.argv[1].split(';')
round = int(a[0])
myid = a[1]
players = {}
Sane = 0
Infected = 1
Dead = 2
InfectionRate = 3
ContagionRate = 4
LethalityRate = 5
MigrationRate = 6
worldpopulation = 0
for i in range(2,len(a)):
    b = a[i].split('_')
    players[b[0]]=map(int,b[1:])
    worldpopulation += (int(b[1])+int(b[2]))*int(b[7])/100
output = ""
if round == 1:
    output="BM"
    if players[myid][Infected]>6: output+="C"
    else: output+="E"
if round == 50: 
    if players[myid][Infected] > 20: output = "CCC"
    elif players[myid][Infected]> 6: output = "CTC"
    else: output = "TTC"
if round == 48 and players[myid][Infected] > 45 and players[myid][InfectionRate]>12:
    output = "MMM"
if round == 49 and players[myid][Infected] > 30:
    output = "CCC"
if (round+1)%5==0:
    if players[myid][Sane]==0 or players[myid][Infected]/players[myid][Sane] > 2: output+="I"*(players[myid][LethalityRate]/4)
    output+="M"*(players[myid][InfectionRate]/4)
    output+="C"*max((players[myid][Infected]/10),1)
if players[myid][InfectionRate] < 8 and players[myid][ContagionRate] < 20 and players[myid][Sane]+min(players[myid][Infected]/5,60)>players[myid][Infected] and (round+2)%5==0:
    output+="C"*max((players[myid][Infected]/10),1)
    players[myid][Infected] -= min(max((players[myid][Infected]/10),1)*10,players[myid][Infected])
if players[myid][Sane] > players[myid][Infected] > 30: 
    output +="Q"
    players[myid][Infected] -= min(players[myid][Infected],30)
if players[myid][Sane] > players[myid][Infected] > 20:
    output+="CC"
    players[myid][Infected] -= min(players[myid][Infected],20)
if (players[myid][Sane] > 2*players[myid][Infected] > 20):
    output+="C"
    players[myid][Infected] -= min(players[myid][Infected],10)
if round <= 5 and players[myid][Infected] > 10:
    output+="C"
    players[myid][Infected] -= min(players[myid][Infected],10)
if 25 <= players[myid][Infected] < 40 and players[myid][InfectionRate]<10:# and players[myid][ContagionRate]*(players[myid][Infected]-20)/100 < 10:
    output+="CCC"

if players[myid][InfectionRate]-players[myid][ContagionRate]>10: output+="M"
if players[myid][ContagionRate]-players[myid][InfectionRate]>20: output+="E"
population = []
population +=["I" for i in range(int(1.15**players[myid][LethalityRate]))]
if players[myid][Sane]<10 or players[myid][Infected]-players[myid][Sane]>10: population+=["I" if players[myid][LethalityRate]>8 else "V" for i in range(players[myid][InfectionRate])]
if players[myid][Sane]+players[myid][Infected]>10 and (players[myid][Sane]>15 or players[myid][LethalityRate]<10): population += ["M" if players[myid][InfectionRate] > 6 else "V" for i in range(2*max(players[myid][InfectionRate]*players[myid][Sane]/100,int((1.15+0.002*(50-round))**min(50,players[myid][InfectionRate]))))]
if players[myid][Sane]+players[myid][Infected]>10 and (players[myid][Sane]>15 or players[myid][LethalityRate]<10): population += ["E" if players[myid][ContagionRate] > 10 else "V" for i in range(max(min(players[myid][Sane],players[myid][ContagionRate]*players[myid][Infected]/100),int(1.15**min(50,players[myid][ContagionRate]))))]
if players[myid][InfectionRate]+players[myid][ContagionRate]<15: population += ["C" for i in range(players[myid][Infected])]
if players[myid][Infected] < 10: population += ["WV" for i in range(int(1.05**round))]
output += ''.join(sample_wr(population,3))
print output[:3]

4 run yang melibatkan semua orang:

1. Crossroads (36, 12, 185)
2. InfectedTown (14, 1040, 510)
3. InfectedHaven (14, 977, 481)
4. Triage (14, 668, 531)
5. ZombieState (14, 523, 393)

1. AllOrNothing (541, 0, 312)
2. InfectedTown (30, 1125, 574)
3. InfectedHaven (30, 1020, 612)
4. WICKED (30, 732, 622)
5. Triage (30, 553, 554)
6. Mooch (30, 80, 240)
7. Crossroads (25, 0, 162)

1. AllOrNothing (846, 12, 241)
2. Crossroads (440, 15, 146)
3. FamilyValues (388, 34, 201)
4. Salt (170, 0, 176)
5. InfectedHaven (18, 1290, 664)

1. Crossroads (80, 14, 365)
2. InfectedHaven (30, 1596, 603)
3. InfectedTown (30, 1286, 576)
4. Triage (30, 1084, 412)
5. WICKED (18, 1286, 578)

4 berjalan tanpa "bot kiamat":

1. Salt (6790, 0, 58)
2. FamilyValues (6697, 7, 9)
3. Crossroads (6616, 4, 16)
4. PureBot (6454, 0, 50)
5. Piecemeal (6260, 0, 111)

1. Crossroads (6970, 0, 39)
2. PureBot (6642, 0, 77)
3. CureThenQuarantine (6350, 2, 51)
4. FamilyValues (6153, 13, 21)
5. Piecemeal (5964, 4, 132)

1. PureBot (6142, 0, 34)
2. CureThenQuarantine (6010, 4, 75)
3. Piecemeal (5971, 4, 72)
4. CullBot (5409, 8, 115)
5. Crossroads (5129, 0, 27)

1. FamilyValues (7277, 12, 26)
2. Crossroads (6544, 4, 32)
3. Salt (5830, 26, 103)
4. Piecemeal (5757, 8, 164)
5. PureBot (5657, 8, 127)

EDIT: Setelah melihat keberhasilan CullBot "mengabaikan kematian dan fokus pada menjaga kesehatan orang", saya telah meningkatkan prioritas untuk mengurangi infeksi dan penularan dan menyembuhkan lebih dari mengurangi kematian, sambil tidak meninggalkan bakat penting keputusan-oleh-komite.

EDIT2: Ternyata mengabaikan hal mematikan dengan banyak teroris di sekitar itu buruk. prioritas untuk pengurangan kematian meningkat lagi, sekarang scaling dengan tingkat kematian. Juga memperbaiki beberapa keputusan buruk lainnya, seperti membuka dan menutup perbatasan pada belokan yang sama, dan meningkatkan ambang batas untuk karantina, lebih memilih untuk menyembuhkan jika memungkinkan.

EDIT3: Beberapa penyesuaian prioritas kecil untuk menangani situasi yang tidak ditangani. Sekarang skor di dekat bagian atas apakah hari kiamat dimasukkan atau tidak, pikir Salt mengalahkannya dalam kedua kasus. Suara saya saat ini dengan Salt untuk pemenang hal ini.

EDIT4: Peningkatan waktu dan efisiensi penyembuhan.

EDIT5: Menghapus hal-hal yang mengacaukan migrasi, karena itu tidak pernah mencapai populasi nol lagi, dan beberapa kasus khusus untuk penyembuhan.

EDIT6: Meningkatkan prioritas menurunkan tingkat infeksi di awal permainan. Hapus baris komentar. Saya tidak memperbarui hasil uji coba, tetapi skor sekarang jauh lebih tinggi pada uji coba non-kiamat (mengalahkan FamilyValues, tetapi bukan TrumpBot)

EDIT7: Tutup eksponen infeksi / tingkat penularan di 50 untuk mencegah penggunaan memori tinggi.


Tunggu ... Apakah Israel meniru Yerusalem WWZ dengan tembok yang sangat tinggi?
busukxuan

@busukxuan yang menjadi inspirasi ya, kecuali bahwa Israel ini lebih menyerupai Yerusalem dalam film (cepat dibanjiri oleh yang terinfeksi), karena pada dasarnya membukanya berbatasan luas ala Mooch. Rencana awal untuk sebagian besar melakukan 'P', tetapi itu bukan strategi yang efektif.
kuintopia

Hm ... Sepertinya CullBot sayang tidak bisa bersaing lagi ketika ada lebih banyak bot yang berusaha meningkatkan infeksi.
busukxuan

itu bagus ketika saya menambahkan bot untuk menurunkan infeksi (hingga mengubah urutan keacakan)
quintopia

Jadi pada dasarnya CullBot sangat tidak stabil dan tergantung pada situasinya. Memang, saya berasumsi infeksi dapat ditahan ketika saya menulis kode. Satu-satunya fallback adalah hingga 1 karantina per giliran.
busukxuan

3

Sang Penjaga, Lua

KotH dilakukan oleh sesama froggy Perancis! Saya harus mengikuti kontes ini!

Bot ini akan melakukan apa saja yang memungkinkan untuk menjaga tingkat infeksi / penularan dan kematiannya serendah mungkin. Prioritas terbesarnya adalah memiliki angka mematikan di dekat 0. Kemudian akan mencoba menebak kapan bagus untuk mencoba "mengimpor" lebih banyak orang.

Sunting: Saya berasumsi apa yang kami dapatkan argdiurutkan berdasarkan playerId. Itu asumsi yang salah, jadi saya menambahkan semacam gelembung untuk datas.

input=arg[1]

datas={}
format={"playerID","sane","infected","dead","infection","contagion","lethality","migration"}
i=1
for s in input:gmatch("[^;]+") 
do
  j=1
  if round==nil then round=tonumber(s) 
  elseif me==nil then me=tonumber(s)+1
  else
    table.insert(datas,{})
    for r in s:gmatch("%d+")
    do
      datas[i][format[j]]=tonumber(r)
      j=j+1
    end
    i=i+1
  end
end
for i=#datas-1,1,-1
do
  for j=1,i
  do
    if datas[j].playerID>datas[j+1].playerID
    then
      datas[j],datas[j+1]=datas[j+1],datas[j]
    end
  end
end

-- First, we put ourself in a safe state
if round==1 then print("VVV")os.exit(0)end
if round==50 then print("CCC")os.exit(0)end

actions=""

-- Safety actions first
if datas[me].lethality>2 
then 
  actions=actions.."I"
  datas[me].lethality=datas[me].lethality-4>0 and datas[me].lethality-4 or 0
end

if datas[me].infected>=10
then
  if(datas[me].infection+datas[me].contagion+datas[me].lethality>4)
  then
    actions=actions.."V"
    datas[me].infection=datas[me].infection-1>0 and datas[me].infection-1 or 0
    datas[me].contagion=datas[me].contagion-4>0 and datas[me].contagion-4 or 0
    datas[me].lethality=datas[me].lethality-2>0 and datas[me].lethality-2 or 0
  end
  actions=actions.."C"
  datas[me].sane=datas[me].sane+10
  datas[me].infected=datas[me].infected-10
end

-- We can now try taking some initiatives
while #actions<3
do
  rates={}
  for i=1,#datas
  do
    if i~=me 
    then
      table.insert(rates,(datas[i].infected/datas[i].sane>0 and datas[i].sane or 0)*(datas[i].migration/100))
    end
  end
  rates["total"]=0
  for i=1,#rates
  do
    rates.total=rates.total+rates[i]
  end
  rates.total=(rates.total/#rates)*100


  if datas[me].migration<=15 and datas[me].migration+10>rates.total
  then
    actions=actions.."O"
    datas[me].migration=datas[me].migration+10>0 and datas[me].migration+10 or 0
  elseif (datas[me].sane/datas[me].infected)*100<rates.total
  then
    actions=actions.."B"
    datas[me].migration=datas[me].migration-10>0 and datas[me].migration-10 or 0
  elseif datas[me].infected>=10
  then
    actions=actions.."C"
    datas[me].infected=datas[me].infected-10
  else
    actions=actions.."V"
    datas[me].infection=datas[me].infection-1>0 and datas[me].infection-1 or 0
    datas[me].contagion=datas[me].contagion-4>0 and datas[me].contagion-4 or 0
    datas[me].lethality=datas[me].lethality-2>0 and datas[me].lethality-2 or 0
  end
end
print(actions)
os.exit(0)

@Thrax Oh .. Memperbaiki kode sumber, sekarang gunakan input=arg[1]sebagai ganti input=io.read().
Katenkyo

3

MadScienceBot, Python2

Anda tahu apa yang dibutuhkan dunia ini?

LEBIH BANYAK ILMU!

Bagaimana kita mendapatkan LEBIH BANYAK ILMU?

DENGAN BRAINZZ

Hanya menyembuhkan orang pada detik terakhir, tidak peduli tentang mereka kecuali pada putaran 50. Mencoba menjadi peternakan zombie setiap putaran lainnya

import sys, copy
import itertools

mults = {'mig_rate': -15, 'let_rate': -15, 'dead': -20, 'inf_rate': -20, 'sane': 0, 'infected': 60, 'con_rate': -30, 'id': 0}
def get_score(player_data):
    score = 0
    for k in player_data:
        score += player_data[k] * mults[k] / 100.
    return score


def add_rates(player_data):
    #Infection
    no_sane_converted = player_data["sane"]*player_data["inf_rate"]/100.
    player_data["infected"] += no_sane_converted
    player_data["sane"] -= no_sane_converted
    #Contagion
    no_sane_converted = player_data["con_rate"]
    player_data["infected"] += no_sane_converted
    player_data["sane"] -= no_sane_converted
    #Extinction
    no_killed = player_data["infected"]*player_data["let_rate"]/100.
    player_data["dead"] += no_killed
    player_data["infected"] -= no_killed

def correct(data):
    if round % 5 == 4:
        data["sane"] += int(data["sane"])/2
        data["infected"] += int(data["infected"])/2
    data["inf_rate"] += 2
    data["con_rate"] += 5
    data["let_rate"] += 5

args = sys.argv[1].split(";")
round = int(args[0])
self_id = int(args[1])
player_data = [map(int, player.split("_"))for player in args[2:]]
player_data = [dict(zip(("id", "sane", "infected", "dead", "inf_rate", "con_rate", "let_rate", "mig_rate"), player)) for player in player_data]
self_data = [player for player in player_data if player["id"] == self_id][0]

f = open("MadScienceBot.txt", "a")
f.write("\n")
f.write(`round`+"\n")
f.write("INPUT: "+`self_data`+"\n")

def m(p): p["inf_rate"] -= 4
def e(p): p["con_rate"] *= 92/100.
def i(p): p["let_rate"] -= 4
def v(p): p["inf_rate"] -= 1; p["con_rate"]-=4;p["let_rate"]-=2
def c(p): x=min(p['infected'], 10); p['infected']-=x; p['sane']+=x
def q(p): x=min(p['infected'], 30); p['infected']-=x; p['dead']+=x
def o(p): p["mig_rate"] += 10
def b(p): p["mig_rate"] -= 10

out = ""
instructions = {"M": m,
                "E": e,
                "I": i,
                "V": v,
                "C": c,
                "Q": q,
                "O": o,
                "B": b}

def run_inst(new_data, inst_id, i):
    inst = instructions[inst_id]
    if i != 2:
        inst(new_data)
        for j in new_data: new_data[j] = max(0, int(new_data[j]))
        #f.write("%s %s %s\n"%(inst_id, get_score(new_data), new_data))
    else:
        inst(new_data)
        for j in new_data: new_data[j] = max(0, int(new_data[j]))
        correct(new_data)
        add_rates(new_data)
        for j in new_data: new_data[j] = max(0, int(new_data[j]))
        #f.write("%s %s %s\n"%(inst_id, get_score(new_data), new_data))
    return new_data

def run_3_insts(self_data, insts):
    new_data = copy.copy(self_data)
    for i, inst in enumerate(insts):
        run_inst(new_data, inst, i)
    return get_score(new_data)

scores = {}
for combo in itertools.permutations(instructions.keys(), 3):
    joined = "".join(combo)
    score = run_3_insts(self_data, joined)
    scores[score] = joined
#print scores
out = scores[max(scores)]

if round == 50:
    out = "CCC"

f.write(out+"\n")
print out

3

ZombieState, Jawa

Hai, ini posting pertama saya di situs ini. Saya pada dasarnya hanya mengambil salah satu bot contoh dan mengubah garis mengenai output.

import java.util.ArrayList;
import java.util.List;

public class ZombieState {

int round;
int phase;
int playerID;
int thisTownID;

List<State> states;
List<State> otherStates;

State thisState;

public static void main(String[] args){
    new ZombieState().sleep(args[0].split(";"));
}

private void sleep(String[] args) {

    round = Integer.parseInt(args[0]);
    thisTownID = Integer.parseInt(args[1]);

    states = new ArrayList<>();
    otherStates = new ArrayList<>();

    for (int i = 2; i < args.length; i++){
        states.add(new State(args[i]));
    }

    for (State state : states){
        if (state.isMine()) {
            thisState = state;
        } else {
            otherStates.add(state);
        }
    }

    StringBuilder sb = new StringBuilder();
    if(round == 1)
        System.out.println("TTT");
    else if(round == 50)
        System.out.println("CCC");
    else
    {
        while(thisState.lethalityRate >= 4)
        {
            sb.append("I");
            thisState.lethalityRate -= 4;
        }
        sb.append("DDD");
        System.out.println(sb.toString().substring(0, 3));
    }
}

private class State {

    private final int ownerId;
    public int sane;
    public int infected;
    public int dead;
    public int infectionRate;
    public int contagionRate;
    public int lethalityRate;
    public int migrationRate;

    public State(String string) {
        String[] args = string.split("_");
        ownerId = Integer.parseInt(args[0]);
        sane = Integer.parseInt(args[1]);
        infected = Integer.parseInt(args[2]);
        dead = Integer.parseInt(args[3]);
        infectionRate = Integer.parseInt(args[4]);
        contagionRate = Integer.parseInt(args[5]);
        lethalityRate = Integer.parseInt(args[6]);
        migrationRate = Integer.parseInt(args[7]);
    }

    public int getOwnerId() {
        return ownerId;
    }

    public boolean isMine(){
        return getOwnerId() == playerID;
    }

}

}

Saya harap ini baik-baik saja dan bot melakukan cukup baik dalam menjalankan saya sendiri. Karena siapa yang butuh hidup jika Anda dapat memiliki 30 yang sehat dan jumlah maksimum yang terinfeksi pada akhirnya. Ini memulai permainan dengan 3x BioTerrorism untuk memulai semuanya dan mencoba menjaga tingkat mematikan lokal. Jika kurang dari 4 ia mencoba untuk meningkatkan tingkat infeksi dan penularan global dengan Penyebaran.


Selamat datang di PPCG :-) Semoga Anda bersenang-senang di sini
busukxuan

Sejauh ini ini sepertinya baik. Selamat datang di PPCG, dan kerja bagus!
Rɪᴋᴇʀ

2

DisseminationBot, Ruby

Bot ini akan Sembuh selama 10 atau lebih yang tersisa untuk disembuhkan. Selanjutnya, jika tingkat infeksi minimal 4, bot akan menguranginya. Semua tindakan lain dihabiskan untuk meningkatkan tingkat penularan, yang tidak akan menyakiti saya, karena saya tidak memiliki infeksi yang tersisa.

#You can copy this code if you want. Not specific to my strategy.
PlayerId = 0
Sane = 1
Infected = 2
Dead = 3
InfectionRate = 4
ContagionRate = 5
LethalityRate = 6
MigrationRate = 7

a = ARGV[0].split ';'
round = a.shift.to_i
my_id = a.shift.to_i
players = a.map{|s|s.split('_').map{|str| str.to_i}}

my_index = players.index{|p|
    p[PlayerId] == my_id
}
me = players[my_index]

#strategy specific code starts here.

commands = ""
commands += 'C' if me[Infected] >= 10
commands += 'C' if me[Infected] >= 20
commands += 'C' if me[Infected] >= 30
commands += 'M' if me[InfectionRate] >= 4 and commands.length < 3
commands += 'D' while commands.length < 3

print commands
$stdout.flush

2

XenoBot (Node.js)

XenoBot takut pada orang, solusinya terhadap epidemi adalah dengan mengisolasi populasinya, menyembuhkan orang-orang yang dia bisa, dan mengisolasi mereka ketika dia tidak bisa. Dia tidak peduli dengan semua omong kosong peperangan ini, dia hanya berusaha untuk menjaga rakyatnya tetap hidup.

Aktifkan XenoBot seperti itu:

node xenobot.js [data]

Kode:

const argv = String(process.argv),
    data = argv.split(";"),
    round = data[0],
    id = Number(data[1]),
    info = data[id + 1].split("_"),
    sane = info[1],
    infected = info[2],
    dead = info[3],
    infectionRate = info[4],
    contagionRate = info[5],
    lethalityRate = info[6],
    migrationRate = info[7]

var moves = 3
function exec(a) {
  process.stdout.write(a)
}
if(migrationRate >= 10) {
  exec("B")
}
if (infectionRate >= 8) {
  exec("MQ")
  moves-=2;
} else if(contagionRate >= 16) {
  exec("EC")
  moves-=2;
} else if(lethalityRate >= 8) {
  exec("IV")
  moves--;
} else {
  exec("B");
  moves--;
}

if (sane / 3 > infected + dead) {
  exec("Q")
  moves--;
}
if(moves > 0) {
  exec("B")
}

2

Ahli strategi, Python

Bot ini benar - benar serius untuk bertahan hidup. Dia menganalisis strategi yang mungkin, dan menghasilkan metode kemenangannya sendiri. Yang sekarang akan dia dokumentasikan dalam komentar sumber, karena dia pria yang baik dan ingin orang lain bertahan hidup juga.

Dipanggil dengan python strategist.py.

import sys
import random
import math


def main():
    id = int(get_player_id(sys.argv[1]))
    stats = get_player_stats(sys.argv[1], id)
    round = int(get_round(sys.argv[1]))

    if id == -1 or stats == None or round == -1:
        # Something is wrong here. RED ALERT! Close all possible entry routes and set 
        # quarantine levels to maximum!
        print("BQQ")
        sys.exit(1)

    if round == 1:
        # remove migration, cure some infected, and remove some danger
        print("BCM")
    elif round % 5 == 4:
        # Rounds 4, 9, 14 etc. One before repopulation. We want as many Healthy and as 
        # few Infected as possible to reproduce. Prioritise curing infected, because that
        # maximises Healthy for reproduction. If that's not possible, quarantine them.
        quarantine = math.ceil(int(stats['infected']) / 30)
        cure = math.ceil(int(stats['infected']) / 10)
        if cure <= 3:
            # we can deal with all our infections within 3 cures
            output = "C" * cure
            for i in range(3 - cure):
                # got moves left? Great, remove some danger.
                output += get_random_science()
            print(output)
        elif quarantine <= 3:
            # we can deal with all our infections within 3 quarantines
            output = "Q" * quarantine
            for i in range(3 - quarantine):
                # got moves left? Great, remove some danger.
                output += get_random_science()
            print(output)
        else:
            # We can't deal with all the infected in one round, so deal with some. Yes, we
            # don't get rid of as many as we could here, but we're about to reproduce so
            # we want Healthies in the next round.
            print("QQC")
    else:
        output = ""
        if int(stats['infected']) <= 10:
            # we can deal with all our infections by curing them
            output += "C"
        elif int(stats['infected']) <= 30:
            # we can deal with all our infections by quarantining them
            output += "Q"
        elif int(stats['infected']) >= int(stats['healthy']) * 0.5:
            # we're getting overrun with infected people, get rid of some
            output = "QCC"

        for i in range(3 - len(output)):
            # if we haven't used all our moves, we can remove some danger factors
            output += get_random_science()

        print(output)


def get_random_science():
    return random.choice(["M", "E", "I", "V"])


def get_player_id(args):
    splat = args.split(";")
    return splat[1] if len(splat) >= 2 else -1


def get_player_stats(args, id):
    splat = args.split(";")
    players_data = [x for x in splat if "_" in x]
    my_data = [y for y in players_data if y.split("_")[0] == str(id)]
    data_splat = my_data[0].split("_")

    if len(data_splat) == 8:
        # Id, Healthy, Infected, Dead, InfRate, ConfRate, LethRate, MigRate
        return {
            'healthy': data_splat[1],
            'infected': data_splat[2],
            'dead': data_splat[3],
            'inf_rate': data_splat[4],
            'conf_rate': data_splat[5],
            'leth_rate': data_splat[6],
            'mig_rate': data_splat[7]
        }
    else:
        return None


def get_round(args):
    splat = args.split(";")
    return splat[0] if len(splat) >= 1 else -1


if __name__ == "__main__":
    main()

2

OpenAndClose

Mulai permainan dengan membuka perbatasan, lalu biarkan semua yang sakit datang. Setelah kami memiliki populasi sakit yang besar (ronde 30), tutup perbatasan dan upayakan untuk menyembuhkan yang sakit.

#You can copy this code if you want. Not specific to my strategy.
PlayerId = 0
Healthy = 1
Infected = 2
Dead = 3
InfectionRate = 4
ContagionRate = 5
LethalityRate = 6
MigrationRate = 7

a = ARGV[0].split ';'
round = a.shift.to_i
my_id = a.shift.to_i
players = a.map{|s|s.split('_').map{|str| str.to_i}}

my_index = players.index{|p|
    p[PlayerId] == my_id
}
me = players[my_index]

#strategy specific code starts here.

commands = ""
if round < 30
  commands += me[MigrationRate] == 100 ? (me[InfectionRate] <= 1 ? "V" : "M") : "O"
  commands += me[LethalityRate] <= 2 ? "V" : "I"
  commands += me[ContagionRate] <= 4 ? "V" : "E"
elsif round < 50
  commands += me[MigrationRate] == 0 ? "V" : "B"
  commands += me[LethalityRate] < 20 ? "C" : "I"
  commands += me[ContagionRate] <  5 ? "C" : "E"
else
  commands = "CCC"
end

print commands
$stdout.flush

2

Dua bot Python lagi

Israel

Ini mirip dengan Mooch, tapi mungkin tidak sebagus Mooch, kecuali dalam kesempatan langka ketika itu jauh lebih baik:

import sys
a = sys.argv[1].split(';')
round = int(a[0])
myid = a[1]
players = {}
Sane = 0
Infected = 1
Dead = 2
InfectionRate = 3
ContagionRate = 4
LethalityRate = 5
MigrationRate = 6
for i in range(2,len(a)):
    b = a[i].split('_')
    players[b[0]]=map(int,b[1:])
output=''
if round<=4:output = ["OOO","OOO","OOO","OII"][round-1]
if round==50: output = "CCC"
mycontrate = players[myid][ContagionRate]
myfatrate = players[myid][LethalityRate]
myinfrate = players[myid][InfectionRate]
if myinfrate+mycontrate<5:
    output+="V"
    myfatrate-=2
    if round < 47: 
        output+="I"*(myfatrate/4)
        if myfatrate%4: output+="V"
else:
    if round < 47: 
        output+="I"*(myfatrate/4)
        if myfatrate%4: output+="V"
    output+="M"*(myinfrate/4)
    if round < 47: 
        output+="E"*(mycontrate/4)
output+="CCC"

print output[:3]

Palang Merah

Semacam suka damai, kecuali mencoba juga untuk menjaga agar bangsanya sendiri tidak mati. Gagal menyedihkan dalam hal ini, tetapi senang memiliki persahabatan lainnya di lapangan bermain.

import sys
a = sys.argv[1].split(';')
round = int(a[0])
myid = a[1]
players = {}
Sane = 0
Infected = 1
Dead = 2
InfectionRate = 3
ContagionRate = 4
LethalityRate = 5
MigrationRate = 6
for i in range(2,len(a)):
    b = a[i].split('_')
    players[b[0]]=map(int,b[1:])
output="PPPPP"
if round<=4:output = ["OOO","OOO","OOO","OII"][round-1]
elif round==50: output = "CCC"
else: output = output[:2-3*round%5]+"I"+output[2-3*round%5:]
print output[:3]

2

Smaug (Python)

Saya api; Saya mati.

Smaug menciptakan kematian sebanyak mungkin, terlepas dari di mana itu terjadi.

# "I am fire, I am death"
# Smaug has two goals: hoard gold and bring death...
#    and this world seems to be all out of gold

from sys import argv
args = argv[1].split(";")

round = int(args.pop(0))
me = int(args.pop(0))

if round==50: # can't cause more death on the last round, might as well infect
    print('TTT')

def predict_infected(infected, infection_rate, contagion_rate):
    i = infected + infection_rate
    return i + int(i*contagion_rate)

def predict_dead(infected, lethality_rate):
    return int(infected*lethality_rate)

strategies = {'WWW':0, 'WWD':0, 'WDD':0, 'DDD':0}
for player in args:
    player=player.split('_')
    healthy=int(player[1])
    infected=int(player[2])
    infection_rate=int(player[4])
    contagion_rate=int(player[5])/100.
    lethality_rate=int(player[6])/100.

    if round%5==0:
        healthy+=healthy/2
        infected+=infected/2

    pi_old = predict_infected(infected, infection_rate, contagion_rate)
    pd_old = predict_dead(pi_old, lethality_rate)

    for strat in strategies:
        ir_new = infection_rate + 3
        lr_new = lethality_rate + (strat.count('W')*.02) 
        cr_new = contagion_rate + (strat.count('D')*.02) 

        pi_new = predict_infected(infected, ir_new, cr_new)
        pd_new = predict_dead(pi_new, lr_new)

        increase = pd_new - pd_old

        strategies[strat]+=increase

print max(strategies, key=strategies.get)

Jika Anda mencoba membuat poliglot golf, file kosong akan lebih pendek dan melakukan persis apa yang pengamat lakukan (dan juga, seperti yang terjadi, persis apa yang dilakukan PassiveBot - keduanya berperilaku identik), karena penerjemah mengganti NNN dengan 0 tanggapan panjang.
kuintopia

@quintopia yang tidak saya coba, baru sadar ketika saya mengetiknya bahwa itu berfungsi dengan baik sebagai polyglot, tapi saya tidak menyadari apa yang dilakukan PassiveBot, jadi saya hanya akan menghapus Watcher (tidak ada gunanya memiliki dua yang identik)
SnoringFrog

2

Hapus Terinfeksi (Python)

Meskipun semua logika acak, aku cukup itu jarang ini untuk kembali apa-apa tapi Q dan C (langkah-langkah pencegahan tidak pernah yang membantu). Baiklah. Mungkin meminjamnya untuk bot lain, tetapi membiarkannya kalau-kalau itu membantu.

# Remove as many of it's own infected as possible, preferably by curing, but quarantining if it's getting out of hand
# If not very many can be cured, takes preventative measures (B,E,M, or V)

from sys import argv

CMDS=3
C_RATE=10
E_RATE=.08
M_RATE=4
Q_RATE=30
V_RATE=(1,.04)

def find_me(args):
    for player in args:
        player=player.split('_')
        if int(player[0])==me:
            return player

def actions_available():
    global actions
    if len(actions) < CMDS:
        return True
    else:
        return False

def add_actions(new_actions):
    global actions
    actions = (actions + new_actions)[0:CMDS]

def get_remaining_infected(local_infected):
    global actions
    return local_infected - (Q_RATE*actions.count('Q')) - (C_RATE*actions.count('C'))

def too_many_infected(local_infected):
    max_infected = C_RATE*(CMDS+1) # If we can get down to 10 or less without quarantining, that's good
    if local_infected > max_infected:
        return True
    else: return False

def projection(infection_rate, remaining_infected, action):
    additional_M=0
    additional_E=0
    additional_V=0

    if action == "M":
        additional_M=1
    elif action == "E":
        additional_E=1
    else:
        additional_V=1

    M_level = M_RATE*(actions.count('M')+additional_M)
    E_level = E_RATE*(actions.count('E')+additional_E)
    V_level = (V_RATE[0]*(actions.count('V')+additional_V), V_RATE[1]*(actions.count('V')+additional_V))

    projection = infection_rate - M_level - V_level[0] + (remaining_infected * (contagion_rate - E_level - V_level[1])) 
    return int(projection)

def get_best_action(local_infected):
    global actions
    remaining_infected = get_remaining_infected(local_infected)

    # If we can leave no infected, do so
    if remaining_infected <= C_RATE and remaining_infected >= 0:
        return 'C'

    strategies = {'M':0, 'E':0, 'V':0,'C':min(remaining_infected,C_RATE)}

    pni = int(infection_rate + (remaining_infected*contagion_rate)) # predicted new infected
    strategies['M'] = pni - projection(infection_rate, remaining_infected, 'M')
    strategies['E'] = pni - projection(infection_rate, remaining_infected, 'E')
    strategies['V'] = pni - projection(infection_rate, remaining_infected, 'V')
    # any benefit to including P as an option? 

    #print(strategies)
    max_saved = 'C'
    for strat,saved in strategies.iteritems():
        if saved > strategies[max_saved]:
            max_saved=strat
        elif saved == strategies[max_saved]:
            #prioritize V because of it's extra benefit of reducind lethality_rate
            max_saved=max(strat,max_saved) 

    if strategies[max_saved] <= C_RATE/2:
        # can't save that many, just close borders instead
        selected_action = 'B'
    else: selected_action = max_saved
    return selected_action


args = argv[1].split(";")
round = int(args.pop(0))
me = int(args.pop(0))
actions = ""

my_town = find_me(args)

local_infected = int(my_town[2])
infection_rate = int(my_town[4])
contagion_rate = int(my_town[5])/100.

if round!=50 and too_many_infected(local_infected):
    # Things are getting out of hand, quarantine and consider preventative measures
    actions = ('Q'*(local_infected/Q_RATE))[0:CMDS]

    while actions_available():
        add_actions(get_best_action(local_infected))
else: actions='CCC'

print ''.join(sorted(actions)) # always cure first

@Thrax Bot ini telah diperbarui
SnoringFrog

2

CureThenQuarantine, Java

Negara telah mengeluarkan kebijakan untuk menyembuhkan mereka yang beruntung dan kemudian mengkarantina sisa orang yang terinfeksi. Setelah populasi yang terinfeksi berkurang maka fokuslah untuk mengurangi tarif lokal dan kemudian membantu mengurangi tarif global.

Perbatasan ditutup untuk memastikan tidak ada migrasi yang terinfeksi ke negara.

Saya hanya menguji bot terhadap bot java dan python ... tampaknya tahan terhadap mereka. Tampaknya juga bot saya berperilaku mirip dengan CullBot.

public class CureThenQuarantine {
    static int playerID;

    public static void main(String[] args)
    {
        State thisState=null;

        args = args[0].split(";");

        // Parse arguments
        int round = Integer.parseInt(args[0]);
        playerID = Integer.parseInt(args[1]);

        for (int i = 2; i < args.length; i++){
            thisState = new State(args[i]);
            if(thisState.isMine()){
                break;
            }
        }

        String action="";
        if(round == 1) action = "B"; // ensure no migration.
        else if (round == 50 ) action ="CCC"; // not much else we can do so just cure some people.

        // Highest Priority to Curing and then Quarantining infected, but do not perform either action if it would be wasteful.
        if (thisState.infected>9)
        {
            if (thisState.infected<19) action+="C";
            else if (thisState.infected<29) action+="CC";
            else if (thisState.infected<39) action+="CCC";
            else if (thisState.infected<49) action+="CQ";
            else if (thisState.infected<59) action+="CCQ";
            else if (thisState.infected<79) action+="CQQ";
            else action+="QQQ";
        }

        // Next priority is to reduce infection rate
        if (thisState.infectionRate>8) action+="MMM";
        else if (thisState.infectionRate>4) action+="MM";
        else if (thisState.infectionRate>1) action+="M";
        else if (thisState.infectionRate>0) action+="V";

        // then reduce contagion rate
        if (thisState.contagionRate>16) action+="EEE";
        else if (thisState.contagionRate>8) action+="EE";
        else if (thisState.contagionRate>1) action+="E";
        else if (thisState.contagionRate>0) action+="V";

        // and least priority is lethality rate... since we are only going to quarantine infected persons anyway.
        if (thisState.lethalityRate>8) action+="III";
        else if (thisState.lethalityRate>4) action+="II";
        else if (thisState.lethalityRate>1) action+="I";
        else if (thisState.lethalityRate>0) action+="V";

        // and if we have managed to clean up our state then we help others states.
        action+="PPP";

        System.out.println(action.substring(0,3));
    }

    static private class State {
        public int ownerId;
        public int lethalityRate;
        public int healthy;
        public int infected;
        public int infectionRate;
        public int contagionRate;

        public State(String string) {
            String[] args = string.split("_");
            ownerId = Integer.parseInt(args[0]);
            healthy = Integer.parseInt(args[1]);
            infected = Integer.parseInt(args[2]);
            infectionRate = Integer.parseInt(args[4]);
            contagionRate = Integer.parseInt(args[5]);
            lethalityRate = Integer.parseInt(args[6]);
        }

        public boolean isMine(){
            return ownerId == playerID;
        }
        public String toString()
        {
            return "H: "+healthy+" I: "+infected+" IR: "+infectionRate+" LR: "+lethalityRate+" CR: "+contagionRate;
        }
    }
}

2

Peneliti, Jawa

Bot ini berfokus pada penelitian. Jika jumlah yang terinfeksi di bawah 15, ia mencoba untuk menyembuhkan mereka. Jika lebih tinggi dari itu, ia memilih solusi yang lebih efektif .

public class Researcher {
    public static void main(String[] args){
        String[] args1 = args[0].split(";");
        int id = Integer.parseInt(args1[1]);
        for (int i = 2; i < args1.length; ++ i) {
            String[] args2 = args1[i].split("_");
            if (Integer.parseInt(args2[0]) == id) {
                int infected = Integer.parseInt(args2[2]);
                if (infected == 0) {
                    System.out.println("MEI");
                } else if(infected < 15) {
                    System.out.println("MEC");
                } else {
                    System.out.println("MEQ");
                }
            }
        }
    }
}

1
Bahasa Jawa, saya kira ??
kucing

2

Sedikit demi sedikit, Jawa

Berdasarkan bot saya sebelumnya (CureThenQuarantine), saya telah menemukan bahwa dengan bot agresif dalam permainan, tidak perlu karantina karena yang terinfeksi akan mati dengan sangat cepat, sehingga bot ini akan secara oportunistik menyembuhkan 10 yang terinfeksi setiap belokan (baik yang datang dari migrasi atau dari infeksi dari populasi sehat). Kemudian akan menggunakan tindakan yang tersisa untuk memastikan populasi yang sehat tetap sehat dengan mengandalkan kelahiran untuk meningkatkan populasi yang sehat.

Perbatasan ditutup untuk memastikan tidak ada migrasi yang terinfeksi ke negara.

public class Piecemeal{
    static int playerID;

    public static void main(String[] args)
    {
        State thisState=null;

        args = args[0].split(";");

        // Parse arguments
        int round = Integer.parseInt(args[0]);
        playerID = Integer.parseInt(args[1]);

        for (int i = 2; i < args.length; i++){
            thisState = new State(args[i]);
            if(thisState.isMine()){
                break;
            }
        }

        String action="";
        if(round == 1) action = "B"; // ensure no migration.
        else if (round == 50 ) action ="CCC"; // not much else we can do so just cure some people.

        // Highest Priority to Curing up to ten infected if there are any.
        if (thisState.infected>0)
        {
            action+="C";
        }

        // Next priority is to reduce infection rate
        if (thisState.infectionRate>8) action+="MMM";
        else if (thisState.infectionRate>4) action+="MM";
        else if (thisState.infectionRate>1) action+="M";
        else if (thisState.infectionRate>0) action+="V";

        // then reduce contagion rate
        if (thisState.contagionRate>16) action+="EEE";
        else if (thisState.contagionRate>8) action+="EE";
        else if (thisState.contagionRate>1) action+="E";
        else if (thisState.contagionRate>0) action+="V";

        // and least priority is lethality rate... since we are only going to quarantine infected persons anyway.
        if (thisState.lethalityRate>8) action+="III";
        else if (thisState.lethalityRate>4) action+="II";
        else if (thisState.lethalityRate>1) action+="I";
        else if (thisState.lethalityRate>0) action+="V";

        // and if we have managed to clean up our state then we help others states.
        action+="PPP";

        System.out.println(action.substring(0,3));
    }

    static private class State {
        public int ownerId;
        public int lethalityRate;
        public int healthy;
        public int infected;
        public int infectionRate;
        public int contagionRate;

        public State(String string) {
            String[] args = string.split("_");
            ownerId = Integer.parseInt(args[0]);
            healthy = Integer.parseInt(args[1]);
            infected = Integer.parseInt(args[2]);
            infectionRate = Integer.parseInt(args[4]);
            contagionRate = Integer.parseInt(args[5]);
            lethalityRate = Integer.parseInt(args[6]);
        }

        public boolean isMine(){
            return ownerId == playerID;
        }
        public String toString()
        {
            return "H: "+healthy+" I: "+infected+" IR: "+infectionRate+" LR: "+lethalityRate+" CR: "+contagionRate;
        }
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.