KOTH: Một đại dịch trên toàn thế giới


82

Kết quả cuối cùng là đây!

Giới thiệu

Năm 2042, thế giới đã trở nên quá đông dân. Toàn cầu hóa, quá đông đúc, lối sống mới và thiếu vệ sinh toàn cầu đã gây ra một đại dịch mới lan rộng. Trong thời gian khó khăn đó, các nhà lãnh đạo nhà nước phải quản lý tình hình. Bạn không thể để dân số của mình bị suy giảm, nhưng có lẽ bạn có thể hưởng lợi bằng cách để hàng xóm của mình chết ...

Bảng chú giải

Khỏe mạnh : Những người không bị nhiễm
bệnh : Những người có thể chết vì đại dịch
Chết : Số lượng cơ thể, không có ảnh hưởng cụ thể (chỉ ghi điểm)
Tỷ lệ nhiễm trùng : Số người khỏe mạnh sẽ bị nhiễm bệnh mỗi lượt
Tỷ lệ lây nhiễm : Tỷ lệ nhiễm bệnh sẽ chuyển đổi khỏe mạnh sang bị nhiễm bệnh mỗi lượt
Tỷ lệ tử vong : Tỷ lệ bị nhiễm sẽ chết mỗi lượt
Tỷ lệ di cư : Tỷ lệ cả người khỏe mạnhbị nhiễm bệnh sẽ di cư / di cư mỗi lượt
Địa phương: Chỉ ảnh hưởng đến tiểu bang của bạn
Toàn cầu : Ảnh hưởng đến mọi tiểu bang

Nguyên tắc

Mỗi người chơi sẽ quản lý một thị trấn, bắt đầu với 100 người . Thật không may, trong số họ là một người bị nhiễm bệnh .

Trò chơi được chơi theo lượt. Một lượt bao gồm bảy giai đoạn , giai đoạn cuối cùng là tương tác (yêu cầu bot cho một lệnh). Thứ tự của người chơi được chọn ngẫu nhiên mỗi lượt. Giai đoạn tiếp theo bắt đầu khi giai đoạn trước đã được thực hiện bởi mọi thị trấn (Lần lượt 1: Người chơi 1, Người chơi 2, Người chơi 3 ...; Lần lượt 2: Người chơi 3, Người chơi 2, Người chơi 1 ...):

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

Bộ điều khiển cung cấp cho bạn đầu vào thông qua các đối số lệnh và chương trình của bạn phải xuất qua thiết bị xuất chuẩn.

Cú pháp

Đầu vào

Mỗi khi chương trình của bạn được gọi, nó sẽ nhận được các đối số ở định dạng này:

Round;YourPlayerId;PlayerId_Healthy_Infected_Dead_InfectionRate_ContagionRate_LethalityRate_MigrationRate;PlayerId_Healthy_Infected_Dead_InfectionRate_ContagionRate_LethalityRate_MigrationRate;...

Vòng có 1 chỉ số.

Ví dụ đầu vào

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

Ở đây, bạn thấy đó là vòng thứ 6 và bạn là người chơi 2. Bạn có 20 người khỏe mạnh, 53 người nhiễm bệnh, 62 người chết, tỷ lệ lây nhiễm 16%, tỷ lệ lây nhiễm 20%, tỷ lệ tử vong 35% và tỷ lệ di cư 5%.

Đầu ra

Bạn phải xuất ba ký tự (không có khoảng trắng, không có dấu phân cách), mỗi ký tự tương ứng với một hành động bạn sẽ thực hiện lần lượt này. Thứ tự của các nhân vật xác định thứ tự của các hành động. Bạn có thể xuất các hành động tương tự nhiều lần.

N: Do N ellow
M: Research M icrobiology [Hiệu ứng: Giảm tỷ lệ nhiễm trùng cục bộ 4%]
E: Nghiên cứu khoa học điện tử [Hiệu ứng: Giảm 8% tỷ lệ lây nhiễm tại địa phương ]
I: Nghiên cứu I mmunology [Tác dụng: Giảm tỷ lệ tử vong tại địa phương xuống 4%]
V: Nghiên cứu V tích lũy [Hiệu ứng: Giảm tỷ lệ nhiễm trùng cục bộ xuống 1%, giảm 4% Tỷ lệ lây nhiễm tại địa phương , giảm 2% Tỷ lệ tử vong tại địa phương ]
C: Cung cấp cho C ure [Hiệu ứng: Chuyển đổi 10 bệnh nhân nhiễm trùng cục bộ thành khỏe mạnh ]
Q : Q uarantine [Effects: Di chuyển 30 địa phương bị nhiễm ]
O: O bút Borders [Tác dụng: Tăng địa phương Rate Migration 10%]
B: Đóng B đơn đặt hàng [Effects: Giảm địa phương Rate Migration 10%]
T: Bio T errorism [Effects: Chuyển đổi 4 Toàn cầu khỏe mạnh để bị nhiễm bệnh ]
W: W eaponization [Hiệu ứng: Tăng tỷ lệ nhiễm trùng toàn cầu lên 1, tăng tỷ lệ tử vong toàn cầu lên 2%]
D: D ngay lập tức [Hiệu ứng: Tăng tỷ lệ nhiễm trùng toàn cầutăng 1%, tăng tỷ lệ lây nhiễm toàn cầu lên 2%]
P: P acization [Hiệu ứng: Giảm tỷ lệ lây nhiễm toàn cầu xuống 1, giảm 1% tỷ lệ lây nhiễm toàn cầu, giảm 1% tỷ lệ tử vong toàn cầu ]

Trò chơi

Tất cả các giai đoạn

Lệnh không hợp lệ = Không có
tỷ lệ phần trăm nào được thêm vào như số nguyên, tức là 10% - 4% = 6%. Khi tỷ lệ phần trăm được áp dụng trong một công thức, kết quả được thả nổi.

Giai đoạn 1: Đột biến

Đại dịch đang trở nên mạnh mẽ hơn. Mỗi lượt, nó ngẫu nhiên nhận được một trong những thuộc tính này (đột biến này ảnh hưởng đến tất cả người chơi cùng một lúc):

  • Tăng tỷ lệ nhiễm trùng toàn cầu lên 2
  • Tăng tỷ lệ lây nhiễm toàn cầu lên 5%
  • Tăng tỷ lệ tử vong toàn cầu lên 5%

Giai đoạn 2: Sinh sản

Cứ sau 5 vòng (vòng 5, 10, 15 ...), công dân mới sẽ được sinh ra. Mỗi cặp Khỏe mạnh sẽ làm cho một Người khỏe mạnh (23 Khỏe mạnh tạo ra 11 Sức khỏe mới ). Mỗi cặp bị nhiễm sẽ làm cho một người bị nhiễm bệnh .

Giai đoạn 3: Di cư

Mỗi lượt, một tỷ lệ phần trăm Người khỏe mạnhbị nhiễm sẽ rời khỏi các trạng thái, tùy thuộc vào Tỷ lệ di cư của họ (10 Người khỏe mạnh sẽ rời khỏi trạng thái có 100 Tỷ lệ di cư khỏe mạnh và 10% ). Sau đó, người di cư sẽ được phân phối giữa mọi tiểu bang, một lần nữa tùy thuộc vào Tỷ lệ di cư . (Tỷ lệ của mỗi tiểu bang có trọng số và người di cư sau đó tất cả được phân phối tương ứng).

Giai đoạn 4: Nhiễm trùng

Sức khỏe của mỗi tiểu bang được chuyển đổi thành Bị nhiễm bệnh , theo Tỷ lệ nhiễm trùng .

Giai đoạn 5: lây nhiễm

Sức khỏe của mỗi tiểu bang được chuyển đổi thành Bị nhiễm bệnh , theo Tỷ lệ lây nhiễm . Con số này được tính bằng cách nhân bị nhiễm bởi các Rate Contagion .

Giai đoạn 6: Tuyệt chủng

Bị nhiễm bệnh được chuyển thành Chết , theo Tỷ lệ tử vong . Con số được tính bằng cách nhân Tỷ lệ nhiễm với Tỷ lệ tử vong .

Giai đoạn 7: Người chơi lần lượt

Mỗi người chơi nhận đầu vào và phải xuất ba hành động, được thực hiện theo thứ tự họ đang xuất.

Quy tắc

  • Bots không nên được viết để đánh bại hoặc hỗ trợ các bot cụ thể khác.
  • Viết vào các tập tin được cho phép. Vui lòng viết thư cho "mineubmissionname.txt", thư mục sẽ được xóa trước khi trò chơi bắt đầu. Các nguồn lực bên ngoài khác không được phép.
  • Trình của bạn có một giây để trả lời (mỗi thị trấn).
  • Cung cấp các lệnh để biên dịch và chạy đệ trình của bạn.

Chiến thắng

Người chiến thắng là người có nhiều sức khỏe nhất sau 50 vòng. Nếu một người chơi là người còn sống cuối cùng (hơn 0 Khỏe mạnh hoặc bị nhiễm bệnh ) thì trò chơi dừng lại và anh ta thắng. Nếu nhiều người chơi có cùng số lượng Người khỏe mạnh , người nào bị nhiễm nhiều nhất sẽ chiến thắng, thì người chơi có ít Dead hơn .

Bộ điều khiển

Bạn có thể tìm thấy bộ điều khiển trên GitHub . Nó cũng chứa ba mẫu, được viết bằng Java.
Để làm cho nó chạy, hãy xem dự án và mở nó trong Java IDE của bạn. Điểm vào trong mainphương thức của lớp Game. Yêu cầu Java 8.

Để thêm bot, trước tiên, bạn cần phiên bản được biên dịch cho Java (tệp. Class) hoặc nguồn cho các ngôn ngữ được diễn giải. Đặt chúng trong thư mục gốc của dự án. Sau đó, tạo một lớp Java mới trong playersgói (bạn có thể lấy ví dụ về các bot đã có). Lớp này phải thực hiện Playerđể ghi đè phương thức String getCmd(). Chuỗi trả về là lệnh shell để chạy bot của bạn. Ví dụ, bạn có thể làm cho bot Ruby hoạt động với lệnh này : return "C:\Ruby\bin\ruby.exe MyBot.rb";. Cuối cùng, thêm bot trong playersmảng ở đầu Gamelớp.

Kết quả cuối cùng (2016-03-04 08:22 GMT)

Toàn cầu (100 danh tiếng):

Kết quả 100 trò chơi: http://past.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)

Doomsday-less (200 danh tiếng):

Kết quả 100 trò chơi: http://past.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)

Cảm ơn tất cả mọi người vì sự tham gia của bạn. Tôi hy vọng bạn đã có một khoảng thời gian tuyệt vời để thiết kế và mã hóa các bot của mình khi tôi chạy trò chơi.


9
Chúng ta có thể nhận được lệnh E xecute giết người X lượng bị nhiễm bệnh (biến chúng thành chết)? Có lẽ không phải là một phương pháp khả thi để chiến thắng, nhưng một hành động có vẻ hợp pháp. Trừ khi đó là những gì Kiểm dịch làm (không rõ ràng).
Draco18

3
Ghi chú ngữ pháp nhanh: "Sane" có nghĩa là "ổn định tinh thần"; từ mà bạn (có lẽ) đang tìm kiếm ở đây là "lành mạnh." (Tôi có đúng không khi đoán rằng ngôn ngữ đầu tiên của bạn là tiếng Tây Ban Nha, trong đó "sano" có nghĩa là "lành mạnh", hoặc một cái gì đó liên quan chặt chẽ?)
Mason Wheeler

5
@MasonWheeler ngữ nitpicking lưu ý: Các bạn lưu ý là một thuật ngữ hoặc từ vựng lưu ý là không có ngữ pháp liên quan;)
Jan

3
@Thrax Cách quay vòng hiện đang được xử lý (ngẫu nhiên khi bắt đầu, cùng thứ tự từ đó trở đi), mang lại cho người chơi đến sau trong lượt chơi một lợi thế rất lớn, khiến kết quả cuối cùng biến đổi một cách điên cuồng. Có lẽ nếu bạn 1) chọn ngẫu nhiên thứ tự lần lượt mỗi vòng hoặc 2) khiến mọi người cùng xem trạng thái trong lượt của mình và áp dụng các thay đổi cho mọi người vào cuối vòng, thì kết quả có thể cân bằng hơn và được dựa trên nhiều hơn về chất lượng của trình. Tôi đã thử nghiệm tùy chọn đầu tiên, và kết quả phù hợp hơn nhiều.
Mwr247

7
@Thrax Hiện tại có quá nhiều bot tồn tại chỉ đơn giản là "hủy diệt thế giới". Mặc dù đây có thể là một thử thách thú vị, nhưng tại thời điểm các bot thực sự cố gắng cạnh tranh không thể chống lại nó một cách hiệu quả nữa, và chúng tôi còn lại với bất kỳ bot nào được lập trình để "Cure X 3" ở cuối là người chiến thắng. Tôi muốn đề xuất thay đổi quy tắc trong đó để được xem xét cho KOTH, các bot ít nhất cần có khả năng kết thúc với các "sanes" tích cực trong trận đấu 1 chọi 1 với thụ độngBot? Thử thách thú vị hơn khi các chiến lược thực sự có hiệu lực.
Mwr247

Câu trả lời:


12

Giá trị gia đình, nút (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(''));

Giá trị gia đình tập trung vào việc tự bảo vệ và bảo vệ, và chỉ thực hiện các hành động cho đến cùng. Nó sử dụng hệ thống giá trị điểm để xác định hướng hành động tốt nhất để thực hiện và sau đó điều chỉnh các giá trị trạng thái của chính nó để xác định tốt hơn ưu tiên tiếp theo của nó. Trong trường hợp hòa, nó chọn ngẫu nhiên trong số các tùy chọn tốt nhất.

EDIT: Có vẻ như đang làm tốt cho đến nay:

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

The Pacifist, Nút

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

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

Với rất nhiều sự tập trung vào giết chóc và cái chết, Pacifist tin rằng sức khỏe toàn cầu mạnh mẽ có nghĩa là sức khỏe địa phương mạnh mẽ. Như vậy, họ gần như chỉ tập trung vào việc giảm bệnh tật toàn cầu, trong khi để lại một phần mở cho phép sự tốt đẹp lan rộng ra xung quanh.


Ồ, tôi không mong đợi TheCure sẽ là lần cuối cùng
ngay

@justhalf Với nhiều người chơi này, tất cả họ cuối cùng đều di chuyển rất nhiều trên bảng: chỉ cần chạy một cái ngay bây giờ khi TheCure kết thúc ở vị trí thứ 3. Cả FamilyValues ​​và Triage hầu như luôn nằm trong top hai, với FV chiếm vị trí số 1 trong hầu hết thời gian.
Mwr247

Hmm, nhiệm vụ chính nó là xác định, phải không? Vì vậy, có phải là do một số người chơi đưa ngẫu nhiên vào thuật toán của họ?
ngay

@justhalf Yếu tố lớn nhất từ ​​trước đến nay dường như là thứ tự lần lượt, được chọn ngẫu nhiên (nhưng giống nhau cho mọi vòng trong trò chơi). Đi trước có nghĩa là bạn không có cơ hội phản ứng với hành động của mọi người trong lượt hiện tại, trong khi việc đi cuối cùng cho phép bạn điều chỉnh tốt nhất những gì người chơi khác đã làm với bạn.
Mwr247

1
@justhalf Tôi vừa thử nghiệm một bộ điều khiển đã sửa đổi, ngẫu nhiên hóa thứ tự lần lượt cho mỗi vòng, và kết quả hiện tại phù hợp hơn nhiều.
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());
}

Làm cho nước Mỹ vĩ đại bằng cách chữa khỏi tất cả những người bị nhiễm trừ khi chỉ có 2 hoặc ít hơn; thiểu số sẽ bị bỏ qua.

Có ít nhiễm trùng làm cho thuốc rẻ hơn.

Cần không có người nhập cư - họ chỉ mang lại nhiễm trùng.

Nếu không còn gì để làm, hãy đánh bom những người chơi khác.

Đảo ngược mệnh lệnh theo cách của Mỹ, bom trước cứu người sau.

Chỉnh sửa: đã sửa một lỗi sẽ spam thư rác vì số lượng bị nhiễm không được hạ xuống sau khi chữa.

Trumpscript

Cảm ơn J Atkin đã cung cấp nó:

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

Tất cả mọi thứ, 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))

Được viện dẫn bởi Rscript AllOrNothing.R.

Ý tưởng ở đây là một mặt để hạn chế tối đa nguy cơ nhiễm trùng (bằng cách giảm tỷ lệ nhiễm trùng, chữa khỏi bệnh và ngăn ngừa nhiễm trùng để nhập cư) và mặt khác để tăng tỷ lệ tử vong của bệnh để những người mắc phải bị nhiễm bệnh, chết trước khi làm ô nhiễm những người khác.

Chỉnh sửa: tinh chỉnh chiến lược một chút.


Thật tuyệt, nó dường như đang làm rất tốt so với 21 tiểu bang khác!
Thrax

@Thrax Thật vậy, mặc dù thỉnh thoảng, trong một số lần chạy, nó vẫn thất bại khá ấn tượng :) Nhưng thường thì nó thành công như trong lần chạy thử của bạn.
plannapus

Đó là bot tuyệt vời, công việc tốt
Eumel

Điều này trông rất giống với trạng thái tôi sẽ viết khi tôi tìm thấy thời gian, nếu không giống hệt. Của tôi chỉ tồn tại trong đầu tôi ("nếu 20ish bị nhiễm bệnh, hãy cách ly chúng, nếu 10ish, chữa cho chúng, v.v.") thì rất tốt.
Draco18

13

Thuốc

Người dược luôn ... gặp rắc rối , có thể nói, bởi những người không có thuốc. Anh ấy thích hành nghề y, vì vậy đó là tất cả những gì anh ấy làm. Anh ấy cũng thích trăn, vì vậy anh ấy đã viết mã của mình bằng Python. Tất cả đều có ý nghĩa, nếu bạn nghĩ về nó. Không, nó thực sự không. Thật ra, nó hơi ...

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)

Tôi ở đây là để giúp đỡ.

Tôi ở đây là để giúp đỡ.


4
Trăn như trong que của Asclepius? Hay như trong đội ngũ nhân viên của Hermes? Nó có thể có ý nghĩa ...
Không phải Charles

3
Hoặc! Cả hai! Tại sao không? Tất cả đều có lý!
Conor O'Brien

7
++ 1; cho TF2: D
mèo

11

Phương thuốc

Điều này có vẻ hơi quá đơn giản, nhưng nó cũng có vẻ là một phương pháp khá tốt để giảm tỷ lệ nhiễm trùng / tử vong. Trên mỗi lượt, đầu raMCQ :

  • Giảm tỷ lệ nhiễm trùng
  • Chữa một số bệnh nhiễm trùng
  • Kiểm dịch một số người còn lại bị nhiễm bệnh

Đó là nó!

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

Tôi có thể cải thiện điều này bằng cách xuất thêm M(hoặc B) nếu hiện tại tôi không bị nhiễm bệnh thay vì chữa bệnh và cách ly, nhưng tôi muốn xem điều này tốt như thế nào trước tiên. Thật không may, một tác dụng phụ của việc đăng bài đầu tiên là rất khó để đánh giá hiệu quả:


9

Bấc, Kotlin

Hãy nhớ rằng, WICKED là tốt.

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

}

Biên dịch với: kotlinc WICKED.kt
Chạy với:kotlin wicked.WICKEDKt

PFC, Kotlin

Nỗ lực giải phóng bệnh trên tất cả mọi người.

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

}

Biên dịch với: kotlinc PFC.kt
Chạy với:kotlin pfc.PFCKt

Khủng bố, Kotlin

Cố gắng làm cho tất cả mọi người chết.

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

}

Biên dịch với: kotlinc Terrorist.kt
Chạy với:kotlin terrorist.TerroristKt


Biên dịch cho tôi một thư mục "độc ác" với các lớp Game, Player và WICKEDkt. Chạy như bạn đã mô tả trả về: "lỗi: không thể tìm thấy hoặc tải lớp chính xấu xa.WICKEDKt"
Mwr247

Thật kỳ lạ, nó hoạt động tốt trên máy tính của tôi. Bạn có chắc chắn rằng tệp lớp WICKEDkt không thực sự được đặt tên là WICKEDKt? Ngoài ra, hãy chắc chắn rằng thư mục làm việc của bạn không nằm trong thư mục độc ác.
TheNumberOne

Đó là WICKEDKt. Tôi đánh máy trong bình luận.
Mwr247

@ Mwr247 Bạn có để thư mục độc ác được tạo trong thư mục gửi không? Bạn đã di chuyển các tập tin được tạo ra từ thư mục độc ác?
TheNumberOne

WICKED là tốt ... chết tiệt bạn và tài liệu tham khảo của bạn về những điều tôi vừa đọc.
ArtOfCode

9

Madagascar, Java

Đúng, đi theo con đường Madagascar. Vòng đầu tiên, chúng tôi BBBđóng cửa biên giới của chúng tôi. Mặt khác, nó cung cấp cho một phương pháp chữa bệnh, và tập trung vào vắc-xin địa phương.

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

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

Edit1 - I more-Madagascar'd
Edit2 - Cảm ơn @Geobits vì startsWithlời nhắc


nếu Geobits đúng về tỷ lệ di chuyển bắt đầu từ 5 và không thể giảm về 0, thì B hoàn toàn không làm gì cả.
quintopia

Điều này hiện không giống như nó sẽ biên dịch. if (b == true)(nên if (b)là một vấn đề về phong cách) sẽ đưa ra một lỗi vì biến thực sự được gọi bool.
Peter Taylor

Sẽ không nếu kiểm tra vòng == 1 hoạt động tốt hơn nhiều so với việc tạo tệp?
Eumel

1
@TimmyD May mắn thay, vòng đầu tiên, vì vậy không có nhiều phân tích liên quan. Chỉ cần kiểm tra nếu đầu vào bắt đầu bằng1;
Geobits

@Geobits Cảm ơn bạn đã startsWith()nhắc nhở. RẤT NHIỀU hơn là chia tách ;và cố gắng chiếm lại và ... Đã nói với tôi rằng tôi đã bị rỉ sét với Java.
admBorkBork

7

Muối, Kotlin

Bot này tồn tại cho đến khi tất cả những người chơi khó chịu đã chết. Sau đó, nó chữa khỏi dân số và tái sinh thị trấn với những người khỏe mạnh.

Bot này có 5 bước:

  1. Đóng biên giới.
  2. Cho phép người nhiễm bệnh chết, nhưng không quá nhanh (tìm chính xác tốc độ quá nhanh là phần khó).
  3. Ngăn ngừa nhiễm trùng lây nhiễm cho người khỏe mạnh.
  4. Chữa người bị nhiễm bệnh (bằng muối: P).
  5. Tái sản xuất.

Đây là:

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
}

Biên dịch với: kotlinc Salt.kt
Chạy với:kotlin salt.SaltKt

EDIT: Khả năng sống sót cao hơn cho đến khi hầu hết các bot "tận thế" đã chết.

Kết quả ví dụ:

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)

Chiến lược rất hay. Tôi thích việc bạn sử dụng sát thương theo cách "tốt"!
Thrax

Làm tốt lắm, chấm dứt các bot "tận thế"! Tuy nhiên, Salt có thể lật đổ nếu có thêm một vài con bot đó, tôi không chắc lắm. Khả năng sống sót đã rất ấn tượng rồi, một người đàn ông tốt bụng!
busukxuan

@busukxuan Như hiện tại, một số bot sẽ phải tối đa hóa tỷ lệ gây chết trước khi chúng có thể giết chết điều này, tự sát trong quá trình này.
TheNumberOne

7

PureBot (Haskell)

PureBot ghét một điều: Tác dụng phụ!
Nó sẽ cố gắng xử lý tất cả các tác dụng phụ, và nếu mọi thứ diễn ra tốt đẹp, nó sẽ làm giảm lượng tác dụng phụ do thế giới bên ngoài tạo ra.
Nó cũng bỏ qua tất cả các tác dụng phụ trong tính toán của nó.
Điều này làm cho nó chơi tốt hơn đáng kể trước những kẻ thù thụ động (không thay đổi tỷ lệ toàn cầu).

Nếu infected, infection, contagion, lethalitymigrationtất cả đều bằng không, nó sẽ giúp các bot khác với P(cho Pure) lệnh.

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

chạy với: runhaskell PureBot.hs


Wow, những gì tinh khiết kỹ thuật! Tôi thích cách bạn diễn giải lệnh P.
busukxuan

Tôi mới cài đặt Haskell 7.10.3 và khi tôi cố chạy bot của bạn, nó chờ đợi vô thời hạn. Tôi đã thử với điều này : runhaskell.exe PureBot.hs 1;0;0_97_3_0_2_5_15_5;1_97_3_0_2_5_15_5. Có điều gì nữa tôi cần phải làm trước khi chạy nó không?
Thrax

@Thrax ơi, xin lỗi. Tôi nghĩ bạn đã truyền lệnh thông qua stdin ... Nếu không, tôi sẽ thay đổi chương trình.
YoYoYonnY

Các lệnh được truyền dưới dạng đối số. Tôi sẽ thực hiện lần chạy tiếp theo sau khi bạn đã cập nhật bot của mình.
Thrax

@Thrax Trong trường hợp đó nó sẽ hoạt động ngay bây giờ.
YoYoYonnY

7

Thị trấn bị nhiễm bệnh, Java

Thị trấn bị nhiễm bệnh không quan tâm nếu mọi người bị nhiễm miễn là họ không chết. Đó là lý do tại sao nó sẽ làm giảm tỷ lệ gây chết cục bộ càng nhiều càng tốt.

Khi tỷ lệ gây chết đã rất thấp, nó sẽ sử dụng các hành động còn lại của mình để tăng tỷ lệ gây chết toàn cầu trước khi giảm tỷ lệ gây tử vong toàn cầu.

Vì nó cố gắng trở thành thị trấn lớn nhất xung quanh, nên số dư nhập cư chỉ có thể là âm, vì vậy hành động đầu tiên của nó là đóng cửa biên giới.

Trong lượt cuối cùng, tỷ lệ gây chết người không có tác dụng và việc xếp hạng được thực hiện đối với số người lành mạnh trong thị trấn, vì vậy nó chữa được 30 người và hy vọng rằng nó sẽ đủ.

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

Khá nhiều bot tự bảo vệ tiêu chuẩn đóng cửa biên giới và cố gắng giảm tỷ lệ lây nhiễm trong thị trấn. Nó làm như vậy bằng cách loại bỏ các vectơ động vật (vì người nhiễm bệnh không ảnh hưởng đến tỷ lệ lây nhiễm, nó phải có liên quan đến vectơ không phải người; về cơ bản đây là "Nghiên cứu vi sinh"). Thỉnh thoảng, nó cũng "loại bỏ" con người bị nhiễm bệnh ... Bạn biết đấy, AI cũng mắc lỗi ...

# 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
Tôi không phải là một người Python, vì vậy tôi có thể làm điều này sai, nhưng việc chạy nó trong Python 3.4 mang lại cho tôi "NameError: tên 'dictionary' không được xác định" trên dòng 9.
Mwr247

@ Mwr247 Cảm ơn, hóa ra tôi đã hoàn toàn mất trí khi viết mã phân tích cú pháp ... Có nhiều vấn đề hơn thế.
busukxuan

Bây giờ, nó đưa ra đối tượng "TypeError: 'list' không thể được hiểu là số nguyên" trên dòng 11
Mwr247

Bây giờ nó hoạt động =)
Mwr247

@ Mwr247 Lol! Tôi nghĩ rằng tôi đã sửa nó, nhưng tôi đã không sao chép và dán mã mới để tôi đoán rằng tôi đã bỏ lỡ mã đó. Tôi đã thử nghiệm, bây giờ nó sẽ chạy tốt. Trừ khi tôi hiểu nhầm các quy tắc I / O bằng cách nào đó.
busukxuan

5

EvilBot, Java

EvilBot không quan tâm đến việc chữa bệnh cho mọi người. Miễn là họ vẫn còn sống (kinda). Cố gắng làm cho phần còn lại của thế giới bị bệnh.

Trong thử nghiệm cục bộ của tôi, BlunderBot đã làm tốt hơn nhiều cho đến khi tôi cũng giới thiệu EvilBot. Có vẻ để lắc mọi thứ lên một chút.

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

Vũ khí phổ biến

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

Bot WMD là một kẻ ngốc: giữ tỷ lệ lây nhiễm của chính nó ở mức thấp và làm tăng số người khác.

Bot được xây dựng hoàn toàn cho các từ viết tắt, có thể không phải là một ứng cử viên mạnh mẽ, nhưng sẽ làm cho lĩnh vực cạnh tranh trở nên ... thú vị hơn một chút. Mã mượn từ TheCure và chỉ thay đổi chuỗi hành động của nó.


Về mặt kỹ thuật, bạn cũng đã thay đổi tên lớp; P
Captain Man

@DenhamCoote: Vui lòng không đi xung quanh các thẻ ngôn ngữ bổ sung. Nếu bạn định chỉnh sửa một bài đăng, hãy đảm bảo đó là một nội dung quan trọng hơn (ngữ pháp, định dạng, v.v.). Cảm ơn.
Zach Gates

Oh? Tôi đã từng có một lần chỉnh sửa duy nhất cho một trong những bài đăng của mình - Tôi chỉ theo dõi sự dẫn dắt của người khác ...
Denham Coote

@DenhamCoote Đó là một trong những "chỉnh sửa giá rẻ dễ dàng" không thêm gì, nhưng thực tế không bị cấm. Làm một loạt trong số họ bị spam.
Draco18

Không chắc ý của bạn là 'rẻ' - Nó làm tăng thêm khả năng đọc, đối với tôi ... Thử thách này có nhiều mã để đọc hơn so với thử thách chơi gôn thông thường, và do đó tôi nghĩ rằng việc đánh dấu cú pháp sẽ được hoan nghênh. Nó không giống như tôi đang làm điều này vì điểm, tôi chỉ tình cờ thích thử thách này.
Denham Coote

5

Graymalkin, Java

Trọng tâm chính của Graymalkin là giảm tỷ lệ lây nhiễm xuống 0 và tăng dân số khỏe mạnh. Nó không tin vào kiểm dịch ... tất nhiên trừ thế giới bên ngoài.

Bài viết đầu tiên của tôi - phê bình chào mừng. :)

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 có vẻ như bot của tôi không được bao gồm trong lần chạy gần đây nhất của bạn. Tôi tò mò muốn xem nó như thế nào!
hâm mộ

5

Bộ ba, 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;
        }

    }

}

Đầu tiên giữ cho công dân của nó sống, sau đó giữ cho họ khỏi lây nhiễm cho người khác, sau đó chữa cho họ.

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

    }

}

Giống như Triage, ngoại trừ nó bắt đầu bằng cách mở hoàn toàn các đường viền của nó. Điều này đảm bảo một quần thể khổng lồ vĩnh viễn bị nhiễm bệnh, gây bất tiện cho các bot khác và có khả năng đóng vai trò là người phá vỡ.


Triage tiếp tục cho Giá trị gia đình chạy lấy tiền. Mooch, mặt khác, tiếp tục xây dựng một đội quân lớn đáng sợ của những người bệnh. Làm tốt!
Mwr247

Có phải moochbot đang cố gắng giữ cho mọi người không bị nhiễm bệnh? Có phảitontt thisState.x sửa đổi giá trị Trạng thái và sau đó trò chơi thay đổi lại từ chuỗi mang lại cho bạn hiệu ứng gấp đôi? Ý tưởng tuyệt vời về ném CCC ở vòng cuối cùng
Eumel

Hiểu mã bây giờ và thấy câu hỏi thứ hai của tôi khá ngu ngốc
Eumel

Moochbot cuối cùng cũng cố gắng tạo ra một dân số khỏe mạnh, nhưng biên giới mở + tỷ lệ tử vong bằng không đảm bảo rằng dân số bị nhiễm bệnh sẽ tăng nhanh hơn nhiều.
lịch sử

4

InfectedHaven, Python 3

Một nơi an toàn cho những người bị nhiễm biên giới kín. Cố gắng để giảm thiểu gây chết người. Nếu được giảm thiểu, hãy cố gắng tăng tỷ lệ chết ở các tiểu bang khác để "mang lại lợi ích" cho người bị nhiễm tại địa phương.

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

Việc sửa đổi bạn đã thực hiện sẽ được tính đến cho lần chạy tiếp theo. Nó vẫn sẽ không cạnh tranh trong lần chạy thứ hai, vì chiến lược của bạn là tạo ra một Haven an toàn cho người bị nhiễm bệnh. Tuy nhiên, rất thú vị!
Thrax

2
@Thrax Lol cảm ơn, nó không thực sự là một chiến lược. Tôi chỉ nghĩ rằng những người bị nhiễm sẽ có khả năng bị thành kiến ​​hoặc phân biệt đối xử bởi người khỏe mạnh, vì vậy trong một thế giới hỗn loạn, điều này có thể sẽ xúc tác cho sự hình thành trạng thái "cho đồng bào bị nhiễm bệnh". Thành thật mà nói đây là một bot chỉ để vui, nhưng sau đó tôi thấy một chút tiềm năng trong đó nên tôi đã gửi.
busukxuan

@Thrax xin lỗi nếu điều này là bất tiện, nhưng tôi chỉ phát hiện ra tôi tính toán sai các điều kiện ở phía dưới nên tôi cập nhật lại.
busukxuan

4

Ngã tư đường, Python2

Crossroads là một quốc gia dân chủ, tập trung vào các giá trị khoa học tương lai. Giống như hầu hết các nền dân chủ, hầu hết các quyết định được đưa ra bởi các ủy ban không được đào tạo, ích kỷ và rối loạn chức năng, thường đưa ra các quyết định rất kỳ lạ và nghèo nàn - rõ ràng là ngẫu nhiên, thậm chí -. Tuy nhiên, chính phủ cuối cùng đang làm việc vì lợi ích chung của người dân và loài người.

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

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

4 cuộc chạy liên quan đến tất cả mọi người:

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

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

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

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

4 chạy mà không có "bot ngày tận thế":

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: Đã thấy chiến lược "phớt lờ thành công và tập trung vào việc giữ gìn sức khỏe" của CullBot, tôi đã tăng mức độ ưu tiên của việc giảm nhiễm trùng và lây nhiễm và chữa khỏi việc giảm sát thương, trong khi không từ bỏ sự tinh tế ngẫu nhiên theo quyết định của ủy ban.

EDIT2: Hóa ra bỏ qua sát thương với rất nhiều kẻ khủng bố xung quanh là xấu. mức độ ưu tiên cho việc giảm sát thương tăng trở lại, hiện đang nhân rộng với tỷ lệ gây chết người. Cũng đã sửa một số quyết định kém khác, như mở và đóng biên giới trên cùng một lượt, và tăng ngưỡng kiểm dịch, thích chữa bệnh thay vì có thể.

EDIT3: Một vài điều chỉnh ưu tiên nhỏ để xử lý các tình huống không được xử lý. Bây giờ nó đạt điểm cao nhất dù ngày tận thế có được bao gồm hay không, nghĩ rằng Salt đánh bại nó trong cả hai trường hợp. Phiếu bầu của tôi hiện đang có Salt cho người chiến thắng điều này.

EDIT4: Cải thiện thời gian và hiệu quả chữa bệnh.

EDIT5: Đã xóa các nội dung gây rối với việc di chuyển, vì nó không bao giờ đạt đến dân số 0 nữa và một số trường hợp đặc biệt khác để chữa bệnh.

EDIT6: Tăng mức độ ưu tiên của việc giảm tỷ lệ lây nhiễm trong trò chơi sớm. Xóa các dòng nhận xét. Tôi đã không cập nhật kết quả của các lần chạy thử, nhưng hiện tại nó đạt điểm cao hơn đáng kể trong các lần chạy không phải ngày tận thế (đánh bại FamilyValues, nhưng không phải là TrumpBot)

EDIT7: Số mũ tỷ lệ nhiễm / tỷ lệ lây nhiễm ở mức 50 để ngăn chặn việc sử dụng bộ nhớ cao.


Đợi đã ... Israel có được mô phỏng theo WWZ Jerusalem với những bức tường rất cao không?
busukxuan

@busukxuan đó là nguồn cảm hứng, vâng, ngoại trừ việc Israel này giống với Jerusalem hơn trong phim (bị tràn ngập nhanh chóng bởi bị nhiễm bệnh), vì về cơ bản, nó mở ra một biên giới rộng lớn. Kế hoạch ban đầu là để nó chủ yếu thực hiện 'P', nhưng nó không phải là một chiến lược hiệu quả.
quintopia

Hừm ... Có vẻ như CullBot thân yêu không thể theo kịp nữa khi có nhiều bot cố gắng tăng sự lây nhiễm.
busukxuan

thật tuyệt vời khi tôi thêm vào một bot để giảm nhiễm trùng (tăng tính ngẫu nhiên theo thứ tự)
quintopia

Vì vậy, về cơ bản CullBot khá không ổn định và phụ thuộc vào tình huống. Thật vậy, tôi giả sử khả năng lây nhiễm khi tôi viết mã. Dự phòng duy nhất lên tới 1 lần cách ly mỗi lượt.
busukxuan

3

Người giữ, Lua

Một KotH được thực hiện bởi một froggy đồng bào Pháp! Tôi đã phải tham gia cuộc thi này!

Bot này sẽ làm bất cứ điều gì có thể để giữ tỷ lệ lây nhiễm / lây nhiễm và tỷ lệ chết của nó càng thấp càng tốt. Ưu tiên lớn nhất của nó là có tỷ lệ sát thương gần 0. Sau đó, nó sẽ cố gắng đoán xem khi nào nên thử "nhập" nhiều người hơn.

Chỉnh sửa: Tôi giả sử những gì chúng tôi nhận argđược đã được sắp xếp bởi playerId. Đó là một giả định sai, vì vậy tôi đã thêm một loại bong bóng cho 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 .. Đã sửa mã nguồn, bây giờ sử dụng input=arg[1]thay vì input=io.read().
Katenkyo

3

MadScienceBot, Python2

Bạn biết thế giới này cần gì không?

KHOA HỌC THÊM!

Làm thế nào để chúng ta có được KHOA HỌC THÊM?

VỚI BRAINZZ

Chỉ chữa cho mọi người ở giây cuối cùng, không thể quan tâm đến họ ngoại trừ vòng 50. Cố gắng trở thành một trang trại zombie mỗi vòng khác

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

Này, đây là bài viết đầu tiên của tôi trên trang web này. Về cơ bản, tôi chỉ lấy một trong các bot mẫu và thay đổi các dòng liên quan đến đầu ra.

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

}

}

Tôi hy vọng điều này là ổn và bot đã làm khá tốt trong các lần chạy của riêng tôi. Bởi vì ai cần sự sống nếu bạn có thể có 30 người khỏe mạnh và số lượng nhiễm trùng tối đa vào cuối. Nó bắt đầu trò chơi với 3x BioTerrorism để bắt đầu mọi thứ và cố gắng giữ tỷ lệ chết của địa phương ở mức thấp. Nếu nó nhỏ hơn 4, nó sẽ tăng tỷ lệ lây nhiễm và lây nhiễm toàn cầu với Phổ biến.


Chào mừng bạn đến với PPCG :-) Hy vọng bạn có một khoảng thời gian vui vẻ ở đây
busukxuan

Điều này dường như đang làm tốt cho đến nay. Chào mừng bạn đến với PPCG, và công việc tốt!
Rɪᴋᴇʀ

2

Phổ biếnBot, Ruby

Bot này sẽ Chữa miễn là còn 10 hoặc nhiều hơn để chữa. Tiếp theo, nếu tỷ lệ lây nhiễm ít nhất là 4, bot sẽ giảm nó. Tất cả các hành động khác được dành để tăng tỷ lệ lây nhiễm, điều này sẽ không làm tổn thương tôi, vì tôi không bị nhiễm bệnh.

#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 sợ mọi người, giải pháp cho dịch bệnh của anh ta là cô lập dân số, chữa bệnh cho những người anh ta có thể và cô lập họ khi anh ta không thể. Anh ta không bận tâm với tất cả những điều vô nghĩa này, anh ta chỉ cố gắng để giữ cho người của mình còn sống.

Kích hoạt XenoBot như vậy:

node xenobot.js [data]

Mã số:

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

Chiến lược gia, Python

Bot này thực sự nghiêm túc về việc sống sót. Anh ấy đã phân tích các chiến lược có thể, và đưa ra phương pháp chiến thắng của riêng mình. Mà bây giờ anh ấy sẽ ghi lại trong các bình luận nguồn, bởi vì anh ấy là một chàng trai tốt và cũng muốn người khác sống sót.

Gọi với 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

Mở và đóng

Bắt đầu trò chơi bằng cách mở các biên giới, sau đó để tất cả những người bệnh đến. Sau khi chúng ta có một dân số bệnh lớn (vòng 30), đóng cửa biên giới và làm việc để chữa bệnh.

#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

Hai bot Python nữa

Người israel

Nó tương tự như Mooch, nhưng có lẽ không hoàn hảo như Mooch, ngoại trừ trong những dịp hiếm hoi khi nó tốt hơn nhiều:

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]

chữ thập đỏ

Giống như người theo chủ nghĩa hòa bình, ngoại trừ cố gắng để giữ cho chính người dân của mình khỏi chết. Thất bại thảm hại về điều này, nhưng thật tuyệt khi có một trận giao hữu khác trên sân chơi.

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)

Tôi là lửa; Ta la tử thân.

Smaug tạo ra càng nhiều cái chết càng tốt, bất kể nó xảy ra ở đâu.

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

Nếu bạn đang cố gắng đánh gôn một polyglot, tệp trống sẽ ngắn hơn và thực hiện chính xác những gì người theo dõi thực hiện (và cũng như điều đó xảy ra, chính xác là những gì thụ động thực hiện - hai hành vi giống hệt nhau), bởi vì trình thông dịch thay thế NNN cho một Độ dài 0 đáp ứng.
quintopia

Tài khoản
Ngáy ngủ

2

Xóa bị nhiễm (Python)

Mặc dù tất cả các logic ngẫu nhiên, tôi khá nó hiếm hoi cho này để trả lại bất cứ điều gì nhưng của Q và C (các biện pháp phòng ngừa bao giờ dường như hữu ích). Ồ tốt Có thể mượn một số của nó cho một bot khác, nhưng để lại trong trường hợp nó giúp.

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

from sys import argv

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

my_town = find_me(args)

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

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

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

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

@Thrax Bot này đã được cập nhật
SnoringFrog

2

CureThenQuarantine, Java

Nhà nước đã đưa ra một chính sách chữa trị cho những người may mắn đó và sau đó cách ly phần còn lại của những người bị nhiễm bệnh. Một khi dân số bị nhiễm giảm thì tập trung vào việc giảm tỷ lệ địa phương và sau đó giúp giảm tỷ lệ toàn cầu.

Các biên giới được đóng lại để đảm bảo không có sự di cư bị nhiễm bệnh vào tiểu bang.

Tôi mới chỉ thử bot với java và python bot ... có vẻ như nó chống lại chúng. Có vẻ như bot của tôi hoạt động tương tự như CullBot.

public class CureThenQuarantine {
    static int playerID;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2

Nhà nghiên cứu, Java

Bot này tập trung vào nghiên cứu. Nếu số lượng người nhiễm bệnh dưới 15, nó sẽ cố gắng chữa trị cho họ. Nếu nó cao hơn thế, nó chọn giải pháp hiệu quả hơn .

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
Ngôn ngữ Java, tôi đoán ??
mèo

2

Piecemeal, Java

Dựa trên bot trước đây của tôi (CureThenQuarantine), tôi đã phát hiện ra rằng với các bot hung hăng đang chơi, không cần phải cách ly vì người bị nhiễm bệnh sẽ chết rất nhanh, vì vậy bot này sẽ chữa trị theo cơ hội cho 10 lượt bị nhiễm (mỗi lần di chuyển hoặc từ nhiễm trùng từ dân số khỏe mạnh). Sau đó, nó sẽ sử dụng các hành động còn lại để đảm bảo dân số khỏe mạnh vẫn khỏe mạnh dựa vào sinh đẻ để tăng dân số khỏe mạnh.

Các biên giới được đóng lại để đảm bảo không có sự di cư bị nhiễm bệnh vào tiểu bang.

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;
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.