KOTH: โรคระบาดทั่วโลก


82

ผลสุดท้ายอยู่ที่นี่แล้ว!

บทนำ

ในปี 2042 โลกมีประชากรมากเกินไป โลกาภิวัตน์ความแออัดยัดเยียดวิถีชีวิตใหม่และการขาดสุขอนามัยทั่วโลกทำให้เกิดการระบาดใหญ่ครั้งใหม่ ในช่วงเวลาที่ยากลำบากผู้นำรัฐต้องจัดการกับสถานการณ์ คุณไม่สามารถทำลายประชากรของคุณได้ แต่บางทีคุณอาจได้รับประโยชน์จากการปล่อยให้เพื่อนบ้านของคุณตาย ...

อภิธานศัพท์

สุขภาพ : คนไม่ได้ติดเชื้อ
ที่ติดเชื้อ : คนที่ตายจากโรคระบาด
ตายตัวนับไม่มีผลกระทบโดยเฉพาะอย่างยิ่ง (เฉพาะคะแนน)
อัตราการติดเชื้อ : จำนวนสุขภาพที่จะกลายเป็นติดเชื้อเปิดแต่ละ
Contagion อัตราร้อยละของเชื้อที่จะแปลงเพื่อสุขภาพที่จะติดเชื้อเปิดแต่ละ
Lethality อัตราร้อยละของเชื้อที่จะตายในแต่ละเปิด
การโยกย้ายอัตราร้อยละของทั้งสุขภาพและการติดเชื้อที่จะย้าย / อพยพเปิดแต่ละ
ท้องถิ่น: มีผลกับรัฐของคุณเท่านั้น
Global : มีผลกับทุกรัฐ

หลัก

แต่ละผู้เล่นจะจัดการหนึ่งเมืองที่เริ่มต้นด้วย100 คน แต่น่าเสียดายที่ในหมู่พวกเขาเป็นหนึ่งในการติดเชื้อ

เกมดังกล่าวเป็นแบบเลี้ยว เทิร์นประกอบด้วยเจ็ดขั้นตอนสุดท้ายคือการโต้ตอบ (ขอบอทสำหรับคำสั่ง) คำสั่งของผู้เล่นจะถูกสุ่มทุกรอบ ขั้นตอนต่อไปจะเริ่มขึ้นเมื่อทุกขั้นตอนก่อนหน้านี้ถูกดำเนินการโดยทุกเมือง (เทิร์น 1: ผู้เล่น 1, ผู้เล่น 2, ผู้เล่น 3 ... ; เปิด 2: ผู้เล่น 3, ผู้เล่น 2, ผู้เล่น 1 ... ):

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

คอนโทรลเลอร์จะให้อินพุตกับคุณผ่านอาร์กิวเมนต์ของคำสั่งและโปรแกรมของคุณจะต้องเอาต์พุตผ่าน stdout

วากยสัมพันธ์

อินพุต

แต่ละครั้งที่โปรแกรมของคุณถูกเรียกมันจะได้รับข้อโต้แย้งในรูปแบบนี้:

Round;YourPlayerId;PlayerId_Healthy_Infected_Dead_InfectionRate_ContagionRate_LethalityRate_MigrationRate;PlayerId_Healthy_Infected_Dead_InfectionRate_ContagionRate_LethalityRate_MigrationRate;...

รอบเป็นดัชนี 1

ตัวอย่างอินพุต

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

ที่นี่คุณจะเห็นว่ามันเป็นรอบที่ 6 และคุณเป็นผู้เล่น 2 คุณมี 20 คนที่มีสุขภาพดีติดเชื้อ 53 คนตาย 62 คนอัตราการติดเชื้อ 16% อัตราการติดเชื้อ 20% อัตราการตาย 35% และอัตราการย้ายถิ่น 5%

เอาท์พุต

คุณต้องส่งออกอักขระสามตัว (ไม่เว้นวรรคไม่มีตัวคั่น) ซึ่งแต่ละตัวสอดคล้องกับการกระทำหนึ่งที่คุณจะต้องทำในเทิร์นนี้ คำสั่งของตัวละครกำหนดลำดับของการกระทำ คุณสามารถแสดงผลการกระทำเดียวกันหลาย ๆ ครั้ง

N: Do N othing
M: การวิจัยM icrobiology [ผลกระทบ: ลดท้องถิ่นอัตราการติดเชื้อขึ้น 4%]
E: การวิจัยE pidemiology [ผลกระทบ: ลดท้องถิ่นอัตรา Contagion 8%]
I: การวิจัยฉัน mmunology [ผลกระทบ: ลดท้องถิ่นอัตรา Lethality 4%]
V: วิจัยV accination [ผลกระทบ: ลดท้องถิ่นอัตราการติดเชื้อโดยหนึ่งลดท้องถิ่นอัตรา Contagion 4% ลดท้องถิ่นอัตรา Lethality 2%]
C: ให้C ure [ผลกระทบ: แปลง 10 ในท้องถิ่นที่ติดเชื้อเพื่อสุขภาพ ]
Q: Q uarantine [ผลกระทบ: เอา 30 ท้องถิ่นที่ติดเชื้อ ]
O: Oปากกาพรมแดน [ผลกระทบ: เพิ่มท้องถิ่นอัตราการย้ายถิ่นโดย 10%]
B: ปิดBคำสั่ง [ผลกระทบ: ลดท้องถิ่นอัตราการย้ายถิ่นโดย 10%]
T: Bio T errorism [ผลกระทบ: แปลง 4 สุขภาพดีทั่วโลกสู่การติดเชื้อ ]
W: eaponization W [ผลกระทบ: เพิ่มอัตราการติดเชื้อทั่วโลก1, เพิ่มอัตราการตายในระดับโลก2%]
D: การเผยแพร่D [ผลกระทบ: เพิ่มอัตราการติดเชื้อทั่วโลกโดยที่ 1 เพิ่มขึ้นทั่วโลกอัตรา Contagion 2%]
P: P acification [ผลกระทบ: ลดโลกอัตราการติดเชื้อโดยที่ 1 ลดลงทั่วโลกอัตรา Contagion 1% ลดลงทั่วโลกอัตรา Lethality 1%]

เพลย์

ทุกขั้นตอน

คำสั่งไม่ถูกต้อง = ไม่มีการ
เพิ่มเปอร์เซ็นต์เช่นจำนวนเต็ม 10% - 4% = 6% เมื่อมีการใช้เปอร์เซ็นต์ในสูตรผลลัพธ์จะถูกปูพื้น

ขั้นตอนที่ 1: การกลายพันธุ์

การระบาดใหญ่เริ่มรุนแรงขึ้น แต่ละเทิร์นจะสุ่มรับหนึ่งในคุณสมบัติเหล่านี้ (การกลายพันธุ์นี้ส่งผลกระทบต่อผู้เล่นทุกคนในครั้งเดียว):

  • เพิ่มอัตราการติดเชื้อทั่วโลก2
  • เพิ่มอัตราการแพร่กระจายทั่วโลก5%
  • เพิ่มอัตราการตายของโลก5%

ขั้นตอนที่ 2: การสืบพันธุ์

ทุก ๆ ห้ารอบ (รอบ 5, 10, 15 ... ) พลเมืองใหม่จะเกิด แต่ละคู่ของHealthyจะสร้างหนึ่งHealthy (23 Healthyสร้าง 11 Healthyใหม่) คู่ของแต่ละคนที่ติดเชื้อจะทำให้คนที่ติดเชื้อ

ขั้นตอนที่ 3: การย้ายถิ่น

แต่ละเทิร์นร้อยละของสุขภาพและติดเชื้อจะออกจากรัฐขึ้นอยู่กับอัตราการย้ายถิ่นของพวกเขา(10 สุขภาพจะออกจากรัฐที่มี 100 สุขภาพและ 10% อัตราการย้ายถิ่น ) จากนั้นแรงงานข้ามชาติที่จะได้รับการกระจายในทุกรัฐอีกครั้งหนึ่งทั้งนี้ขึ้นอยู่กับการโยกย้ายอัตรา (อัตราของแต่ละรัฐมีการถ่วงน้ำหนักและจากนั้นแรงงานทั้งหมดจะถูกกระจายไปตามลำดับ)

ขั้นตอนที่ 4: การติดเชื้อ

สุขภาพของแต่ละรัฐจะถูกแปลงให้ติดเชื้อตามอัตราการติดเชื้อ

ขั้นตอนที่ 5: การติดต่อ

สุขภาพของแต่ละรัฐจะถูกแปลงให้ติดเชื้อตามContagion อัตรา จำนวนที่มีการคำนวณโดยการคูณติดเชื้อโดยอัตราการติดเชื้อ

ขั้นตอนที่ 6: การสูญพันธุ์

การติดเชื้อจะถูกเปลี่ยนเป็นตายตามอัตราการตาย จำนวนที่มีการคำนวณโดยการคูณติดเชื้อโดยอัตรา Lethality

เฟส 7: ผู้เล่นเลี้ยว

ผู้เล่นแต่ละคนได้รับการป้อนข้อมูลและจะต้องส่งออกการกระทำสามอย่างที่จะดำเนินการตามลำดับพวกเขาออก

กฎระเบียบ

  • ไม่ควรเขียนบอทเพื่อเอาชนะหรือสนับสนุนบอทอื่น ๆ โดยเฉพาะ
  • อนุญาตให้เขียนไฟล์ได้ โปรดเขียนถึง "yoursubmissionname.txt" โฟลเดอร์จะถูกทำให้ว่างเปล่าก่อนที่เกมจะเริ่ม ทรัพยากรภายนอกอื่น ๆ ไม่ได้รับอนุญาต
  • ข้อมูลที่คุณส่งมีหนึ่งวินาทีในการตอบกลับ (ต่อเมือง)
  • ให้คำสั่งเพื่อรวบรวมและเรียกใช้การส่งของคุณ

การชนะ

ผู้ชนะคือผู้ที่มีสุขภาพดีที่สุดหลังจาก 50 รอบ หากผู้เล่นคนสุดท้ายมีชีวิต (มากกว่า 0 สุขภาพหรือติดเชื้อ ) เกมจะหยุดและเขาชนะ หากผู้เล่นหลายคนมีจำนวนเดียวกันของสุขภาพหนึ่งที่มีมากที่สุดที่ติดเชื้อจะชนะแล้วคนที่มีน้อยกว่าตาย s

ตัวควบคุม

คุณสามารถค้นหาตัวควบคุมบน GitHub นอกจากนี้ยังมีบอตสามตัวอย่างที่เขียนด้วย Java
เพื่อให้มันทำงานให้ตรวจสอบโครงการและเปิดใน Java IDE ของคุณ จุดเริ่มต้นในวิธีการของการเรียนmain Gameต้องใช้ Java 8

ในการเพิ่มบ็อตอันดับแรกคุณต้องใช้เวอร์ชันรวบรวมสำหรับ Java (ไฟล์. classclass) หรือแหล่งที่มาสำหรับภาษาที่ตีความ วางไว้ในโฟลเดอร์รูทของโครงการ จากนั้นสร้างคลาส Java ใหม่ในplayersแพ็คเกจ (คุณสามารถนำตัวอย่างบนบอตที่มีอยู่แล้ว) ชั้นนี้จะต้องดำเนินการเพื่อแทนที่วิธีPlayer String getCmd()String ที่ส่งคืนคือคำสั่ง shell เพื่อรันบ็อตของคุณ เช่นคุณสามารถทำให้การทำงานของ ธ return "C:\Ruby\bin\ruby.exe MyBot.rb";ปททับทิมด้วยคำสั่งนี้ ในที่สุดเพิ่ม bot ในplayersอาร์เรย์ที่ด้านบนของGameชั้นเรียน

ผลลัพธ์สุดท้าย (2016-03-04 08:22 GMT)

ทั่วโลก (100 ชื่อเสียง):

ผลการค้นหา 100 เกม: http://pasted.co/942200ff

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

Doomsday-less (200 ชื่อเสียง):

ผลการค้นหา 100 เกม: http://pasted.co/220b575b

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

ขอบคุณทุกคนที่เข้าร่วม ฉันหวังว่าคุณจะมีเวลามากในการออกแบบและเขียนโปรแกรมบอทของคุณเหมือนที่ฉันเล่นเกม


9
เราจะได้รับคำสั่งE xecute ที่ฆาตกรรมจำนวน X ที่ติดเชื้อ (เปลี่ยนพวกมันให้ตาย)? อาจไม่ใช่วิธีการชนะได้ แต่เป็นการกระทำที่ดูเหมือนถูกต้องตามกฎหมาย เว้นแต่จะเป็นสิ่งที่กักกัน (ไม่ชัดเจน)
Draco18s

3
บันทึกไวยกรณ์ด่วน: "Sane" หมายถึง "จิตใจมั่นคง"; คำที่คุณ (อาจ) กำลังมองหาที่นี่คือ "สุขภาพดี" (ฉันจะถูกต้องในการคาดเดาว่าภาษาแรกของคุณเป็นภาษาสเปนที่ "sano" หมายถึง "สุขภาพดี" หรือบางสิ่งที่เกี่ยวข้องอย่างใกล้ชิด?)
Mason Wheeler

5
@MasonWheeler ทราบ nitpicking คำศัพท์: หมายเหตุของคุณเป็นคำศัพท์หรือคำศัพท์ที่ทราบเนื่องจากไม่มีส่วนเกี่ยวข้องกับไวยากรณ์;)
ม.ค.

3
@Thrax วิธีการเลี้ยวในขณะนี้ได้รับการจัดการ (สุ่มที่จุดเริ่มต้นคำสั่งเดียวกันจากนั้นเป็นต้นไป) ให้ผู้เล่นที่มาในภายหลังเพื่อเปิดประโยชน์มากซึ่งทำให้ผลลัพธ์ที่แตกต่างกันอย่างดุเดือด บางทีถ้าคุณ 1) สุ่มลำดับรอบในแต่ละรอบหรือ 2) ทำให้ทุกคนดูสถานะเดียวกันระหว่างตาของพวกเขาและใช้การเปลี่ยนแปลงกับทุกคนพร้อมกันในตอนท้ายของรอบผลที่ได้อาจมีความสมดุลมากขึ้นและเป็นไปตาม เพิ่มเติมเกี่ยวกับคุณภาพของการส่ง ฉันทดสอบตัวเลือกแรกและผลลัพธ์นั้นสอดคล้องกันมากขึ้น
Mwr247

7
@Thrax ขณะนี้มีบอทมากเกินไปที่มีอยู่เพียงเพื่อ "ทำลายโลก" แม้ว่านี่จะเป็นความท้าทายที่สนุก แต่เมื่อถึงจุดที่บอทพยายามแข่งขันไม่สามารถตอบโต้ได้อย่างมีประสิทธิภาพอีกต่อไปและเราก็ทิ้งไว้กับบอทใด ๆ ที่ตั้งโปรแกรมให้ "Cure X 3" ในตอนท้ายในฐานะผู้ชนะ ฉันอยากจะแนะนำการเปลี่ยนแปลงกฎเพื่อที่จะได้รับการพิจารณาสำหรับ KOTH อย่างน้อยบอตต้องมีความสามารถในการจบลงด้วย "sanes" ที่เป็นบวกในการแข่งขัน 1 ต่อ 1 กับ PassiveBot? ความท้าทายคือความสนุกมากขึ้นเมื่อกลยุทธ์มีผลจริง
Mwr247

คำตอบ:


12

ค่านิยมครอบครัวโหนด (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(''));

ค่านิยมครอบครัวมุ่งเน้นไปที่การดูแลรักษาและป้องกันตนเองและดำเนินการจนถึงที่สุดเท่านั้น มันใช้ระบบค่าจุดเพื่อกำหนดแนวทางที่ดีที่สุดในการดำเนินการแล้วปรับค่าสถานะของตัวเองเพื่อกำหนดลำดับความสำคัญต่อไปให้ดียิ่งขึ้น ในกรณีที่เสมอกันจะสุ่มเลือกจากตัวเลือกที่ดีที่สุด

แก้ไข: ดูเหมือนจะไม่เป็นไรจนถึง:

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

Pacifist, Node

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

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

ด้วยการให้ความสำคัญกับการฆ่าและการเสียชีวิตผู้เชื่อว่าสุขภาพโลกที่เข้มแข็งหมายถึงสุขภาพในท้องถิ่นที่เข้มแข็ง ดังนั้นพวกเขาจึงมุ่งเน้นไปที่การลดความเจ็บป่วยทั่วโลกในขณะที่เปิดพรมแดนบางส่วนเพื่อให้คุณงามความดีแพร่กระจายไปทั่ว


ว้าวฉันไม่ได้คาดหวังว่า TheCure จะเป็นคนสุดท้าย
justhalf

@ justhalf ด้วยผู้เล่นจำนวนมากนี้พวกเขาทั้งหมดจบลงด้วยการเคลื่อนไหวมากมายบนกระดาน: เพียงแค่วิ่งตอนนี้ที่ TheCure จบลงในอันดับที่ 3 ทั้งค่า FamilyVal และ Triage มักจะอยู่ในสองอันดับแรกเสมอโดย FV จะได้รับ # 1 เป็นส่วนใหญ่
Mwr247

อืมภาระงานนั้นถูกกำหนดไว้แล้วใช่ไหม? ดังนั้นเนื่องจากผู้เล่นบางคนใส่การสุ่มเข้าไปในอัลกอริทึมของพวกเขา?
justhalf

@justhalf ปัจจัยที่ใหญ่ที่สุดโดยไกลดูเหมือนจะสั่งเปิดซึ่งถูกสุ่ม (แต่เหมือนกันสำหรับทุกรอบในเกม) การไปก่อนหมายความว่าคุณไม่มีโอกาสโต้ตอบกับการกระทำของทุกคนในช่วงเทิร์นปัจจุบันในขณะที่การทำครั้งสุดท้ายช่วยให้คุณสามารถปรับให้เข้ากับสิ่งที่ผู้เล่นคนอื่นได้ทำกับคุณ
Mwr247

1
@ justhalf ฉันเพิ่งทดสอบคอนโทรลเลอร์ที่ปรับเปลี่ยนที่สุ่มลำดับรอบในแต่ละรอบและผลลัพธ์มีความสอดคล้องมากขึ้นในขณะนี้
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());
}

ทำให้อเมริกายิ่งใหญ่ด้วยการรักษาผู้ติดเชื้อทั้งหมดเว้นแต่จะมีเพียง 2 คนหรือน้อยกว่านั้น ชนกลุ่มน้อยจะถูกละเว้น

มีการติดเชื้อน้อยลงทำให้ยาถูกลง

ไม่มีความต้องการผู้อพยพ - พวกเขานำเชื้อมาเท่านั้น

หากไม่มีอะไรเหลือให้ทิ้งระเบิดผู้เล่นคนอื่น

คำสั่งกลับคำสั่งไปทางอเมริการะเบิดก่อนรักษาคนในภายหลัง

แก้ไข: แก้ไขข้อผิดพลาดที่จะรักษาสแปมเนื่องจากจำนวนที่ติดเชื้อไม่ลดลงหลังจากการรักษา

Trumpscript

ขอบคุณ J Atkin ที่ให้บริการ:

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

ทั้งหมดหรือไม่มีอะไร 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))

Rscript AllOrNothing.Rเรียกโดย

ความคิดที่นี่อยู่ในมือข้างหนึ่งเพื่อ จำกัด ความเสี่ยงสูงสุดของการติดเชื้อ (โดยการลดอัตราการติดเชื้อ, การรักษาผู้ติดเชื้อและป้องกันการติดเชื้อเพื่ออพยพ) และในทางกลับกันเพื่อเพิ่มความตายของโรคเพื่อให้คนที่ได้รับ ติดเชื้อตายก่อนปนเปื้อนอื่น ๆ

แก้ไข: tweaked กลยุทธ์เล็กน้อย


ดีมากดูเหมือนว่าจะทำสิ่งที่ดีเป็นพิเศษกับ 21 รัฐอื่น ๆ !
Thrax

@Thrax แน่นอนว่าบางครั้งในระหว่างการวิ่งมันก็ยังล้มเหลวอย่างน่าประทับใจ :) แต่บ่อยครั้งที่มันประสบความสำเร็จเช่นเดียวกับในการทดสอบของคุณ
plannapus

นั่นเป็นบอตที่น่าทึ่งงานที่ดี
Eumel

มันดูคล้ายกับสภาพที่ฉันจะเขียนเมื่อฉันพบเวลาถ้าไม่เหมือนกัน ของฉันมีอยู่ในหัวของฉัน แต่ ("ถ้าติดเชื้อ 20ish กักกันไว้ถ้า 10ish รักษาพวกมัน ฯลฯ ") ทำได้ดีมาก
Draco18s

13

แพทย์

Medic มักจะ ... มีความสุขดังนั้นจงพูดโดยผู้คนที่ไม่มียา เขาชอบฝึกหัดยาดังนั้นนั่นคือทั้งหมดที่เขาทำ เขาชอบงูเหลือมด้วยดังนั้นเขาจึงเขียนโค้ดของเขาไว้ใน Python ทุกอย่างสมเหตุสมผลถ้าคุณคิดเกี่ยวกับมัน ไม่มันไม่ได้จริงๆ ที่จริงแล้วมันไม่ ...

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)

ฉันมาที่นี่เพื่อช่วย

ฉันมาที่นี่เพื่อช่วย


4
Pythons เหมือนในแท่งของ Asclepius? หรือเหมือนพนักงานของ Hermes? มันทำให้รู้สึกบางอย่าง ...
ไม่ใช่ชาร์ลส์ที่

3
ทั้ง! ทั้งสอง! ทำไมจะไม่ล่ะ? ทุกอย่างสมเหตุสมผล!
Conor O'Brien

7
++ 1; สำหรับ TF2: D
cat

11

การรักษา

ดูเหมือนจะง่ายเกินไป แต่ก็เป็นวิธีที่ดีในการลดอัตราการติดเชื้อ / เสียชีวิต ทุกเทิร์นเอาต์พุตMCQ:

  • ลดอัตราการติดเชื้อ
  • รักษาผู้ติดเชื้อบางคน
  • กักกันเชื้อบางส่วนที่เหลือ

แค่นั้นแหละ!

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

ฉันอาจปรับปรุงสิ่งนี้ได้ด้วยการเพิ่มM(หรือB) ถ้าฉันยังไม่ติดเชื้อแทนที่จะทำการรักษาและกักกัน แต่ฉันต้องการดูว่าสิ่งนี้ทำได้ดีเพียงใด น่าเสียดายที่ผลข้างเคียงหนึ่งของการโพสต์ก่อนคือยากที่จะวัดประสิทธิภาพ:


9

ชั่วร้าย Kotlin

จำไว้ว่า WICKED นั้นดี

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

}

รวบรวมกับ: kotlinc WICKED.kt
เรียกใช้ด้วย:kotlin wicked.WICKEDKt

PFC, Kotlin

พยายามที่จะปล่อยโรคให้กับทุกคน

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

}

รวบรวมกับ: kotlinc PFC.kt
เรียกใช้ด้วย:kotlin pfc.PFCKt

ผู้ก่อการร้าย Kotlin

พยายามทำให้ทุกคนตาย

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

}

รวบรวมกับ: kotlinc Terrorist.kt
เรียกใช้ด้วย:kotlin terrorist.TerroristKt


การคอมไพล์ให้โฟลเดอร์ "wicked" ที่มีคลาส Game, Player และ WICKEDkt ทำงานตามที่คุณอธิบายผลตอบแทน: "ข้อผิดพลาด: ไม่สามารถค้นหาหรือโหลดคลาสหลักชั่วร้าย WICKEDKt"
Mwr247

มันแปลกมากมันทำงานบนคอมพิวเตอร์ของฉันได้ดี คุณแน่ใจหรือว่าไฟล์คลาส WICKEDkt ไม่ได้ชื่อ WICKEDKt จริง ๆ ? นอกจากนี้ตรวจสอบให้แน่ใจว่าไดเรกทอรีการทำงานของคุณไม่ได้อยู่ในโฟลเดอร์ที่ชั่วร้าย
TheNumberOne

มันเป็น WICKEDKt ฉันพิมพ์ผิดในความคิดเห็น
Mwr247

@ Mwr247 คุณออกจากโฟลเดอร์ชั่วที่สร้างไว้ในโฟลเดอร์ส่งหรือไม่? คุณย้ายไฟล์ที่สร้างขึ้นจากโฟลเดอร์ wicked หรือไม่?
TheNumberOne

ความชั่วร้ายเป็นสิ่งที่ดี ... เจ้าและการอ้างอิงของคุณกับสิ่งที่ฉันเพิ่งอ่าน
ArtOfCode

9

มาดากัสการ์ชวา

ใช่ไปเส้นทางมาดากัสการ์ รอบแรกเราBBBต้องปิดพรมแดนของเรา มิฉะนั้นจะให้การรักษาและมุ่งเน้นไปที่วัคซีนท้องถิ่น

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

แก้ไข 1 - ฉันเพิ่มเติมมาดากัสการ์จะ
แก้ไข 2 - ขอบคุณ @Geobits สำหรับการstartsWithแจ้งเตือน


ถ้า Geobits ถูกต้องเกี่ยวกับอัตราการย้ายข้อมูลเริ่มต้นที่ 5 และไม่ลดลงเหลือศูนย์ B ก็ไม่ได้ทำอะไรเลย
quintopia

ปัจจุบันนี้ดูไม่เหมือนว่ามันจะรวบรวม if (b == true)(ซึ่งควรจะif (b)เป็นเรื่องของสไตล์) boolจะให้ข้อผิดพลาดเนื่องจากตัวแปรเรียกว่าจริง
ปีเตอร์เทย์เลอร์

จะไม่ถ้าตรวจสอบกับรอบ == 1 ทำงานได้ดีกว่าการสร้างไฟล์?
Eumel

1
@ TimmyD โชคดีที่รอบแรกไม่ได้มีการวิเคราะห์มากนัก เพียงตรวจสอบว่าอินพุตเริ่มต้นด้วย1;
Geobits

@Geobits ขอบคุณสำหรับการstartsWith()เตือน ง่ายกว่าการแยก;และพยายามที่จะเอาคืนและ ... บอกว่าฉันเป็นสนิมกับ Java
AdmBorkBork

7

เกลือ Kotlin

บอทนี้มีชีวิตรอดจนกว่าผู้เล่นที่น่ารังเกียจทั้งหมดจะตาย หลังจากนั้นจะรักษาประชากรและ repopulate เมืองกับคนที่มีสุขภาพ

บอทนี้มี 5 ขั้นตอน:

  1. ปิดพรมแดน
  2. อนุญาตให้ผู้ติดเชื้อตาย แต่ไม่เร็วเกินไป (การค้นหาว่าส่วนที่รวดเร็วเร็วแค่ไหนคือส่วนที่แข็ง)
  3. ป้องกันการติดเชื้อจากการติดเชื้อที่แข็งแรง
  4. รักษาผู้ติดเชื้อ (ด้วยเกลือ: P)
  5. สืบพันธุ์

นี่มันคือ:

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
}

รวบรวมกับ: kotlinc Salt.kt
เรียกใช้ด้วย:kotlin salt.SaltKt

แก้ไข:โอกาสสูงในการมีชีวิตรอดจนกว่าบอท "จบโลก" ส่วนใหญ่จะตาย

ตัวอย่างผลลัพธ์:

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)

กลยุทธ์ที่ดีมาก ฉันชอบที่คุณใช้ประโยชน์จากความตายในทางที่ "ดี"!
Thrax

เป็นงานที่ดีที่จะยุติบ็อต "จุดจบของโลก"! อย่างไรก็ตามเกลืออาจโค่นล้มได้หากมีบอทเหล่านั้นอีกสองสามตัวฉันไม่แน่ใจ ความสามารถในการเอาชีวิตรอดที่น่าประทับใจมากชายผู้ดีคนหนึ่ง
busukxuan

@busukxuan ตามที่เป็นอยู่ในปัจจุบันหลาย ๆ บอทจะต้องเพิ่มอัตราการตายสูงสุดก่อนที่พวกเขาจะสามารถฆ่ามันฆ่าตัวตายในกระบวนการ
TheNumberOne

7

PureBot (Haskell)

PureBot เกลียดสิ่งหนึ่ง: ผลข้างเคียง!
มันจะพยายามจัดการกับผลข้างเคียงทั้งหมดและหากทุกอย่างเป็นไปด้วยดีมันจะลดจำนวนผลข้างเคียงที่เกิดจากโลกภายนอก
นอกจากนี้ยังละเว้นผลข้างเคียงทั้งหมดในการคำนวณ
สิ่งนี้ทำให้มันเล่นได้ดีกว่ากับศัตรูที่แฝงอยู่ (อย่างไม่เปลี่ยนอัตราโลก)

ถ้าinfected, infection, contagion, lethalityและmigrationเป็นศูนย์ทั้งหมดก็จะช่วยให้บอทอื่น ๆ ที่มีP(สำหรับPure) คำสั่ง

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

ทำงานด้วย: runhaskell PureBot.hs


ว้าวช่างบริสุทธิ์อะไรกัน! ฉันชอบวิธีที่คุณตีความคำสั่ง P
busukxuan

ฉันเพิ่งติดตั้ง Haskell 7.10.3 และเมื่อฉันพยายามเรียกใช้ bot ของคุณมันจะรออย่างไม่มีกำหนด ฉันลองกับสิ่งนี้: runhaskell.exe PureBot.hs 1;0;0_97_3_0_2_5_15_5;1_97_3_0_2_5_15_5. มีอะไรอีกที่ฉันต้องทำก่อนเริ่มใช้งานหรือไม่
Thrax

@Thrax โอ้ขอโทษ ฉันคิดว่าคุณผ่านคำสั่งผ่าน stdin ... ถ้าไม่ฉันจะเปลี่ยนโปรแกรม
YoYoYonnY

คำสั่งถูกส่งเป็นอาร์กิวเมนต์ ฉันจะทำต่อไปหลังจากที่คุณอัพเดทบอทของคุณ
Thrax

@Thrax ในกรณีนี้ควรทำงานได้แล้ว
YoYoYonnY

7

เมืองที่ติดเชื้อชวา

เมืองที่ติดเชื้อจะไม่สนใจว่าผู้คนจะถูกรบกวนตราบเท่าที่พวกเขาไม่ตาย นี่เป็นสาเหตุที่ทำให้อัตราการตายในท้องถิ่นลดลงมากที่สุด

เมื่ออัตราการตายอยู่ในระดับต่ำมากแล้วจะใช้การกระทำที่เหลือเพื่อเพิ่มอัตราการตายทั่วโลกก่อนที่จะลดลง

เนื่องจากมันพยายามที่จะเป็นเมืองที่ใหญ่ที่สุดในรอบนี้ความสมดุลของการเข้าเมืองนั้นอาจเป็นเพียงเชิงลบดังนั้นการดำเนินการครั้งแรกของมันคือการปิดพรมแดน

ในช่วงเทิร์นสุดท้ายอัตราการตายไม่มีผลและการจัดอันดับนั้นทำกับจำนวนคนที่มีสติในเมืองดังนั้นจึงรักษาได้ 30 คนและหวังว่าจะเพียงพอ

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

บอทป้องกันตัวเองมาตรฐานที่ปิดพรมแดนและพยายามลดอัตราการติดเชื้อในเมือง มันทำโดยการกำจัดสัตว์พาหะ (เนื่องจากผู้ติดเชื้อไม่มีผลต่ออัตราการติดเชื้อจะต้องมีบางอย่างที่ทำกับเวกเตอร์ที่ไม่ใช่มนุษย์; โดยทั่วไปนี่คือ "วิจัยจุลชีววิทยา") บางครั้งมันก็เป็น "culls" มนุษย์ที่ติดเชื้อด้วย ... คุณรู้ไหมว่า AI ก็ทำผิดพลาดด้วย ...

# 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
ฉันไม่ใช่คน Python ดังนั้นฉันอาจทำสิ่งนี้ผิด แต่การใช้งานใน Python 3.4 ให้ "NameError: ชื่อ 'dictionary' ไม่ได้กำหนดไว้" ที่บรรทัดที่ 9
Mwr247

@ Mwr247 ขอบคุณปรากฎว่าฉันหมดใจเมื่อฉันเขียนรหัสการแยก ... มีปัญหามากกว่านั้นอีกมาก
busukxuan

ตอนนี้มันทำให้วัตถุ "TypeError: 'list' ไม่สามารถตีความได้ว่าเป็นจำนวนเต็ม" ในบรรทัดที่ 11
Mwr247

ตอนนี้มันใช้งานได้ =)
Mwr247

@ Mwr247 ฮ่า ๆ ! ฉันคิดว่าฉันคงที่แล้ว แต่ฉันไม่ได้คัดลอกและวางรหัสใหม่ดังนั้นฉันเดาว่าฉันพลาดไป ฉันทดสอบแล้วตอนนี้มันควรจะทำงานได้ดี นอกจากว่าฉันเข้าใจผิดกฎ I / O อย่างใด
busukxuan

5

EvilBot, Java

EvilBot ไม่สนใจเกี่ยวกับการรักษาผู้คน ตราบใดที่พวกเขายังมีชีวิตอยู่ (kinda) พยายามทำให้ส่วนที่เหลือของโลกป่วย

ในการทดสอบในพื้นที่ของฉัน BlunderBot ทำได้ดีขึ้นมากจนกระทั่งฉันยังได้เปิดตัว EvilBot ดูเหมือนจะเขย่าสิ่งต่าง ๆ เล็กน้อย

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

อาวุธที่ใช้ในการเผยแพร่

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

ธ ปท. WMD เป็นกระตุก: ทำให้อัตราการติดเชื้อของตัวเองต่ำและทำให้คนอื่น ๆ

บอทสร้างขึ้นมาเพื่อตัวย่อล้วนๆไม่ใช่คู่แข่งที่แข็งแกร่ง แต่จะทำให้สนามแข่งขันมีความน่าสนใจยิ่งขึ้น ... รหัสที่ยืมมาจาก TheCure และเพิ่งเปลี่ยนสตริงการกระทำ


ในทางเทคนิคคุณได้เปลี่ยนชื่อคลาสด้วยเช่นกัน
Captain Man

@DenhamCoote: โปรดอย่าไปแท็กภาษาที่เพิ่มจำนวนมาก หากคุณกำลังจะแก้ไขโพสต์ตรวจสอบให้แน่ใจว่ามันเป็นสิ่งที่สำคัญกว่า (ไวยากรณ์การจัดรูปแบบและอื่น ๆ ) ขอบคุณ
Zach Gates

โอ้? ฉันเคยมีที่เป็นเพียงการแก้ไขหนึ่งในโพสต์ของฉัน - ฉันเพียงแค่ทำตามนำของคนอื่น ...
Denham Coote

@DenhamCoote เป็นหนึ่งใน "การแก้ไขราคาถูกง่าย" ที่ไม่ได้เพิ่มอะไรเลย แต่ไม่ได้ถูกห้าม การทำกลุ่มของพวกเขาได้รับสแปม
Draco18s

ไม่แน่ใจว่าคุณหมายถึงอะไรโดย 'ถูก' - มันเพิ่มความสามารถในการอ่านสำหรับฉัน ... ความท้าทายนี้มีรหัสให้อ่านมากกว่าความท้าทายการเล่นกอล์ฟทั่วไปดังนั้นฉันจึงคิดว่าการเน้นไวยากรณ์น่ายินดี มันไม่ใช่ว่าฉันทำสิ่งนี้เพื่อจุดต่าง ๆ ฉันเพิ่งสนุกกับการท้าทายนี้
Denham Coote

5

Graymalkin, Java

จุดสนใจหลักของ Graymalkin คือลดอัตราการติดเชื้อเป็น 0 และเพิ่มจำนวนประชากรที่แข็งแรง ไม่เชื่อในการกักกัน ... ยกเว้นจากโลกภายนอกแน่นอน

ยินดีต้อนรับการวิจารณ์ครั้งแรกของฉัน :)

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 ดูเหมือนว่า bot ของฉันไม่ได้รวมอยู่ในการเรียกใช้ครั้งล่าสุดของคุณ ฉันอยากรู้ว่ามันเป็นอย่างไร!
teatrousers

5

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

    }

}

ก่อนอื่นปกป้องพลเมืองของตนให้รอดพ้นจากการแพร่เชื้อจากผู้อื่นแล้วรักษาพวกเขา

Mooch, Java

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

public class Mooch {

    int round;
    int phase;
    int playerID;

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

    State thisState;

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

    private void sleep(String[] args) {

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

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

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

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

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

        String output = "";

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

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

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

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

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

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

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

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

    }

    private class State {

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

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

        public int getOwnerId() {
            return ownerId;
        }

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

    }

}

เช่นเดียวกับ Triage ยกเว้นว่าเริ่มต้นโดยเปิดขอบอย่างสมบูรณ์ สิ่งนี้ทำให้มั่นใจได้ว่าประชากรยักษ์ที่ติดเชื้อตลอดจะทำให้บ็อตอื่นไม่สะดวกและอาจทำหน้าที่เป็นไทเบรก


Triage ยังคงให้คุณค่าของครอบครัวกับเงินทุน ในขณะเดียวกัน Mooch ก็สร้างกองทัพขนาดใหญ่ที่น่ากลัวของคนป่วย ทำได้ดี!
Mwr247

moochbot นั้นพยายามที่จะทำให้ทุกคนไม่ติดเชื้อใช่ไหม ไม่นี้State.xแก้ไขค่าสถานะแล้วเกมจะเปลี่ยนอีกครั้งจากสตริงที่ให้เอฟเฟกต์เป็นสองเท่าหรือไม่ ความคิดที่ดีเกี่ยวกับ thr CCC ในรอบสุดท้ายแม้ว่า
Eumel

เข้าใจรหัสในขณะนี้และพบว่าคำถามที่สองของฉันจะโง่สวย
Eumel

ในที่สุด Moochbot พยายามสร้างประชากรที่มีสุขภาพดี แต่เขตแดนที่เปิด + ศูนย์การตายทำให้มั่นใจได้ว่าประชากรที่ติดเชื้อจะเติบโตเร็วกว่ามาก
ประวัติศาสตร์

4

InfectedHaven, Python 3

safehaven สำหรับผู้ติดเชื้อที่มีพรมแดนปิด พยายามลดความตาย หากถูกย่อให้เล็กสุดพยายามเพิ่ม lethality ในรัฐอื่น ๆ เพื่อ "ประโยชน์" ในท้องถิ่นที่ติดเชื้อ

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

การปรับเปลี่ยนที่คุณทำจะถูกนำเข้าบัญชีสำหรับการทำงานครั้งต่อไป มันจะยังไม่แข่งขันในรอบที่สองเนื่องจากกลยุทธ์ของคุณในการสร้างที่หลบภัยให้ปลอดภัย อย่างไรก็ตามน่าสนใจมาก!
Thrax

2
@Thrax Lol ขอบคุณมันไม่ใช่กลยุทธ์จริงๆ ฉันแค่คิดว่าผู้ติดเชื้อจะมีอคติหรือถูกเลือกปฏิบัติโดยคนที่มีสุขภาพดีดังนั้นในโลกที่ยุ่งเหยิงน่าจะทำให้เกิดการก่อตัวของสถานะ "สำหรับเพื่อนที่ติดเชื้อ" ความจริงแล้วนี่เป็นบอทที่สนุกสนาน แต่แล้วฉันก็เห็นศักยภาพเล็กน้อยในนั้นดังนั้นฉันจึงส่ง
busukxuan

@Thrax ขออภัยถ้ามันไม่สะดวก แต่ฉันเพิ่งค้นพบว่าฉันคำนวณเงื่อนไขที่ด้านล่างดังนั้นฉันจึงอัปเดตอีกครั้ง
busukxuan

4

สี่แยก Python2

Crossroads เป็นประเทศประชาธิปไตยที่ให้ความสำคัญกับคุณค่าทางวิทยาศาสตร์แห่งอนาคต เช่นเดียวกับระบอบประชาธิปไตยส่วนใหญ่การตัดสินใจส่วนใหญ่จะทำโดยคณะกรรมการที่ผ่านการฝึกอบรมตามหลักวิทยาศาสตร์ความเห็นแก่ตัวและผิดปกติซึ่งมักจะทำให้เกิดความแปลกและน่าสงสาร อย่างไรก็ตามในที่สุดรัฐบาลก็ทำงานเพื่อผลประโยชน์ส่วนรวมของประชาชนและมนุษยชาติ

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 วิ่งเกี่ยวข้องกับทุกคน:

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 วิ่งโดยไม่มี "วันโลกาวินาศบอท":

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)

แก้ไข: เมื่อได้เห็น CullBot ที่ประสบความสำเร็จ "ไม่สนใจความอ่อนแอและมุ่งเน้นไปที่การรักษาสุขภาพของผู้คน" ฉันได้เพิ่มลำดับความสำคัญของการลดการติดเชื้อและการติดเชื้อและการรักษามากกว่าการลดอัตราการตาย

แก้ไข 2: ปรากฎว่าการเพิกเฉยต่อความชั่วร้ายกับผู้ก่อการร้ายจำนวนมากรอบ ๆ นั้นไม่ดี ลำดับความสำคัญสำหรับการลดอัตราการตายเพิ่มขึ้นอีกครั้งตอนนี้ปรับตามอัตราการตาย แก้ไขการตัดสินใจที่ไม่ดีอื่น ๆ เช่นเปิดและปิดพรมแดนในเทิร์นเดียวกันและเพิ่มเกณฑ์สำหรับการกักกันเลือกที่จะรักษาแทนหากเป็นไปได้

EDIT3: คู่ของการปรับลำดับความสำคัญเล็กน้อยเพื่อจัดการสถานการณ์ที่ไม่ได้รับการจัดการ ตอนนี้คะแนนอยู่ใกล้ด้านบนไม่ว่าจะเป็นวันโลกาวินาศรวมหรือไม่คิดว่าเกลือเต้นมันในทั้งสองกรณี การลงคะแนนของฉันขณะนี้มีซอลต์สำหรับผู้ชนะของสิ่งนี้

EDIT4: ปรับปรุงเวลาและประสิทธิภาพของการบ่ม

EDIT5: ลบสิ่งที่ยุ่งเหยิงกับการย้ายถิ่นฐานเนื่องจากมันไม่เคยกระทบประชากรเป็นศูนย์อีกต่อไปและบางกรณีที่พิเศษกว่าสำหรับการรักษา

EDIT6: เพิ่มลำดับความสำคัญของการลดอัตราการติดเชื้อในเกมแรก ลบบรรทัดที่มีความคิดเห็น ฉันไม่ได้อัปเดตผลลัพธ์ของการทดสอบการทำงาน แต่ตอนนี้คะแนนสูงขึ้นในการทำงานที่ไม่ใช่วันโลกาวินาศ (ตีออก FamilyValues ​​แต่ไม่ใช่ TrumpBot)

EDIT7: ขีดอัตราการติดเชื้อ / การติดเชื้อสูงสุดที่ 50 เพื่อป้องกันการใช้หน่วยความจำสูง


รอสักครู่ ... อิสราเอลเป็นแบบอย่างหลังจาก WWZ เยรูซาเลมที่มีกำแพงสูงมากหรือไม่?
busukxuan

@ busukxuan ที่เป็นแรงบันดาลใจใช่ยกเว้นว่าอิสราเอลนี้คล้ายกับเยรูซาเล็มในภาพยนตร์มากกว่า (ติดเชื้ออย่างรวดเร็วจากการติดเชื้อ) เนื่องจากมันเปิดกว้างมาก แผนเดิมคือให้ทำ 'P' เป็นส่วนใหญ่ แต่มันไม่ใช่กลยุทธ์ที่มีประสิทธิภาพ
quintopia

หืม ... ดูเหมือนว่าที่รัก CullBot จะไม่สามารถรักษาได้อีกต่อไปเมื่อมีบอทมากขึ้นที่พยายามเพิ่มการติดเชื้อ
busukxuan

มันไม่ดีเมื่อฉันเพิ่มเข้ามาในบอทที่จะขับรถลงการติดเชื้อ (ถึงจะเปิดการสุ่มตามลำดับ)
quintopia

ดังนั้นโดยทั่วไป CullBot ค่อนข้างไม่เสถียรและขึ้นอยู่กับสถานการณ์ อันที่จริงฉันถือว่าความสามารถในการติดเชื้อเกิดขึ้นเมื่อฉันเขียนโค้ด ทางเลือกเดียวคือมากถึง 1 การกักกันต่อเทิร์น
busukxuan

3

ผู้รักษาลัวะ

KotH ทำโดยกบฝรั่งเศสเพื่อน! ฉันต้องเข้าร่วมการแข่งขันนี้!

บอทนี้จะทำทุกอย่างที่เป็นไปได้เพื่อรักษาอัตราการติดเชื้อ / การติดต่อและการตายให้ต่ำที่สุดเท่าที่จะทำได้ สิ่งสำคัญที่สุดของมันคือการมีค่าใช้จ่ายที่ใกล้เคียงกับ 0 ใกล้เคียงจากนั้นจะพยายามเดาว่าเมื่อใดที่จะลอง "นำเข้า" ผู้คนจำนวนมาก

แก้ไข: ฉันคิดว่าสิ่งที่เราได้รับผ่านargเรียงตาม playerId 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 โอ้ .. แก้ไขรหัสที่มาตอนนี้ใช้แทนinput=arg[1] input=io.read()
Katenkyo

3

MadScienceBot, Python2

คุณรู้ไหมว่าโลกนี้ต้องการอะไร?

วิทยาศาสตร์มากขึ้น!

เราจะได้รับวิทยาศาสตร์มากขึ้นได้อย่างไร

ด้วย BRAINZZ

รักษาคนในวินาทีสุดท้ายไม่สามารถสนใจน้อยกว่าพวกเขายกเว้นในรอบ 50 พยายามเป็นฟาร์มซอมบี้ทุกรอบ

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

เฮ้นี่คือโพสต์แรกของฉันในเว็บไซต์นี้ โดยทั่วไปฉันเพิ่งเอาบ็อตตัวอย่างหนึ่งและเปลี่ยนบรรทัดที่เกี่ยวข้องกับเอาต์พุต

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

}

}

ฉันหวังว่ามันจะโอเคและบอททำได้ค่อนข้างดีในการวิ่งของฉัน เพราะผู้ที่ต้องการความเป็นอยู่หากคุณมีสุขภาพที่ดี 30 คนและจำนวนผู้ติดเชื้อสูงสุดในตอนท้าย มันเริ่มเกมด้วย 3x BioTerrorism เพื่อให้ทุกอย่างเริ่มต้นขึ้นและพยายามที่จะรักษาความเป็นท้องถิ่นที่ต่ำ ถ้ามันน้อยกว่า 4 มันจะพยายามเพิ่มอัตราการติดเชื้อทั่วโลกและอัตราการแพร่กระจายด้วยการเผยแพร่


ยินดีต้อนรับสู่ PPCG :-) หวังว่าคุณจะมีช่วงเวลาที่ดีที่นี่
busukxuan

ดูเหมือนว่าจะทำดี ยินดีต้อนรับสู่ PPCG และทำได้ดีมาก!
Rɪᴋᴇʀ

2

เผยแพร่ Bot, Ruby

บอทนี้จะรักษาตราบใดที่ 10 หรือมากกว่านั้นถูกปล่อยให้หายขาด ถัดไปหากอัตราการติดเชื้ออย่างน้อย 4 บอทจะลดลง การกระทำอื่น ๆ ทั้งหมดใช้เวลาเพิ่มอัตราการติดเชื้อซึ่งจะไม่ทำให้ฉันเจ็บเพราะฉันไม่มีเชื้อเหลืออยู่

#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 กลัวผู้คนทางออกของเขาต่อการแพร่ระบาดคือการแยกประชากรรักษาคนที่เขาสามารถทำได้และแยกพวกเขาออกจากกันเมื่อเขาทำไม่ได้ เขาไม่ได้สนใจเรื่องไร้สาระของสงครามครั้งนี้เลยเขาแค่พยายามทำให้ประชาชนของเขายังมีชีวิตอยู่

เปิดใช้งาน XenoBot อย่างเช่น:

node xenobot.js [data]

รหัส:

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

นักยุทธศาสตร์หลาม

ธ ปทนี้เป็นจริงๆร้ายแรงเกี่ยวกับการมีชีวิตรอด เขาวิเคราะห์กลยุทธ์ที่เป็นไปได้และหาวิธีการชนะของเขาเอง ซึ่งตอนนี้เขากำลังบันทึกความคิดเห็นของแหล่งข่าวเพราะเขาเป็นคนดีและต้องการให้ผู้อื่นมีชีวิตรอดด้วย

python strategist.pyเรียกว่ามี

import sys
import random
import math


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

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

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

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

        print(output)


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


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


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

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


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


if __name__ == "__main__":
    main()

2

OpenAndClose

เริ่มเกมด้วยการเปิดพรมแดนแล้วปล่อยให้คนป่วยทั้งหมดมา หลังจากเรามีประชากรจำนวนมากป่วย (รอบ 30) ปิดพรมแดนและทำงานเพื่อรักษาคนป่วย

#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

Python บ็อตอีกสองตัว

อิสราเอล

มันคล้ายกับ Mooch แต่อาจไม่ค่อยดีเท่า Mooch ยกเว้นในบางโอกาสที่มันดีกว่า:

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]

สภากาชาด

ประเภทของผู้ชอบความสงบยกเว้นพยายามที่จะป้องกันไม่ให้คนของตัวเองตาย ล้มเหลวอย่างน่าสังเวช แต่สิ่งนี้ก็เป็นเรื่องดีที่ได้มีเพื่อนเล่นบนสนามอีกคน

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

สม็อก (Python)

ฉันเป็นไฟ ฉันตายแล้ว

สม็อกสร้างความตายให้มากที่สุดเท่าที่จะทำได้

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

หากคุณพยายามตีกอล์ฟหลายภาษาไฟล์ที่ว่างจะสั้นลงและทำสิ่งที่ผู้เฝ้าดูทำ (และเช่นเดียวกับที่มันเกิดขึ้นสิ่งที่ PassiveBot ทำ - ทั้งสองประพฤติเหมือนกัน) เพราะล่ามใช้แทน NNN สำหรับ การตอบสนองความยาว 0
quintopia

@quintopia ฉันไม่ได้พยายามเพิ่งรู้เมื่อฉันพิมพ์ว่ามันทำงานได้อย่างสะดวกในฐานะคนหลายภาษา แต่ฉันไม่ได้รู้ว่า PassiveBot ทำอะไรดังนั้นฉันแค่ลบ Watcher (ไม่มีจุดที่จะมีสองอันเหมือนกัน)
SnoringFrog

2

ลบการติดเชื้อ (Python)

แม้จะมีตรรกะแบบสุ่มฉันรักมันเป็นเรื่องยากสำหรับนี้เพื่อกลับอะไร แต่ Q และซี (มาตรการป้องกันไม่เคยดูเหมือนว่าเป็นประโยชน์) โอ้ดี อาจยืมบางส่วนของมันเพื่อบอทอื่น แต่ทิ้งไว้ในกรณีที่มันช่วย

# 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 บ็อตนี้ได้รับการอัปเดตแล้ว
SnoringFrog

2

CureThenQuarantine, Java

รัฐได้ให้ความสำคัญกับนโยบายในการรักษาผู้โชคดีเพียงไม่กี่คนแล้วทำการกักตัวคนที่เหลือจากการติดเชื้อ เมื่อประชากรที่ติดเชื้อลดลงแล้วให้ความสำคัญกับการลดอัตราท้องถิ่นและช่วยลดอัตราโลก

เส้นขอบถูกปิดเพื่อให้แน่ใจว่าไม่มีการโยกย้ายที่ติดเชื้อเข้าสู่รัฐ

ฉันเพิ่งทดสอบบอทกับจาวาและบ็อตของไพ ธ อน ... ดูเหมือนว่าจะเก็บมันไว้กับตัวเอง นอกจากนี้ดูเหมือนว่าบอทของฉันจะทำงานคล้ายกับ 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

นักวิจัย, Java

บอทนี้มุ่งเน้นการวิจัย หากจำนวนผู้ติดเชื้อต่ำกว่า 15 ก็จะพยายามรักษาพวกเขา ถ้ามันสูงกว่านั้นก็เลือกโซลูชั่นที่มีประสิทธิภาพมากขึ้น

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

1
ภาษา Java ฉันเข้าใจหรือไม่
แมว

2

Piecemeal, Java

จากบ็อตก่อนหน้าของฉัน (CureThenQuarantine) ฉันพบว่าด้วยบอทที่ก้าวร้าวในการเล่นไม่มีความจำเป็นในการกักกันเนื่องจากผู้ติดเชื้อจะตายอย่างรวดเร็วดังนั้นบอทนี้จะรักษาการติดเชื้อ 10 เทิร์นละครั้ง (ไม่ว่ามาจากการอพยพหรือ จากการติดเชื้อจากประชากรที่มีสุขภาพดี) จากนั้นจะใช้การกระทำที่เหลือเพื่อให้แน่ใจว่าประชากรที่มีสุขภาพแข็งแรงยังคงมีความเชื่อมั่นต่อการเกิดเพื่อเพิ่มจำนวนประชากรที่มีสุขภาพดี

เส้นขอบถูกปิดเพื่อให้แน่ใจว่าไม่มีการโยกย้ายที่ติดเชื้อเข้าสู่รัฐ

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;
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.