KOTH: Dünya çapında bir salgın


82

Nihai sonuçlar burada!

Giriş

2042'de dünya aşırı nüfus oldu. Küreselleşme, aşırı kalabalıklaşma, yeni yaşam tarzları ve küresel bir hijyen eksikliği yeni bir salgının yayılmasına neden oldu. Bu zor zamanlarda devlet liderlerinin durumu yönetmesi gerekiyor. Nüfusunuzun yok edilmesine izin veremezsiniz, ama belki komşularınızın ölmesine izin vererek fayda sağlayabilirsiniz ...

Sözlük

Sağlıklı : İnsanlar enfekte olmayan
enfekte : pandemik ölebilir İnsanlar
Ölü : Vücut (sadece çizikler), belirli bir etkiye saymak
Enfeksiyon Oranı : sayısı Sağlıklı olacak Enfekte her çevirmek
Bulaşıcılık Oranı : Yüzde Enfekte dönüştürür Sağlıklı üzere Enfekte her açmak
ölümcüllüğü Oranı : Yüzde Enfekte her ölecek çevirmek
Göç Hızı hem yüzdesi: Sağlıklı ve Enfekte göç edeceğini / her çevirmek göç
Yerel: Sadece devletini etkiler
Küresel : Her devleti etkiler

Prensip

Her oyuncu 100 kişiden başlayarak bir kasabayı yönetecek . Ne yazık ki, bunların arasında bir Etkilenen var .

Oyun sıra tabanlı. Bir dönüş , sonuncusu etkileşimli olan (komut için bot isteyen) yedi aşamadan oluşur . Her sırayla oyuncuların sırası rastgele seçilir. Bir sonraki aşama, önceki aşama her şehir tarafından gerçekleştirildiğinde başlar (1. Tur: 1. Oyuncu, 2. Oyuncu, 3. Oyuncu ...; 2. Dönüş: 3. Oyuncu, 2. Oyuncu, 1. Oyuncu ...):

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

Denetleyici size komut argümanları üzerinden giriş sağlar ve programınızın stdout üzerinden çıkması gerekir.

Sözdizimi

Giriş

Programınız her çağrıldığında, bu biçimde argümanlar alacak:

Round;YourPlayerId;PlayerId_Healthy_Infected_Dead_InfectionRate_ContagionRate_LethalityRate_MigrationRate;PlayerId_Healthy_Infected_Dead_InfectionRate_ContagionRate_LethalityRate_MigrationRate;...

Tur 1 indekslidir.

Örnek giriş

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

Burada 6. tur olduğunu ve 2. oyuncu olduğunu görüyorsunuz. 20 sağlıklı, 53 enfekte, 62 ölü,% 16 enfeksiyon oranı,% 20 bulaşıcılık oranına,% 35 ölüm oranına ve% 5'lik bir göç oranına sahipsin.

Çıktı

Her biri bu dönüşü gerçekleştireceğiniz bir eyleme karşılık gelen üç karakter (boşluksuz, ayırıcı yok) çıkarmanız gerekir. Karakterlerin sırası eylemlerin sırasını belirler. Aynı eylemleri birden çok kez çıkarabilirsiniz.

N: Fazlası N othing
M: Araştırma M icrobiology [Etkileri: Yerel azaltmak enfeksiyon oranı % 4]
E: Araştırma e pidemiology [Etkileri: Yerel azaltmak bulaşma Puan % 8]
I: Araştırma I mmunology [Etkileri: Yerel azaltmak Lethality Puan % 4]
V: Araştırma V accination [Etkileri: yerel azaltmak enfeksiyon oranı lokal azaltmak, tek Bulaşma Puan yerel azaltmak,% 4 Lethality Puan % 2]
C: ver ure [Effects: 10 dönüştürme yerel Enfekte için sağlıklı ]
Q: S uarantine [Etkileri: 30 yerel çıkarmak Enfekte ]
O: O kalem Sınırı [Etkileri: Yerel artırmak Geçiş Puan % 10]
B: Yakın B kararı [Etkileri: Yerel azaltır Geçiş Puan % 10]
T: Biyo T errorism [Etkileri: 4 dönüştürme küresel Sağlıklı için Enfekte ]
W: W eaponization [Etkileri: genel artış enfeksiyon oranı genel artış, 1 ile Lethality Puan ]% 2
D: D issemination [Etkileri: Artırma küresel enfeksiyon oranı1 oranında, küresel Bulaşma Oranını % 2 artırın ]
P: P acification [Etkileri: Küresel Enfeksiyon Oranını 1 azalt, küresel Bulaşma Oranını % 1 azalt, küresel Ölüm Oranını % 1 azalt ]

Oynanış

Tüm aşamalar

Geçersiz komut = Hiçbirşey
Yüzde, tamsayılar gibi eklenir, yani% 10 -% 4 =% 6. Yüzde bir formülde uygulandığında sonuç döşenir.

Faz 1: Mutasyon

Pandemi daha güçlü hale geliyor. Her turda, rastgele bu özelliklerden birini kazanır (bu mutasyon aynı anda tüm oyuncuları etkiler):

  • Küresel Enfeksiyon Oranını 2 arttırın
  • Küresel Bulaşma Oranını % 5 Artırmak
  • Küresel Ölüm Oranını % 5 Artırmak

2. Aşama: Üreme

Her beş turda (5., 10., 15. ...), yeni vatandaşlar doğacak. Her çifti Sağlıklı bir hale getirecek Sağlıklı (23 Sağlıklı 11 yeni oluşturmak Sağlıklı ). Her çift Enfekte bir hale getirecektir Enfekte .

Faz 3: Göç

Her turda, bir Sağlıklı ve Enfekte yüzdesi, Göç Oranlarına bağlı olarak eyaletler bırakacaktır (10 Sağlıklı , % 100 Sağlıklı ve% 10 Göç Oranı ile bir devlet bırakacaktır ). Ardından, göçmenler, Göç Oranına bağlı olarak bir kez daha, her eyalet arasında dağıtılacaklar . (Her bir devletin oranları ağırlıklı ve göçmenler de buna göre dağıtılıyor).

Faz 4: Enfeksiyon

Her bir durumun sağlıklılığı , Enfeksiyon Oranına göre Enfekte'ye dönüştürülür .

Aşama 5: Bulaşma

Her devletin sağlıklı bulaşıcılık oranına göre, enfekte dönüştürülür . Sayı çarpılarak hesaplanır Enfekte tarafından Bulaşma Oranı .

Aşama 6: Soyu tükenme

Enfekte dönüştürülen Ölü göre Ölümcüllüğü Oranı . Sayı çarpılarak hesaplanır Enfekte tarafından öldürülücüğü Oranı .

Aşama 7: Oyuncular sırayla

Her oyuncu girdi alır ve çıktı sırasına göre gerçekleştirilen üç eylemi gerçekleştirmelidir.

kurallar

  • Botlar, belirli diğer botları yenmek veya desteklemek için yazılmamalıdır.
  • Dosyalara yazma izin verilir. Lütfen "yoursubmissionname.txt" yazınız, oyun başlamadan önce klasör boşaltılacaktır. Diğer dış kaynaklara izin verilmez.
  • Gönderinizin yanıt vermesi için bir saniye var (şehir başına).
  • Gönderilerinizi derlemek ve çalıştırmak için komutlar verin.

Kazanan

Kazanan 50 turdan sonra en Sağlıklı olanıdır . Bir oyuncu canlı kalan son oyuncu ise (0'dan fazla Sağlıklı veya Enfekte ) oyun durur ve kazanır. Eğer birden fazla oyuncu aynı miktarda Sağlıklı'ya sahipse, En Çok Etkilenenler kazanır, o zaman daha az Ölü olanlar kazanır .

kontrolör

Kontrol cihazını GitHub'da bulabilirsiniz . Ayrıca, Java ile yazılmış üç örnekleme çubuğu içerir.
Çalışmasını sağlamak için projeyi inceleyin ve Java IDE'nizde açın. mainSınıf yöntemindeki giriş noktası Game. Java 8 gerekli.

Bot eklemek için önce ya Java (.class dosyaları) için derlenmiş versiyona ya da yorumlanmış dillerin kaynaklarına ihtiyacınız var. Bunları projenin kök klasörüne yerleştirin. Ardından, playerspakette yeni bir Java sınıfı oluşturun (zaten var olan botlardan örnek alabilirsiniz). Bu sınıf Player, yöntemi geçersiz kılmak için uygulamalıdır String getCmd(). Dönen String, botlarınızı çalıştırmak için shell komutudur. Örneğin bu komutla Ruby bot iş yapabilirsiniz: return "C:\Ruby\bin\ruby.exe MyBot.rb";. Son olarak, botu sınıfın playersen üstündeki diziye ekleyin Game.

Son Sonuçlar (2016-03-04 08:22 GMT)

Global (100 itibar):

100 maç sonucu: 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)

Kıyametsiz (200 itibar):

100 maç sonucu: 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)

Katılımınız için herkese teşekkür ederim. Umarım, oyunumda olduğum gibi botlarınızı tasarlarken ve kodlarken çok iyi zaman geçirmişsinizdir.


9
X'in virüslü miktarını öldüren bir E xecute komutu alabilir miyiz ? Muhtemelen kazanmanın uygun bir yöntemi değil, meşru görünen bir eylem. Karantina'nın yaptığı bu olmadığı sürece (belirsizdir).
Draco18

3
Hızlı gramer notu: "Sane", "zihinsel olarak kararlı" anlamına gelir; Burada aradığınız kelime (muhtemelen) "sağlıklı" dır. (İlk dilinizin İspanyolca olduğunu, "sano" nun "sağlıklı" anlamına geldiğini veya yakından ilgili bir şey olduğunu tahmin etmekte haklı olur muyum?)
Mason Wheeler

5
@MasonWheeler nitpicking terminoloji not:;) hiçbir gramer dahil oldu Olarak notu bir terminoloji veya kelime notu oldu
Jan

3
@Thrax Dönüşler şu anda ele alınır (başlangıçta rastgele, o andan itibaren aynı sıra ile), sırayla daha sonra gelen oyunculara, sonuçta çılgınca değişken bir sonuç veren büyük bir avantaj sağlar. Belki de 1) her turdaki tur sırasını rastgele seçtiyseniz veya 2) turdaki herkesin aynı durumu görmesini sağlayın ve değişiklikleri turun sonunda aynı anda herkese uygularsanız, o zaman sonuçlar daha dengeli olabilir ve Gönderimin kalitesi hakkında daha fazla bilgi. İlk seçeneği test ettim ve sonuçlar çok daha tutarlı.
Mwr247

7
@Thrax Şu anda basitçe "dünyayı yok etmek" için var olan botların fazlalığı var. Bu eğlenceli bir meydan okuma olsa da, aslında rekabet etmeye çalışan botların artık etkin bir şekilde karşı koyamayacağı bir noktada bulunuyor ve kazananlar olarak "Cure X3" e programlanmış ne varsa bıraktık. KOTH için göz önünde bulundurulması için, botların en azından PassiveBot'a karşı bire bir eşleşmede en azından olumlu “aklı başında” bulunabilmesi gereken bir kural değişikliği önermek isterim. Stratejiler gerçekten etkili olduğunda meydan okuma daha eğlencelidir.
Mwr247

Yanıtlar:


12

Aile Değerleri, Düğüm (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(''));

Aile Değerleri, kendini korumaya ve savunmaya odaklanır ve yalnızca bu amaçla eylemler gerçekleştirir. Alınacak en iyi hareket tarzını belirlemek için bir puan değer sistemi kullanır ve ardından bir sonraki önceliği daha iyi belirlemek için kendi durum değerlerini ayarlar. Beraberlik durumunda, rastgele en iyi seçenekler arasından seçim yapar.

EDIT: Şimdiye kadar iyi yapıyor gibi görünüyor:

    ********** 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)

Pacifist, Düğüm

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

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

Öldürme ve ölüme bu kadar odaklanan Pacifist, güçlü küresel sağlığın güçlü yerel sağlık anlamına geldiğine inanıyor. Bu nedenle, hemen hemen sadece küresel hastalığın azaltılmasına odaklanırken, iyiliğin yayılmasına izin vermek için sınırları kısmen açık bırakmaya odaklanırlar.


Vay canına, TheCure'un son olmasını beklemiyordum
Ocak'taki

Adalet Bu kadar çok oyuncuyla, hepsi tahtalarda çok dolaşıyor: TheCure 3. sırada sona erdi. Hem FamilyValues ​​hem de Triage, neredeyse her zaman ilk iki sırada yer almaktadır, FV çoğu zaman 1 numaradır.
Mwr247

Hmm, görevin kendisi deterministik, değil mi? Bu yüzden bazı oyuncuların algoritmalarına rastgelelik katmaları nedeniyle mi?
justhalf

Adalet Şimdiye kadarki en büyük faktör rastgele sırayla dönüş sırası gibi görünüyor (ancak bir oyunda her tur için aynı). Birinciye gitmek, şu anki sırasındaki herkesin hareketlerine tepki verme şansınız olmadığı anlamına gelirken, en sonuncusu diğer oyuncuların size yaptıklarını en iyi şekilde ayarlamanıza izin verir.
Mwr247

1
Her şey için tur sırasını randomize eden değiştirilmiş bir kontrol cihazını test ettim ve sonuçlar şimdi çok daha tutarlı.
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());
}

Sadece 2 ya da daha az olmadıkça, virüs bulaşanları tedavi ederek Amerika'yı harika yapar; azınlıklar göz ardı edilecektir.

Daha az enfeksiyon olması ilacı daha ucuz hale getirir.

Göçmen yok - sadece enfeksiyon getiriyorlar.

Yapacak bir şey kalmadıysa, diğer oyuncuları bombala.

Amerikan yöntemine verilen emir tersine döndü, bombalar önce insanları iyileştirdi.

Düzenleme: virüs bulaşmasından sonra virüs bulaşmış sayının düşmemesi nedeniyle istenmeyen postaları tedavi edecek bir hatayı düzeltti.

Trumpscript

J Atkin'e sağladığı için teşekkürler:

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))

Tarafından davet edildi Rscript AllOrNothing.R.

Buradaki fikir, bir yandan enfeksiyon riskini en üst düzeye çıkarmak (enfeksiyon oranını düşürmek, enfekte olmuş hastalığı tedavi etmek ve enfekte göçü önlemek) diğer yandan hastalığın ölümcüllüğünü artırmak ve böylece hastaları öldüren insanlara ulaşmaktır. enfekte, diğerlerini kirletmeden önce öl.

Düzenleme: stratejiyi biraz değiştirdi.


Güzel, diğer 21 devlete karşı olağanüstü derecede iyi yapıyor gibi görünüyor!
Thrax

@Thrax Nitekim, bazen de olsa, bazı denemeler sırasında, hala etkileyici bir şekilde başarısız oluyor :) Ama çoğu zaman test çalışmanızdaki gibi başarılı oluyor.
plannapus

Bu oldukça şaşırtıcı bot, iyi iş
Eumel

Bu, aynı olmasa da zamanı bulduğumda yazacağım bir duruma çok benziyor. Benimki sadece kafamda var ("20'li virüs bulaştıysa, onları karantinaya al, 10 ise, iyileştir, vb.") Çok iyi iş.
Draco18,

13

doktor

Medic her zaman ... tabiri caizse ilaçsız insanlar tarafından rahatsız edildi. Tıp yapmayı çok seviyor, yani tek yaptığı bu. Ayrıca pitonları sever, bu yüzden Python'da kodunu yazdı. Düşünürseniz her şey anlamlıdır. Hayır, gerçekten değil. Aslında, biraz ...

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)

Yardım etmek için buradayım.

Yardım etmek için buradayım.


4
Asklepius'un çubuğundaki gibi pitonlar mı? Yoksa Hermes'in kadrosundaki gibi mi? Biraz mantıklı gelebilir ...
Charles

3
Ya! Her ikisi de! Neden olmasın? Hepsi mantıklı!
Conor O'Brien,

7
++ 1; TF2 için: D
kedi

11

Kür

Bu biraz fazla basit görünüyor, ancak enfeksiyon / ölüm oranını düşürmek için oldukça iyi bir yöntem gibi görünüyor. Her dönüşte çıktılar MCQ:

  • Enfeksiyon oranını azalt
  • Bazı enfekte tedavi
  • Enfekte kalanların bir kısmını karantinaya al

Bu kadar!

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

Bunu , iyileştirme ve karantinaya almak yerine şu anda bulaştığım bir hastalık yoksa, daha fazlasını M(veya B) çıkararak geliştirebilirim , ancak bunun ne kadar iyi olduğunu görmek isterim. Maalesef, ilk göndermenin bir yan etkisi, etkinliği ölçmenin zor olmasıdır:


9

ZARARLI, Kotlin

Unutma, WICKED iyidir.

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

}

Derleme: kotlinc WICKED.kt
Çalıştır:kotlin wicked.WICKEDKt

PFC, Kotlin

Herkesi hastalığın bırakmaya çalışır.

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

}

Derleme: kotlinc PFC.kt
Çalıştır:kotlin pfc.PFCKt

Terörist, Kotlin

Tüm insanları öldürmeye çalışır.

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

}

Derleme: kotlinc Terrorist.kt
Çalıştır:kotlin terrorist.TerroristKt


Derleme bana Game, Player ve WICKEDkt sınıfları ile "kötü" bir klasör verir. Tanımladığın gibi koşuyor: "hata: wicked.WICKEDKt ana sınıfını bulamadı veya yükleyemedi"
Mwr247

Bu garip, bilgisayarımda işe yarıyor. WICKEDkt sınıf dosyasının gerçekten WICKEDKt adında olmadığından emin misiniz? Ayrıca, çalışma dizininin kötü klasörün içinde olmadığından emin olun.
TheNumberOne

WICKEDKt. Ben yorumda yazdım.
Mwr247

@ Mwr247 Oluşturulan kötü amaçlı klasörü gönderimler klasöründe bıraktınız mı? Oluşturulan dosyaları kötü klasörden mi taşıdınız?
TheNumberOne

WICKED iyidir ... lanet olsun sana ve az önce okuduğum şeylere referansların
ArtOfCode

9

Madagaskar, Java

Evet, Madagaskar yoluna gidiyor. İlk turda BBBsınırlarımızı kapatıyoruz. Aksi takdirde, bir tedavi verir ve yerel aşılara odaklanır.

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 - Ben daha-Madagaskar'd
Edit2 - startsWithHatırlatma için teşekkürler @Geobits


Geobits 5'ten başlayan göç oranı konusunda haklıysa ve sıfıra indirgenemezse, B kesinlikle hiçbir şey yapmaz.
quintopia

Bu şu anda derlenmiş gibi gözükmüyor. if (b == true)( if (b)bir stil meselesi olması gerektiği gibi) bir değişken verecektir çünkü değişken aslında denir bool.
Peter Taylor

yuvarlak == 1'e karşı kontrol etmek bir dosya oluşturmaktan çok daha iyi çalışırsa olmaz mıydı?
Eumel

1
@TimmyD Neyse ki, tur ilk, çok fazla ayrıştırma söz konusu değil. Sadece girişin başlayıp başlamadığını kontrol edin1;
Geobits 0 '33

@Geobits startsWith()Hatırlatma için teşekkürler . ÇOK ayrılmaktan ;ve yeniden ele geçirmeye çalışmaktan daha kolay ve ... Java ile paslandığımı söylemiştim.
AdmBorkBork

7

Tuz, Kotlin

Bu bot tüm kötü oyuncular ölünceye kadar hayatta kalır. Bundan sonra nüfusunu iyileştirir ve şehri sağlıklı insanlarla doldurur.

Bu botun 5 adımı var:

  1. Sınırları kapat.
  2. Enfekte ölüme izin verin, ancak çok çabuk değil (tam olarak ne kadar hızlı olduğunu bulmak zor kısımdır).
  3. Enfekte olanın sağlıklı bulaşmasını önleyin.
  4. Enfekte tedavi (tuz ile: P).
  5. Yeniden.

İşte burada:

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
}

Derleme: kotlinc Salt.kt
Çalıştır:kotlin salt.SaltKt

EDIT: "Dünyanın sonu" botlarının çoğu ölene kadar hayatta kalma olasılığı daha yüksek.

Örnek sonuçlar:

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)

Çok güzel bir strateji. Ölümcülüğü "iyi" bir şekilde kullanmanı sevdim!
Thrax

"Dünyanın sonu" botlarına bir son vermek iyi iş! Ancak, eğer birkaç bot daha olsaydı, Tuz devrilebilirdi, ama emin değilim. Hayatta kalma yeteneği çok etkileyici, güzel bir adam!
busukxuan

@ busukxuan Şu anda olduğu gibi, birkaç robotun bu öldürme oranını en üst düzeye çıkarmak, bu süreçte kendilerini öldürmeleri gerekir.
TheNumberOne

7

PureBot (Haskell)

PureBot bir şeyden nefret ediyor: Yan etkiler!
Tüm yan etkileri ele almaya çalışacak ve eğer her şey yolunda giderse, dış dünya tarafından üretilen yan etkilerin miktarını azaltacaktır.
Ayrıca hesaplamalarında tüm yan etkileri görmezden geliyor.
Bu, pasif düşmanlara karşı (küresel oranları değiştirmeyen) önemli ölçüde daha iyi oynamasını sağlar.

Eğer infected, infection, contagion, lethalityve migrationtüm sıfır, bu diğer botlar yardımcı olacaktır vardır P(için Pure) komutu.

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

koşmak: runhaskell PureBot.hs


Vay, ne teknik saflık! P komutunu yorumlamanızı seviyorum.
busukxuan

Haskell 7.10.3'ü yeni yükledim ve botunuzu çalıştırmaya çalıştığımda süresiz bekler. Bununla çalıştı: runhaskell.exe PureBot.hs 1;0;0_97_3_0_2_5_15_5;1_97_3_0_2_5_15_5. Çalıştırmadan önce yapmam gereken bir şey var mı?
Thrax

@Thrax Oh, özür dilerim. Komutları stdin üzerinden geçirdiğini sanıyordum ... Olmazsa programı değiştireceğim.
YoYoYonnY,

Komutlar argüman olarak iletilir. Botunuzu güncelledikten sonra bir sonraki çalıştırmayı yapacağım.
Thrax

@Thrax Bu durumda şimdi çalışması gerekir.
YoYoYonnY,

7

Enfekte Şehir, Java

Enfekte olmuş kasaba, insanların ölmedikleri sürece istila edilmesini önemsemez. Yerel ölüm oranını mümkün olduğunca düşürmesinin nedeni budur.

Ölümcül oran zaten çok düşük olduğunda, kendi ölümlerini azaltmadan önce küresel ölüm oranını artırmak için kalan eylemlerini kullanır.

Etrafındaki en büyük kasaba olmaya çalıştığından, göç dengesi ancak olumsuz olabilir, bu yüzden ilk eylem sınırları kapatmaktır.

Son dönüş sırasında, ölümcül oranın hiçbir etkisi yoktur ve şehirdeki aklı başında çalışanların sayısı üzerinde sıralama yapılır, bu nedenle 30 kişiyi iyileştirir ve yeterli olacağını umar.

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

Neredeyse sınırları kapatan ve şehirdeki enfeksiyon oranını düşürmeye çalışan standart kişisel koruma botu. Bunu, hayvan vektörlerini ayırarak yapar (enfekte kişilerin enfeksiyon oranı üzerinde bir etkisi olmadığı için insan dışı vektörlerle bir ilgisi olmalıdır; temel olarak bu "Araştırma mikrobiyolojisi" dir). Arada sırada, virüslü insanları da "kırar" ... Bilirsin, AI da hatalar yapar ...

# 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
Ben bir Python adamı değilim, bu yüzden yanlış yapıyorum, ancak bunu Python
3.4'da

@ Mwr247 Teşekkürler, ayrıştırma kodunu yazdığımda tamamen aklımdan çıktığı ortaya çıktı ... Bundan çok daha fazla sorun vardı.
busukxuan

Şimdi 11
veriyor

Şimdi çalışıyor =)
Mwr247

@ Mwr247 Lol! Bunu düzelttiğimi sanıyordum, ancak yeni kodu kopyalayıp yapıştırmadım, bu yüzden sanırım onu ​​kaçırdım. Test ettim, şimdi iyi çalışıyor olmalı. Bir şekilde G / Ç kurallarını yanlış anlamadığım sürece.
busukxuan

5

EvilBot, Java

EvilBot insanları iyileştirmeyi umursamıyor. Hayatta kaldıkları sürece (tür). Dünyanın geri kalanını hasta etmeye çalışır.

Yerel testlerimde, BlunderBot, EvilBot'u da tanıtana kadar çok daha iyi yapıyordu. İşleri biraz sarsacak gibi görünüyor.

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

Kitle Yaygınlaştırma Silahı

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

KİS botu bir sarsıntıdır: kendi enfeksiyon oranını düşük tutar ve herkesin sayısını arttırır.

Bot tamamen kısaltmak için yapılmış, muhtemelen güçlü bir rakip değil, rekabet alanını biraz daha ilginç kılacak. Kod TheCure'dan ödünç alındı ​​ve eylem dizesini değiştirdi.


Teknik olarak sınıf adını da değiştirdiniz; P
Kaptan Adam,

@DenhamCoote: Lütfen toplu dil ekleyen etiketlere bakmayın. Bir gönderiyi düzenleyecekseniz, bunun daha önemli bir şey olduğundan emin olun (dilbilgisi, biçimlendirme vb.). Teşekkürler.
Zach Gates,

Ah? Bir zamanlar yazılarımdan birinin tek düzenlemesini yaptığım gibi - sadece başkasının liderliğini takip ediyordum ...
Denham Coote

@DenhamCoote Hiçbir şey eklemeyen, ancak aslında yasaklanmayan "kolay ucuz düzenlemelerden" biri. Bunlardan bir demet yapmak spam olur.
Draco18,

'Ucuz' ile ne kastettiğinizden emin değilsiniz - Okunabilirliği arttırıyor, benim için… Bu meydan okuma normal bir golf mücadelesinden daha fazla okunacak kod içeriyor ve bu yüzden sözdiziminin vurgulanmasının iyi olacağını düşündüm. Puan için bunu yapıyorum gibi değil, ben sadece bu meydan okuma zevk oldu.
Denham Coote,

5

Graymalkin, Java

Graymalkin'in odak noktası enfeksiyon oranını 0'a düşürmek ve sağlıklı popülasyonunu büyütmektir. Tabii ki dış dünya dışında ... karantinaya inanmıyor.

İlk gönderim - eleştiriye hoş geldiniz. :)

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, botumun en son koşuna dahil edilmemişe benziyor. Nasıl olduğunu görmek merak ediyorum!
teatrousers

5

Triyaj, Java

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;
        }

    }

}

İlk önce vatandaşlarını canlı tutar, sonra diğerlerini etkilemelerini önler, sonra onları iyileştirir.

Mooch, Java

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;
        }

    }

}

Triyaj ile aynıdır, ancak sınırları tamamen açarak başlar. Bu, devasa kalıcı bir virüslü popülasyon popülasyonu sağlar, diğer botları rahatsız eder ve potansiyel olarak bağ kırıcı görevi görür.


Triyaj, Family Values'e parası için kaçmaya devam ediyor. Öte yandan Mooch, korkutucu ve geniş bir hasta halk ordusu kurmaya devam ediyor. Aferin!
Mwr247

moochbot herkesi bulaşmaz tutmaya çalışmıyor mu? ThisState.x, Durum değerini değiştirmez mi ve oyun, tekrar etkiyi iki katına veren dizgiden tekrar değiştirir mi? Son turda CCC'ye harika bir fikir
Eumel

Şimdi kodu
anladın

Moochbot sonunda sağlıklı bir popülasyon yaratmaya çalışır, ancak açık sınırlar + sıfır ölümcül hastalık bulaşmış popülasyonun çok daha hızlı büyümesini sağlar.
histoc

4

InfectedHaven, Python 3

Kapalı sınırlarla enfekte olmuşlar için güvenli bir bölge. Ölümcülüğü en aza indirmeye çalışır. En aza indirgenirse, diğer eyaletlerdeki hastalıklı bölgelere "fayda sağlamak" için ölümcüllüğü artırmaya çalışır.

# 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)

Yaptığınız değişiklik bir sonraki çalıştırmada dikkate alınacaktır. Yine de ikinci yarışmada rekabet etmeyecek, çünkü stratejiniz Enfekte için Güvenli Bir Yer haline getirildi. Yine de çok ilginç!
Thrax

2
@Thrax Lol teşekkürler, bu gerçekten bir strateji değil. Enfekte olanların muhtemelen sağlıklı tarafından önyargılı olacağını veya ayrımcılığa uğrayacağını düşündüm, bu yüzden kaotik bir dünyada bunun muhtemelen "hastalananlar için" durumunun oluşumunu katalize edeceğini düşündüm. Dürüst olmak gerekirse, bu sadece eğlence amaçlı bir bot oldu, ama sonra içinde çok az potansiyel gördüm, bu yüzden gönderdim.
busukxuan

@Thrax bu sakıncalı ise üzgünüm, ama sadece altta bulunan koşulları yanlış hesapladığımı öğrendim, bu yüzden tekrar güncelledim.
busukxuan

4

Kavşak, Python2

Kavşak fütüristik bilimsel değerlere odaklanan demokratik bir millettir. Çoğu demokraside olduğu gibi, çoğu karar bilimsel olarak eğitilmiş, bencil ve işlevsiz komiteler tarafından alınmaktadır; Bununla birlikte, hükümet sonuçta halkının ve insan ırkının ortak yararı için çalışıyor.

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]

Herkesi içeren 4 koşu:

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)

"Kıyamet botu" olmadan 4 koşu:

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: CullBot'un başarılı "ölümcüllüğü yok sayar ve insanları sağlıklı tutmaya odaklan" stratejisini gördükten sonra, temel karar komitesi tarafından rastgele karar vermeyi bırakmamakla birlikte, enfeksiyon ve bulaşmayı azaltma ve ölümcüllüğü azaltma konusunda sertleşme önceliğini artırdım.

EDIT2: Etrafta çok sayıda terörist bulunan ölümcüllüğü görmezden gelmek kötü. ölümcül azaltma önceliği yine arttı, şimdi ölümcül oranla ölçeklendiriyoruz. Ayrıca, aynı sırada sınırları açmak ve kapatmak gibi diğer kötü kararları da düzeltti ve mümkün olduğunda bunun yerine iyileştirmeyi tercih ederek karantina eşiğini artırdı.

EDIT3: Kullanılmayan durumları ele almak için birkaç küçük öncelik ayarı. Şimdi kıyamet günü dahil olsun olmasın, zirveye yaklaşıyor, her iki durumda da Tuz'un onu dövdüğünü düşünüyordu. Benim oyum şu an için bu şeyi kazanan Salt ile.

EDIT4: İyileştirilmiş zamanlama ve iyileştirme etkinliği.

EDIT5: Artık sıfır popülasyona ve hiçbir zaman sertleşme için özel durumlara çarpmadığından, göçle uğraşan şeyleri kaldırdık.

EDIT6: Erken oyunda enfeksiyon oranını düşürme önceliğini artırın. Yorum yapılan satırları kaldırın. Test çalıştırmalarının sonuçlarını güncellemedi, ancak artık kıyamet günü olmayan çalışmalarda (FamilyValues'u atarak, ancak TrumpBot'u yenmeden) oldukça yüksek puanlar aldı.

EDIT7: Yüksek bellek kullanımını önlemek için Cap enfeksiyonu / bulaşıcılık oranı üsteli 50'de.


Bekle ... İsrail, WWZ Kudüs’ünden sonra duvarları çok mu yüksek?
busukxuan

Bu ilham verici bir fikir olan @busukxuan, bu İsrail'in filmdeki Kudüs'e daha çok benzemesinin dışında (hızlı bir şekilde virüs bulaşmış), çünkü temelde geniş bir la Mooch sınırını açtığı için. Asıl plan, çoğunlukla 'P'yi yapmasıydı, ancak etkili bir strateji değildi.
quintopia,

Hm ... Anlaşılan sevgili CullBot, enfeksiyonu arttırmaya çalışan daha fazla bot varken artık dayanamıyor.
busukxuan

Enfeksiyon aşağı çekmek için bir bot eklediğimde harika (sıralı sıralamayı açmak için)
quintopia

Yani temelde CullBot oldukça dengesiz ve duruma bağlı. Gerçekten de, kodu yazdığımda enfeksiyon kabiliyetini kabul ettim. Tek geri dönüş, tur başına 1 karantinaya kaldı.
busukxuan

3

Gardiyan Lua.

Bir Fransız kurbağacı tarafından yapılan bir KotH! Bu yarışmada olmalıydım!

Bu bot enfeksiyon / bulaşıcılık ve ölümcül hastalık oranlarını mümkün olduğu kadar düşük tutmak için mümkün olan her şeyi yapacaktır. En büyük önceliği 0'a yakın bir ölümcül olmaktır. Daha sonra daha fazla insanı "ithal etmeyi" denemek iyi olduğunda tahmin etmeye çalışacaktır.

Düzenleme: Neyin elde ettiğimizi argplayerId'ye göre sıraladığımı varsaydım. Bu yanlış bir varsayım, bu yüzden bir kabarcık düzeni ekledim 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 .. Kaynak kodu düzeltildi, şimdi input=arg[1]yerine kullanıldı input=io.read().
Katenkyo

3

MadScienceBot, Python2

Bu dünyanın neye ihtiyacı var biliyor musun?

DAHA FAZLA BİLİM!

DAHA FAZLA BİLİMİ nasıl elde ederiz?

Brazinz

Sadece son saniyede insanları tedavi eder, 50. tur haricinde onlar hakkında daha az umursayamaz. Her turda bir zombi çiftliği olmaya çalışır

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, Java

Hey, bu sitedeki ilk gönderim. Temelde sadece örnek botlardan birini aldım ve çıktıyla ilgili çizgileri değiştirdim.

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;
    }

}

}

Umarım bu tamamdır ve bot kendi koşularımda oldukça başarılı oldu. Çünkü sonunda 30 sağlıklı ve maksimum miktarda enfekte olmuşsanız, yaşamaya ihtiyacı var. Oyuna herşeyin başlaması için 3x BioTerrorism ile başlıyor ve yerel ölümcüllüğü düşük tutmaya çalışıyor. 4'ten düşükse, Yaygınlaştırma ile küresel enfeksiyon ve bulaşma oranını artırmaya çalışır.


PPCG'ye hoşgeldiniz :-) Burada iyi vakit
geçirmenizi dilerim

Bu şimdiye kadar iyi gidiyor gibi görünüyor. PPCG'ye hoş geldiniz ve iyi iş çıkardınız!
Rɪᴋᴇʀ

2

Yaygınlaştırma Bot, Ruby

Bu bot, 10 veya daha fazla iyileşmeye bırakıldığı sürece Kürleşecektir. Ardından, enfeksiyon oranı en az 4 ise, bot onu azaltacaktır. Diğer tüm eylemler bulaşıcılık oranını arttırmak için harcanıyor;

#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 insanlardan korkuyor, salgına karşı çözümü popülasyonunu izole etmek, yapabilecekleri insanları iyileştirmek ve yapamadıklarında onları izole etmek. Tüm bu savaş saçmalıklarıyla uğraşmıyor, sadece insanlarını hayatta tutmaya çalışıyor.

XenoBot'u şu şekilde etkinleştirin:

node xenobot.js [data]

Kod:

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

Stratejist, Python

Bu bot hayatta kalmak konusunda gerçekten ciddi. Olası stratejileri analiz etti ve kendi kazanma yöntemiyle ortaya çıktı. Şimdi kaynak yorumlarda belgelenecek, çünkü o iyi bir adam ve diğer insanların da hayatta kalmasını istiyor.

İle arandı 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

Aç ve kapat

Oyuna sınırları açarak başlayın, sonra bütün hastaların gelmesine izin verin. Büyük bir hasta nüfusuna sahip olduktan sonra (30. tur), sınırları kapatın ve hastaları tedavi etmeye çalışın.

#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

İki tane daha Python botu

İsrail

Mooch'a benzer, ancak çok daha iyi olduğu nadir durumlarda hariç Mooch kadar iyi olmayabilir:

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]

Kızıl Haç

Bir nevi pasifist gibi, kendi halkını ölmekten alıkoymaya çalışmak dışında. Bu konuda sefil başarısız, ancak oyun alanında başka bir dost olması güzel.

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)

Ben ateşim; Ölüyüm.

Smaug, nerede gerçekleştiğinden bağımsız olarak mümkün olduğu kadar ölüm yaratır.

# "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)

Bir poliglot oynamaya çalışıyorsanız, boş dosya daha kısa olacaktır ve tam olarak izleyicinin yaptığını yapar (ve aynı zamanda, tam olarak ne PassiveBot'un yaptığı - ikisi de aynı şekilde davranır), çünkü tercüman NNN’yi bir 0 uzunluk cevabı.
quintopia,

@quintopia: Çok basit bir şekilde bir polglot olarak çalıştığını yazdığımda fark etmedim, ancak PassiveBot'un ne yaptığını anlamadım, bu yüzden sadece Watcher'ı sileceğim (iki özdeş olana gerek yok)
SnoringFrog

2

Etkilenenleri Kaldır (Python)

Tüm rastgele mantığa rağmen, bunun Q ve C'lerden başka bir şey döndürmemesi çok nadir görülen bir durumdur (önleyici tedbirler asla bu kadar yardımcı olmaz). Oh iyi. Bir kısmını başka bir bot için ödünç alabilir, ancak yardımcı olması durumunda bırakabilirsiniz.

# 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 Bu bot güncellendi
SnoringFrog

2

CureThenQuarantine, Java

Devlet, şanslı olanları tedavi etmek ve daha sonra virüslü kişilerin kalanını karantina altına almak için bir politika başlattı. Enfekte olmuş nüfus azaldığında, o zaman yerel oranları azaltmaya odaklanın ve ardından küresel oranların azaltılmasına yardımcı olun.

Devlete virüs bulaşmasını engellemek için sınırlar kapatıldı.

Botu sadece java ve python botlarına karşı test ettim ... sanırım kendilerine karşı duruyor. Ayrıca botum CullBot’a benziyor gibi görünüyor.

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

Araştırmacı, Java

Bu bot araştırmaya odaklanıyor. Virüs sayısı 15'in altındaysa, onları iyileştirmeye çalışır. Bundan daha yüksekse, daha etkili çözümü seçer .

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
Java dili, sanırım ??
kedi

2

Parça parça, Java

Önceki botuma (CureThenQuarantine) dayanarak, saldırgan botlarla oyunda, virüslülerin çok hızlı bir şekilde öleceği için karantinaya gerek olmadığını, bu nedenle bu botun her turda fırsatlı olarak tedavi edebileceğini (ya göçten veya sağlıklı popülasyondan kaynaklanan enfeksiyonlar). Daha sonra, sağlıklı popülasyonun, sağlıklı popülasyonu artırmak için doğumlara dayanarak sağlıklı kalmasını sağlamak için kalan eylemleri kullanacaktır.

Devlete virüs bulaşmasını engellemek için sınırlar kapatıldı.

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;
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.